2023跟我一起成为docker大牛:swarm 教程:部署篇「上」
Swarm模式是用于管理一组Docker守护程序的高级功能。
ip规划:
Manager: Manager: 172.16.95.137
Node1: 172.16.95.138
Node2: 172.16.95.139
1 、manager节点初始化swarm
docker swarm init --advertise-addr 172.16.95.137
输出:
docker swarm init --advertise-addr 172.16.95.137
Swarm initialized: current node (57mvxsdn9qg2tq6aiz17et7ot) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-544xekdg657cd57fecr4g43uxk7t5pjkvxkkcbitjnygxc0nyh-0f4o0ujh0vz4nm5gxcjh3y
wi3 172.16.95.137:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
2 、运行docker info
以查看集群的当前状态:
root@master:~# docker info
Client: Docker Engine - Community
Version: 24.0.5
Context: default
Debug Mode: false
Plugins:
buildx: Docker Buildx (Docker Inc.)
Version: v0.11.2
Path: /usr/libexec/docker/cli-plugins/docker-buildx
compose: Docker Compose (Docker Inc.)
Version: v2.20.2
Path: /usr/libexec/docker/cli-plugins/docker-compose
Server:
Containers: 1
Running: 0
Paused: 0
Stopped: 1
Images: 1
Server Version: 24.0.5
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Using metacopy: false
Native Overlay Diff: true
userxattr: false
Logging Driver: json-file 服务器托管网
Cgroup Driver: systemd
Cgroup Version: 2
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
NodeID: 57mvxsdn9qg2tq6aiz17et7ot
Is Manager: true
ClusterID: qonn6p9e99zv95ekej78u66e0
Managers: 1
Nodes: 1
Default Address Pool: 10.0.0.0/8
SubnetSize: 24
Data Path Port: 4789
Orchestration:
Task History Retention Limit: 5
Raft:
Snapshot Interval: 10000
Number of Old Snapshots to Retain: 0
Heartbeat Tick: 1
Election Tick: 10
Dispatcher:
Heartbeat Period: 5 seconds
CA Configuration:
Expiry Duration: 3 months
Force Rotate: 0
Autolock Managers: false
Root Rotation In Progress: false
Node Address: 172.16.95.137
Manager Addresses:
172.16.95.137:2377
Runtimes: io.containerd.runc.v2 runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
runc version: v1.1.7-0-g860f061
init version: de40ad0
Security Options:
apparmor
seccomp
Profile: builtin
cgroupns
Kernel Version: 5.15.0-78-generic
Operating System: Ubuntu 22.04.2 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.787GiB
Name: master
ID: cf23034e-99d6-4e37-a1cd-b27f39c0ed2e
Docker Root Dir: /var/lib/docker
Debug Mode: false
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false
3 、查看节点状态
root@master:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
57mvxsdn9qg2tq6aiz17et7ot * master Ready Active Leader 24.0.5
将节点添加到swarm集群中
使用管理器节点创建群后,我们就可以添加工作节点了。
- 打开一个终端,然后ssh进入要运行工作节点的机器。本教程使用名称
master
。 - 在
master
节点运行docker swarm init
输出生成的命令,在其他机器上执行一下命令并创建工作节点:
root@node1:~# docker swarm join --token SWMTKN-1-544xekdg657cd57fecr4g43uxk7t5pjkvxkkcbitjnygxc0nyh-0f4o0ujh0vz4nm5gxcjh3ywi3 172.16.95.137:2377
This node joined a swarm as a master.
如果我们忘记了命令, 则可以在 master
节点执行以下命令来查看相关命令:
root@master:~# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-544xekdg657cd57fecr4g43uxk7t5pjkvxkkcbitjnygxc0nyh-0f4o0ujh0vz4nm5gxcjh3y
wi3 172.16.95.137:2377
3 、在 node2 节点重复执行 node1 上面的命令
4、在master节点运行的机器,并运行docker node ls
命令以查看工作节点:
root@master:~# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
57mvxsdn9qg2tq6aiz17et7ot * master Ready Active Leader 24.0.5
lqv1e6oa2hle33ff4xgxfslz3 node1 Ready Active 24.0.5
wwb5rc9nypj1e98wwr5qw99ye node2 Ready Active 24.0.5
MANAGER
列标识了集群中的管理器节点。此列node1
和node2
中的空状态标识为worker节点。
将服务部署到swarm中
创建集群后,我们可以将服务部署到集群中。
- 打开一个终端,然后ssh进入运行管理器节点的机器。使用名为
master
的机器。 - 运行以下命令:
docker service create --replicas 1 --name helloworld alpine ping docker.com服务器托管网
-
docker service create
命令创建服务。 -
--name
标志为helloworld
服务命名。 -
--replicas
标志指定了1个运行实例的所需状态。 - 参数
alpine ping docker.com
将服务定义为执行命令ping docker.com
的Alpine Linux容器。
- 运行
docker service ls
以查看正在运行的服务列表:
检查集群上的服务
- 我们使用ssh进入运行master节点的机器。
- 运行
docker service inspect --pretty
,以易于阅读的格式显示有关服务的详细信息。
执行以下命令查看服务的详细信息
docker service inspect --pretty helloworld
如果需要输出 json 格式的内容,执行命令 docker service inspect helloworld
- 查看服务具体运行在那个节点,我们可以执行以下命令查看:helloworld 为我们要查看的服务名称
docker service ps helloworld
从上图中我们可一看到 服务 helloworld
运行在节点 master
的机器中, 而服务 helloword
运行在 node1 的节点中.
helloworld
的服务运行在master的节点上,说明 master 节点也可以像 node 节点一样执行任务.
- 服务
helloword
运行在node1
的节点上, 我们在node1
的机器上执行命令docker ps
root@node1:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3bbf47cf010 alpine:latest "ping docker.com" 14 minutes ago Up 14 minutes helloword.1.nw2qt760d0tupaqqyhodtz2ko
可以看到在 node1 的机器上正在运行 helloword
的服务容器。
扩大集群中服务部署的规模
创建好集群我们就可以使用Docker CLI来扩展服务中的容器数量。在服务中运行的容器被称为“任务”。
- 我们使用ssh进入master节点的机器。
- 运行以下命令以更改在群中运行的服务的所需状态:
将helloworld
服务扩展为 5 个
docker service scale helloworld=5
- 执行完成后我们查看服务具体运行在那个节点
docker service ps helloworld
可以看到,swarm 创建了 5 个新的任务,并扩展了总共 5 个的 docker 容器实例, 并分布在不同的节点上。
删除集群上运行的服务
如果我们部署的服务不需要了, 那么我们可以从集群中删除对应的服务。
1 、运行docker service rm helloworld
以删除helloworld服务。
执行完命令后我们在执行 docker service ls
查看服务,服务已经被我们删除了。
2、我们可以执行命令 docker service inspect helloworld
来查看服务的信息
从图中执行的命令可以看出服务已经彻底被删除了。
3、当删除服务的命令执行完成后,任务容器也需要几秒钟才能清理完成,我们可以在节点上执行 docker ps
查看容器是否存在。
服务的滚动更新
在工作中我们需要经常的将我们的应用程序的新版本更新,以替换原有的老的版本的应用程序。在 Docker 的 swarm 中我们如何实现应用程序的滚动更新呢?
1 、比如我们需要部署新的一个 redis 服务到我们的swarm服务集群中。 并以10秒的更新延迟配置swarm。为了更直观的操作, 我们先部署一个较老版本的redis:6.0-alpine
服务,执行以下命令部署:
docker service create --replicas 3 --name redis --update-delay 10s redis:6.0-alpine
我们看到服务已经部署成功了。我们执行 docker service ls
结果显示已经将服务发布在所有的节点上了。
root@master:~# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS e2b2aoag8kr0 redis replicated 3/3 redis:6.0-alpine root@master:~#
部署命令参数说明:
-
--replicas
: 表示我们部署的服务数量是几个,--replicas 3
表示部署 3 个 -
--update-delay
: 表示任务更新的时间延迟,我们可以将时间设置为Ts
,Tm
,,Th
,比如:5m10s
表示延迟 5 分钟 10 秒。 -
--update-parallelism
表示在更新时候的最大任务数量, 默认情况下调度程序一次只更新一个任务。
默认情况下,当单个任务的更新返回RUNNING
状态时,调度程序会安排另一个任务进行更新,直到所有任务更新。如果在更新期间的任何时候任务返回FAILED
,调度程序将暂停更新。我们可以使用docker service create
或docker service update
的--update-failure-action
标志来控制行为。
2、我们查看部署的 redis 服务情况:
docker service inspect --pretty redis
3 、现在我将已经部署好的 redis 服务更新到一个较新的版本 redis:6.0.20-alpine
,管理器根据UpdateConfig
策略将更新应用于节点:
执行更新命令:docker service update --image redis:6.0.20-alpine redis
root@master:~# docker service update --image redis:6.0.20-alpine redis
redis
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
我们在来查看下服务详细信息:
image 已经变成了 redis:6.0.20-alpine
, 已经更新成功.
我们在节点查看容器信息:
root@node2:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f036280bde79 redis:6.0.20-alpine "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 6379/tcp redis.1.
01wlu8r8z0jxmb4c2s399a6qo
同样,容器的镜像已经变成了 redis:6.0.20-alpine
调度程序更新说明:
- 停止第一个任务。
- 为停止的任务安排更新。
- 启动更新任务的容器。
- 如果任务的更新返回
RUNNING
,请等待指定的延迟期,然后开始下一个任务。 - 如果在更新期间的任何时候,任务返回
FAILED
,请暂停更新。
4、 如果我们需要重启服务,可以执行重启服务的命令:
docker service update redis
root@master:~# docker service update redis
redis
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
5、查看更新的信息:docker service ps redis
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
背景:公司有专门的k8s运维,做的项目是酒店自助机,基本业务:自助机前端有刷身份证查订单/现场预定/退房/办理入住/生成房卡等功能,后端对接不同的酒店系统以及公安系统,业务办理需要公安和原生酒店系统都要对接。 问题描述:如家酒店有两套环境,私有化环境和公网环境…