前提条件:
- Docker engine 1.12或以上版本
- 网络:
TCP port 2377 for cluster management communications
TCP and UDP port 7946 for communication among nodes
TCP and UDP port 4789 for overlay network traffic
Create swarm
--advertise-addr 为可选,如不指定,默认选择eth0网卡的IP。指定时,不支持指定浮动IP。
输出的信息中,列出了添加work节点的命令和manager节点的命令。
root@docker-1:~# docker swarm init --advertise-addr 192.168.100.23
Swarm initialized: current node (0bw30fkeiredi0fg1pxg710ld) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2hayq3edoqv3lc5chpw23e76r8qp67ctx13dcepghdzu9jgngy-0ji06x1fy8pfunlxdy1p2wfm7 \
192.168.100.23:2377
To add a manager to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2hayq3edoqv3lc5chpw23e76r8qp67ctx13dcepghdzu9jgngy-00o8m54kldov9bd24mi2dt8gu \
192.168.100.23:2377
root@docker-1:~#
添加后,可通过以下命令查看节点信息:
root@docker-1:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
0bw30fkeiredi0fg1pxg710ld * docker-1 Ready Active Leader
添加节点
执行创建swarm步骤中自动生成的命令去添加节点。如忘记该命令,可通过以下命令查询:
root@docker-1:~# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-2hayq3edoqv3lc5chpw23e76r8qp67ctx13dcepghdzu9jgngy-0ji06x1fy8pfunlxdy1p2wfm7 \
192.168.100.23:2377
修改对应的token信息
root@docker-1:~# docker swarm join-token --rotate worker
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-42vudaylbg4ma3m5u22krw3ivd1rnbc7kryo3frerxo43jdjdm-2fs6gv0me0t158b0ybt0e6fwf \
192.168.100.23:2377
添加节点:
root@docker-2:~# docker swarm join \
> --token SWMTKN-1-2hayq3edoqv3lc5chpw23e76r8qp67ctx13dcepghdzu9jgngy-0ji06x1fy8pfunlxdy1p2wfm7 \
> 192.168.100.23:2377
This node joined a swarm as a worker.
节点的升降级
docker node promote node-3 node-2 --将worker升级为manager节点
docker node demote node-3 node-2 -- 将manager节点降级为worker节点
在swarm上部署服务
root@docker-1:~# docker service create --replicas 1 --name helloworld alpine ping www.baidu.com
5ntljnr8mqu94hvdicnqbsxmb
- docker service create 命令创建服务
- --name 指定service 的名字为helloworld
- --replicas指定运行容器的个数
查看服务运行情况:
root@docker-1:~# docker service ls
ID NAME REPLICAS IMAGE COMMAND
5ntljnr8mqu9 helloword 1/1 alpine ping www.baidu.com
检查集群上的服务
root@docker-1:~# docker service inspect --pretty helloword
ID: 5ntljnr8mqu94hvdicnqbsxmb
Name: helloword
Mode: Replicated
Replicas: 1
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
ContainerSpec:
Image: alpine
Args: ping www.baidu.com
Resources:
查看哪些节点运行服务
root@docker-1:~# docker service ps helloword
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR
5pujmicjjp25mm1w26m3yz1vk helloword.1 alpine docker-1 Running Running 33 minutes ago
伸缩service的数量
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
调整helloworld的数量:
root@docker-1:~# docker service scale helloword=5
helloword scaled to 5
从swarm中删除service
root@docker-1:~# docker service rm helloword
helloword
滚动更新服务
创建一个redis服务
$ docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
0u6a4s31ybk7yw2wyvtikmu50
--update-delay : 设置更新的时间间隔,seconds Ts, minutes Tm, or hours Th. So 10m30s indicates a 10 minute 30 second delay.
--update-parallelism : 设置每次更新的容器数
--update-failure-action : 设置更新失败之后的操作
--update-delay、--update-parallelism 、--update-failure-action参数也可以在 update时指定。
$ docker service update --image redis:3.0.7 redis
redis
更新时的步骤:
- 停止第一个容器
- 启动一个容器
- 如果更新容器返回running,等待设置的时间间隔的时间后,停止下一个容器
- 如果更新失败,暂停更新
Drain节点
node设置为drain之后,节点上的容器会自动停止,然后在其他的可用节点上创建新容器。
docker node update --availability drain worker1
worker1
$ docker node update --availability active worker1
worker1
Service相关命令
基本参数
docker service create --name helloworld \
--env MYVAR=myvalue \
--workdir /tmp \
--user my_user \
--replicas 3 \
--publish 8080:80 \
--network my-multi-host-network \
--update-delay 10s \
--update-parallelism 2 \
--update-failure-action continue \
alpine ping docker.com
volume相关
# type=volume,将容器目录映射到卷存储上。docker volume create创建出的卷,可用在此处。
docker service create \
--mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=<DRIVER>,volume-opt=<KEY0>=<VALUE0>,volume-opt=<KEY1>=<VALUE1>
--name myservice \
<IMAGE>
# type=bind,将容器目录直接映射在宿主机
docker service create \
--mount type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH> \
--name myservice \
<IMAGE>