部署使用
shell
# 重新初始化集群,都要操作
root@133:~# systemctl stop docker
root@133:~# rm -rf /var/lib/docker/swarm/
root@133:~# docker swarm init --advertise-addr 10.1.0.133 --default-addr-pool 192.20.0.0/16
root@133:~# docker swarm join-token manager
docker swarm join --token SWMTKN-1-54wnqxi04uwboi3h 10.1.0.133:2377
root@133:~# docker network create -d overlay --subnet=192.20.100.0/24 --attachable my_external_network
root@133:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
zbag3oxp2jlkv7f8xdintn7kr * 133 Ready Active Leader 27.5.1
vglj81ajcdco23d3995rgrm7t 134 Ready Active Reachable 27.5.1
使用yaml部署
创建时,服务名生成格式 {默认stack名}_{service名}
shell
root@133:~# cat nginx1.yaml
services:
app:
image: nginx
deploy:
replicas: 2
resources:
limits:
cpus: '0.5'
memory: 512M
update_config:
parallelism: 1
delay: 10s
failure_action: pause
order: start-first
ports:
- "18080:80"
networks:
- my_external_network
networks:
my_external_network:
external: true
root@133:~# docker stack deploy -d -c nginx1.yaml web1
Creating service web1_app
root@133:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
gwkltslf7f3b web1_app replicated 2/2 nginx:latest *:18080->80/tcp
root@133:~# docker service ps web1_app
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
31o7nridvy4a web1_app.1 nginx:latest 134 Running Running about a minute ago
d4ixryj367fr web1_app.2 nginx:latest 135 Running Running 2 minutes ago
yaml示例2
shell
root@133:~# cat nginx2.yaml
services:
app:
image: nginx
ports:
- "28080:80"
volumes:
- /mnt/test1:/usr/share/nginx/html
environment:
REGISTRY_AUTH: swr.cn-south-1.myhuaweicloud.com
extra_hosts:
- "www.byd.com:10.1.0.133"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m
timeout: 10s
retries: 3
start_period: 40s
deploy:
replicas: 2
resources:
limits:
cpus: '0.5'
memory: 512M
update_config:
parallelism: 1
delay: 10s
failure_action: pause
order: start-first
networks:
- my_external_network
networks:
my_external_network:
external: true
root@133:~# docker service rm web2_app
web2_app
root@133:~# docker stack deploy -d -c nginx2.yaml web2
Creating service web2_app
# 创建时,服务名生成格式 {默认stack名}_{service名}
oot@133:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
66lf32uudp9a web2_app replicated 0/2 nginx:latest *:28080->80/tcp
多次启动失败后,容器会自动更换节点
shell
# 因为134为创建 /mnt/test1/目录,挂载报错,不会自动创建
root@133:~# docker service ps web2_app
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
03p2wi6zg0c3 web2_app.1 nginx:latest 134 Ready Rejected 2 seconds ago "invalid mount config for type..."
9kowjgozomx5 \_ web2_app.1 nginx:latest 134 Shutdown Rejected 4 seconds ago "invalid mount config for type..."
3trn5wt9jqh3 \_ web2_app.1 nginx:latest 134 Shutdown Rejected 8 seconds ago "invalid mount config for type..."
trswjoslzxa4 web2_app.2 nginx:latest 133 Running Starting 8 seconds ago
# 多次启动失败后,容器会更换节点,都分配到 133上
root@133:~# docker service ps web2_app
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
mgvsz863nfv8 web2_app.1 nginx:latest 133 Running Running 38 seconds ago
txs2hqws5sbn \_ web2_app.1 nginx:latest 134 Shutdown Rejected 58 seconds ago "invalid mount config for type..."
o55vll7x0jss \_ web2_app.1 nginx:latest 134 Shutdown Rejected about a minute ago "invalid mount config for type..."
03p2wi6zg0c3 \_ web2_app.1 nginx:latest 134 Shutdown Rejected about a minute ago "invalid mount config for type..."
9kowjgozomx5 \_ web2_app.1 nginx:latest 134 Shutdown Rejected about a minute ago "invalid mount config for type..."
trswjoslzxa4 web2_app.2 nginx:latest 133 Running Running 59 seconds ago
网络访问
shell
root@133:~# docker ps |grep 28080 #不显示的
root@133:~# curl localhost:28080
hello test1
root@133:~# curl 10.1.0.134:28080
hello test1
历史版本保存与清理
shell
# 更新镜像,旧的镜像会以Exited存在,这里测试,默认保留了五个,暂时没查到保留的参数
root@133:~# docker service update --image nginx:1.23 web2_app && sleep 60 &&docker service update --image nginx:1.26 web2_app && sleep 60 &&docker service update --image nginx web2_app && sleep 60 &&docker service update --image nginx:1.23 web2_app && sleep 60 &&docker service update --image nginx:1.26 web2_app
root@133:~# docker service ps web2_app
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
1dnb40jxzky6 web2_app.1 nginx:1.26 134 Running Running 9 seconds ago
93hoteglj1sm \_ web2_app.1 nginx:1.23 133 Shutdown Shutdown 5 seconds ago
5hscgdeil95q \_ web2_app.1 nginx:latest 134 Shutdown Shutdown about a minute ago
vj8kj75hzam7 \_ web2_app.1 nginx:1.26 133 Shutdown Shutdown 3 minutes ago
7w14gdzd5b4b \_ web2_app.1 nginx:1.23 134 Shutdown Shutdown 4 minutes ago
jxqxp01d7b2y web2_app.2 nginx:1.26 133 Running Running 13 seconds ago
ald0fmrvggz2 \_ web2_app.2 nginx:1.23 134 Shutdown Shutdown 9 seconds ago
maneh2cnvxl7 \_ web2_app.2 nginx:latest 133 Shutdown Shutdown about a minute ago
ue9g2zqqswcu \_ web2_app.2 nginx:1.26 134 Shutdown Shutdown 3 minutes ago
vvj1m67dzlvj \_ web2_app.2 nginx:1.23 133 Shutdown Shutdown 4 minutes ago
# 存在5个 Exited容器,多出的会自动清理
root@133:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c238cad11bf4 nginx:1.26 "/docker-entrypoint...." 32 seconds ago Up 31 seconds (healthy) 80/tcp web2_app.2.jxqxp01d7b2y6vvb0cw9rjxvt
939ee7483272 nginx:1.23 "/docker-entrypoint...." 2 minutes ago Exited (0) 15 seconds ago web2_app.1.93hoteglj1sm7dvzpfbbg3a2z
650bde520b70 nginx:latest "/docker-entrypoint...." 3 minutes ago Exited (0) About a minute ago web2_app.2.maneh2cnvxl7iwtx4gmfbbp7a
850814416f72 nginx:1.26 "/docker-entrypoint...." 5 minutes ago Exited (0) 3 minutes ago web2_app.1.vj8kj75hzam7w7eo0xgs98e02
fb40fba69ecf nginx:1.23 "/docker-entrypoint...." 6 minutes ago Exited (0) 5 minutes ago web2_app.2.vvj1m67dzlvjn6nix7v5kt59t
# 直接删除stack会清理相关的 Exited容器
root@133:~# docker service rm web2_app
web2_app
root@133:~# docker ps -a |grep web2_app # 会自动删除
shell
## 拉取私有镜像 --with-registry-auth
root@133:~# docker service update --image my.docker.com/ubuntu:22.04ssh --with-registry-auth web2_app
portainer-ce管理工具使用
shell
portainer/portainer-ce:2.33.2
portainer/agent:2.33.2
root@133:~# docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v ./portainer_data:/data portainer/portainer-ce:2.33.2
docker service create \
--name portainer_agent \
--network my_external_network \
-p 9001:9001/tcp \
--mode global \
--constraint 'node.platform.os == linux' \
--mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
--mount type=bind,src=//var/lib/docker/volumes,dst=/var/lib/docker/volumes \
--mount type=bind,src=//,dst=/host \
portainer/agent:2.33.2
在Environment-related选项 add Environment -->docker swarm --start wizard--> agent/api-2375访问,也可portainer/agent。
添加多个2375时,多swarm集群,在home页可以看到多个swarm集群