docker swarm
有错或者有更好的见解欢迎指出。本人还是学生,在后续,深入理解后,还会继续更新这篇文章。
对于网络底层的理解,这块是个难点,这篇文章还没有作讨论。
搭建 docker swarm集群
docker swarm init --advertise-addr=ip
# --advertise-addr指定广播地址。即用来与其他节点通信的IP,默认端口为2377.如果主机上有多个网卡,需要指定。
在leader上查看token
docker swarm join-token manager
docker swarm join-token worker
加入集群成为manager/worker
docker swarm join --token SWMTKN-1-3edcx30eosroclc3hi4jmay8ngfqplf573jfsj6zf9a663axmx-9kngyj7dxaov080nsl7ymmpog 192.168.201.145:2377
# 如果主机有多个网卡,则还是需要指定广播地址
docker swarm join --advertise-addr=IP \
--token SWMTKN-1-3edcx30eosroclc3hi4jmay8ngfqplf573jfsj6zf9a663axmx-9kngyj7dxaov080nsl7ymmpog \
192.168.201.145:2377
# 查看各个节点
docker node ls
集群的解散
分为两步操作,首先在想要退出的节点上离开集群,然后在manager节点上删除退出节点的信息(不删除,则无法再次加入)。
# 系欸但退出集群,manager节点退出时,需要加--force
docker swarm leave [--force]
# 退出后需在manager节点删除退出的节点
docker node rm 退出节点的主机名
节点管理
查看集群节点
docker node ls
节点升级和降级
# 升级为manager
docker node promote 主机名
# 降级为worker
docker node demote 主机名
节点下线
节点暂停接受任务
docker node update --availability drain 主机名
节点上线
节点重新接受任务
docker node update --availability active 主机名
服务管理
容器的创建:
docker service create [-d --name ...]
水平扩展/弹性伸缩
即如何更改副本的数量
# 方式一
docker service scale servicename=n
# 方式二
docker service update --replicas 新副本数 服务名
滚动更新
滚动更新即在不停止服务的情况下更新服务,也成为灰度更新。
docker service update --image 基础镜像 --update-delay 时间间隔 --update-parallelism 定义并行更新的最大数量 服务名
Visualizer可视化工具
Visualizer非常直观地显示了Swarm集群中,服务器的状态和服务器上面运行容器的状态。
# 在docker swarm中运行
docker service create \
--name=viz \
--publish=80:8080/tcp \
--constraint=node.role==manager \
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock \
dockersamples/visualizer
删除服务
docker service rm servicename
docker stack 部署
swarm堆栈的管理工具,可以解和docker-compose 实现多service应用程序的部署。
详细请看:https://docs.docker.com/compose/compose-file/deploy/#attributes
docker-compose.yml中有关swarm集群的属性
某个service:
deploy:
replicas: 2
mode: replicated(默认) | global
placement:
- "node.id==nodeid" #根据节点id
- "node.hostname==nodehostname" #根据节点主机名
restart_policy: #指定服务部署的重启策略
condition: none | on-failure #none不重启,on-failure为容器故障时重启
delay: 10s #尝试重启的时间间隔(默认5s)
max_attempts: 3 #最多的尝试次数(默认无限制)
说明: docker-compose up方式会默认忽略deploy部分
常用命令
docker stack deploy -c "yaml文件" stackname
docker stack ls
docker stack ps stackname
docker stack down/rm/remove stackname
实战–部署mysql+wordpress
docker-compose.yml文件:
version: '3.8'
services:
db:
image: mysql:5.7
container_name: mysql_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: wordpress
MYSQL_USER: chen
MYSQL_PASSWORD: root
volumes:
- db_data:/var/lib/mysql
networks:
- wp_network
wordpress:
image: wordpress:latest
container_name: wordpress
restart: always
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: chen
WORDPRESS_DB_PASSWORD: root
volumes:
- wordpress_data:/var/www/html
networks:
- wp_network
deploy:
replicas: 2
mode: replicated
volumes:
db_data:
wordpress_data:
networks:
wp_network:
docker stack deploy -c docker-compose.yml wordpress
访问本机80端口,成功