1. docker swarm基础
本周做了一点运维的工作,这里总结一下。
基本概念
-
swarm
集群工具,管理节点
-
node
docker节点,分成manager节点与worker节点
-
service
在node上可以运行service,每个服务可以有多个任务
-
task
具体的任务对应着container
-
overlay网络
docker swarm是建立在overlay网络之上的,其示意图如下:

这个示例中有2个service,其中myservice有2个task,client有一个task,它们共享mynet网络,在client上执行curl
命令。
- 在curl docker.com 与 curl myserice都会启动DNS查询
- docker内置的解析器拦截127.0.0.11上的DNS查询,将查询转发到docker引擎的DNS Server
- myserver解析为Virtual IP(VIP),该server在内部负载平衡到各个task上。
- docker.com在mynet中不存在,这个请求就被转发到外部默认的DNS server上。
docker安装
yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
docker集群搭建
# leaer节点上初始化
docker swarm init --advertise-addr XXX.XXX.XXX.XXX
# woker节点加入
docker swarm join --token WokerTokenXXXXXXX LeaderIPXXX.XXX.XXX.XXX:2377
# manager节点加入
docker swarm join --token ManagerTokenXXXXXX LeaderIPXXX.XXX.XXX.XXX:2377
# leader机器上查看加入的token
docker swarm join-token manager`及`docker swarm join-token worker
2. docker service
-
创建service
docker service create --name my_nginx -p 81:80 --replicas 4 nginx
-
查看service
docker service ls
-
查看具体service下的task
docker service ps my_nginx
-
更新service
docker service update --replicas 2 my_nginx
docker service update --image imageXXX:1.3.1 serviceNameXXX
update可以修改镜像、备份数等
-
扩缩service
docker service scale my_nginx=4
-
关闭service
关闭不移除的话使用--replicas = 0更好一些
docker service update --replicas 0 my_nginx
删除的话使用remove
docker service rm my_nginx
-
service帮助
docker service --help
3. docker stack
简介
docker stack是基于 docker swarm 来完成应用的部署,通过配置docker-compose.yml文件来控制deploy。这里的docker-compose.yml文件与docker compose使用的文件是通用的,主要多了deploy属性,双方差异的属性会忽略。
compose文件
-
在compose文件中定义应用,然后通过 docker stack deploy命令完成部署和管理。
-
docker-compose.yml
version: "3"
services:
nginx:
image: nignx
ports:
- 80:80
deploy:
mode: replicated # 每个node启动一个
replicas: 4
ssh-keygen -R 192.168.3.10
visualizer:
image: xxx
ports:
- "9001: 8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
yml文件中会忽略container_name
、build
、expose
等属性
命令
- docker stack deploy --with-registry-auth -c docker-compose.yml stack-demo
- docker stack deploy --with-registry-auth -c docker-compose1.yml -c docker-compose2.yml stack-demo
- docker stack ls
- docker stack ps stack-demo
- docker stack rm stack-demo
注意:
用贯了docker compose经常会用docker compose stop xxxService、docker compose up -d xxxService等针对compose文件中某个service的命令。很遗憾docker stack并没有这种设计,它不能直接针对compose文件中某个service进行操作。
4. 补充
-
docker swarm service的重启,参考:
docker service update --force service_name
-
docker deploy时强制拉取新镜像,参考
docker service update --force --image foobar:latest myservice
-
docker pull同名同tag的镜像
docker pull –disable-content-trust=false foobar:latest
-
docker镜像的判断,参考
结论:如果两个镜像的ImageID一样,那么这两个镜像一样,不管两个镜像在同一台主机上,或者不是同一台主机上。Digest并不能保证