github repository: https://github.com/azzinoths0...
$ docker swarm --help Usage: docker swarm COMMAND Manage Swarm Commands: ca Display and rotate the root CA init Initialize a swarm join Join a swarm as a node and/or manager join-token Manage join tokens leave Leave the swarm unlock Unlock swarm unlock-key Manage the unlock key update Update the swarm Run 'docker swarm COMMAND --help' for more information on a command.
建立swarm集群并启动manager:html
docker swarm init --listen-addr 192.168.99.200:2377 --advertise-addr 192.168.99.200
此时会输出加入swarm集群的方式:node
docker swarm join --token SWMTKN-1-0nbwp5l3wsrtvf1hhrzf7dxbabpvitzo2ssyjqhnymg7d2ypzr-b1v1t5lnabvr4ojw9xe7eugkk 192.168.99.200:2377
若是没有记住的话:python
docker swarm join-token worker
依旧会输出:git
docker swarm join --token SWMTKN-1-0nbwp5l3wsrtvf1hhrzf7dxbabpvitzo2ssyjqhnymg7d2ypzr-b1v1t5lnabvr4ojw9xe7eugkk 192.168.99.200:2377
在另外一台节点上执行github
docker swarm join --token SWMTKN-1-0nbwp5l3wsrtvf1hhrzf7dxbabpvitzo2ssyjqhnymg7d2ypzr-b1v1t5lnabvr4ojw9xe7eugkk 192.168.99.200:2377
运行Docker
的主机能够主动初始化一个Swarm
集群或者加入一个已存在的Swarm
集群,这样这个运行Docker
的主机就成为一个Swarm
集群的节点 (node
) 。web
$ docker node --help Usage: docker node COMMAND Manage Swarm nodes Commands: demote Demote one or more nodes from manager in the swarm inspect Display detailed information on one or more nodes ls List nodes in the swarm promote Promote one or more nodes to manager in the swarm ps List tasks running on one or more nodes, defaults to current node rm Remove one or more nodes from the swarm update Update a node Run 'docker node COMMAND --help' for more information on a command.
使用ls命令查看节点信息:redis
$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION v1oo73vt40hnjivnhnw78po4u * dameng-00 Ready Active Leader 18.09.8-ce yrz7drszt4hq5j8c8rbhoexqc dameng-01 Ready Active 18.09.8-ce
Stack能够说是升级版的Compose:sql
$ docker stack --help Usage: docker stack [OPTIONS] COMMAND Manage Docker stacks Options: --kubeconfig string Kubernetes config file --orchestrator string Orchestrator to use (swarm|kubernetes|all) Commands: deploy Deploy a new stack or update an existing stack ls List stacks ps List the tasks in the stack rm Remove one or more stacks services List the services in the stack
部署:docker
# compose: $ docker-compose -f CONFIG-YAML up # stack: $ docker stack deploy -c CONFIG-YAML STACK-NAME
查看:shell
# compose: $ docker-compose ps $ docker ps # stack: $ docker node ls $ docker stack ls $ docker service ls
终止:
# compose: $ docker-compose -f CONFIG-YAML down # stack: $ docker stack rm STACK-NAME
网络:
单机 vs 跨节点
注意: docker stack 默认使用的是swarm,但也是能够对接k8s的
$ docker service --help Usage: docker service COMMAND Manage services Commands: create Create a new service inspect Display detailed information on one or more services logs Fetch the logs of a service or task ls List services ps List the tasks of one or more services rm Remove one or more services rollback Revert changes to a service's configuration scale Scale one or multiple replicated services update Update a service Run 'docker service COMMAND --help' for more information on a command.
查看:
$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS oyiesfc3biiq myapp_myapp replicated 1/1 friendlyhello:v3 *:5000->5000/tcp xrk7kska1z76 myapp_redis replicated 1/1 redis:latest
扩容:
$ docker service scale myapp_myapp=2 ID NAME MODE REPLICAS IMAGE PORTS oyiesfc3biiq myapp_myapp replicated 2/2 friendlyhello:v3 *:5000->5000/tcp xrk7kska1z76 myapp_redis replicated 1/1 redis:latest
friendlyhello
咱们能够用Docker Machine
很快地建立一个虚拟的Docker主机,接下来咱们来建立2个新的Docker主机,并加入到集群中。
首先是一个管理节点,建立并经过ssh链接:
$ docker-machine create -d virtualbox manager $ docker-machine ssh manager
咱们能够看到:
而后,咱们用docker swarm init
从这个节点初始化一个Swarm
集群,若是这个Docker主机有多个IP(多个网卡),就要用--advertise-addr
指定一个:
$ docker swarm init --advertise-addr 192.168.99.107
咱们能够看到:
如今咱们的Manager
节点就是刚刚建立的集群的管理节点了,
记得复制一下它输出的添加工做节点的那句命令。
接下来咱们Manager
节点的~/try-it-out-4
里添加几个文件:
$ mkdir try-it-out-4 $ cd try-it-out-4 $ vi app.py $ vi Dockerfile $ vi docker-stack.yaml $ docker build -t friendlyhello .
from flask import Flask from redis import Redis, RedisError import os import socket # Connect to Redis redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2) app = Flask(__name__) @app.route("/") def hello(): try: visits = redis.incr("counter") except RedisError: visits = "<i>cannot connect to Redis, counter disabled</i>" html = "<h3>Hello {name}!</h3>" \ "<b>Hostname:</b> {hostname}<br/>" \ "<b>Visits:</b> {visits}" return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits) if __name__ == "__main__": app.run(host='0.0.0.0', port=5000)
FROM python:3.7-slim WORKDIR /app COPY . /app RUN pip install flask redis -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com EXPOSE 5000 ENV NAME World CMD ["python", "app.py"]
version: "3" services: myapp: image: friendlyhello container_name: myapp ports: - 5000:5000 environment: NAME: World redis: image: redis container_name: web
继续,咱们来建立一个工做节点:
首先回到主机:
$ exit
接着建立一个新的虚拟机worker
,并经过上面复制的那句命令加入到集群里:
$ docker-machine create -d virtualbox worker $ docker-machine ssh worker $ docker swarm join --token SWMTKN-1-3wd0vdozskitmpw5vofkjc9ie6251wuno21dmbugqk56pd97iv-eu9w5gkkmy7chvgcwt7j71iu4 192.168.99.107:2377
咱们能够看到:
咱们先回到manager
节点:
$ exit $ docker-machine ssh manager
而后使用docker stack deploy
部署服务,其中-c
参数指定docker-stack.yaml
文件:
$ docker stack deploy -c ~/try-it-out/docker-stack.yaml friendlyhello
部署完毕。
如今就能够经过集群中的任意一个节点的IP访问到这个flask
项目了:
postgresql
咱们继续用前一个Case的集群。
进入manager
节点,在try-it-out-5
里新建一个docker-stack.yaml
:
$ docker-machine ssh manager $ mkdir try-it-out-5 $ vi docker-stack.yaml
version: '3.1' services: db: image: postgres command: postgres -c 'shared_buffers=512MB' -c 'max_connections=2000' restart: always environment: POSTGRES_USER: dameng POSTGRES_PASSWORD: pythonic ports: - 5432:5432 volumes: - pgdata:/var/lib/postgresql/data adminer: image: adminer restart: always ports: - 8998:8080 volumes: pgdata:
而后部署:
$ docker stack deploy -c docker-stack.yaml postgresql
接着就能够从8998端口
访问GUI了: