一、創建一個服務
1. 查看創建服務命令
[root@localhost ~]# docker service --help Usage: docker service COMMAND Manage services Commands: create Create a new service # 創建新服務 inspect Display detailed information on one or more services # 檢查顯示一個或多個服務的詳細信息 logs Fetch the logs of a service or task # 日志獲取服務或任務的日志 ls List services # ls列表服務 ps List the tasks of one or more services # ps列出一個或多個服務的任務 rm Remove one or more services # rm刪除一個或多個服務 rollback Revert changes to a service's configuration # 回滾還原對服務配置的更改 scale Scale one or multiple replicated services # 擴展一個或多個復制服務 update Update a service # 更新服務 Run 'docker service COMMAND --help' for more information on a command.
[root@localhost ~]# docker service create --help Usage: docker service create [OPTIONS] IMAGE [COMMAND] [ARG...] # 用法:docker 服務 創建[選項]圖像[命令][參數…] Create a new service Options:
-p, --publish port Publish a port as a node port # 將端口發布為節點端口
-u, --user string Username or UID (format: <name|uid>[:<group|gid>]) # 指定用戶名
--with-registry-auth Send registry authentication details to swarm agents
-w, --workdir string Working directory inside the container #指定容器內工作目錄
2. 創建一個服務
創建的swarm服務啟動命令和docker run 差不多
[root@localhost ~]# docker service create -p 8081:80 --name my-nginx nginx ubq32058ujwjrvlp8n7uqk22f overall progress: 1 out of 1 tasks 1/1: running [==================================================>] verify: Service converged
3. 查看啟動的docker服務及列表
[root@localhost ~]# docker service ps my-nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS fbtc2jpqfm0g my-nginx.1 nginx:latest localhost.localdomain Running Running 6 minutes ago
[root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ubq32058ujwj my-nginx replicated 1/1 nginx:latest *:8081->80/tcp
4. 查看啟動服務的詳細信息
[root@localhost ~]# docker service inspect my-nginx
[
{
"ID": "ubq32058ujwjrvlp8n7uqk22f",
"Version": {
"Index": 54
},
"CreatedAt": "2021-03-04T02:17:57.18776573Z",
"UpdatedAt": "2021-03-04T02:17:57.196303716Z",
"Spec": {
"Name": "my-nginx",
"Labels": {},
"TaskTemplate": {
"ContainerSpec": {
"Image": "nginx:latest@sha256:f3693fe50d5b1df1ecd315d54813a77afd56b0245a404055a946574deb6b34fc",
"Init": false,
"StopGracePeriod": 10000000000,
"DNSConfig": {},
"Isolation": "default"
},
"Resources": {
"Limits": {},
"Reservations": {}
},
"RestartPolicy": {
"Condition": "any",
"Delay": 5000000000,
"MaxAttempts": 0
},
"Placement": {
"Platforms": [
{
"Architecture": "amd64",
"OS": "linux"
},
{
"OS": "linux"
},
{
"OS": "linux"
},
{
"Architecture": "arm64",
"OS": "linux"
},
{
"Architecture": "386",
"OS": "linux"
},
{
"Architecture": "mips64le",
"OS": "linux"
},
{
"Architecture": "ppc64le",
"OS": "linux"
},
{
"Architecture": "s390x",
"OS": "linux"
}
]
},
"ForceUpdate": 0,
"Runtime": "container"
},
"Mode": {
"Replicated": {
"Replicas": 1 # 副本數量
}
},
"UpdateConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"RollbackConfig": {
"Parallelism": 1,
"FailureAction": "pause",
"Monitor": 5000000000,
"MaxFailureRatio": 0,
"Order": "stop-first"
},
"EndpointSpec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 8081,
"PublishMode": "ingress"
}
]
}
},
"Endpoint": {
"Spec": {
"Mode": "vip",
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 8081,
"PublishMode": "ingress"
}
]
},
"Ports": [
{
"Protocol": "tcp",
"TargetPort": 80,
"PublishedPort": 8081,
"PublishMode": "ingress"
}
],
"VirtualIPs": [
{
"NetworkID": "q24fl2e3wkw7zhdbu2a3trzpz",
"Addr": "10.0.0.8/24"
}
]
}
}
]
以上【Mode塊】顯示,我們的副本數現在只有一個,因為現在就啟動了一個服務
5. 查看服務在Swarm集群中哪台服務器上
Manager集群節點狀態查看:
[root@localhost ~]# docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION 2giiey95hal5fv2rgfmx3souu localhost.localdomain Down Active 20.10.5 65ohc7a6u28qlanpb2tygpd8k localhost.localdomain Ready Active 20.10.5 bbksnbwq0aq96ap3z6s1znk09 * localhost.localdomain Ready Active Reachable 20.10.5 ww14ifp4ki9gyw1gdhvzgbzff localhost.localdomain Ready Active Leader 20.10.5 xttcuf3iu5cvirxwwiydi3808 localhost.localdomain Ready Active Reachable 20.10.5
現在docker-1、docker-3、docker-4 為Manager主節點,docker-2 為worker從節點
docker-1 查看:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker-2 查看:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fcdfee3f3953 nginx:latest "/docker-entrypoint.…" 29 minutes ago Up 29 minutes 80/tcp my-nginx.1.fbtc2jpqfm0gld0g7itavm0r1
docker-3 查看:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
docker-4 查看:
[root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
以上顯示,服務已經被分配到了docker-2 worker從節點運行
二、彈性,動態擴縮容
方法一:
1. 集群服務擴縮容
[root@localhost ~]# docker service update --help Usage: docker service update [OPTIONS] SERVICE Update a service Options:
-q, --quiet Suppress progress output
--replicas uint Number of tasks # 副本的任務數量
--replicas-max-per-node uint Maximum number of tasks per node (default 0 = unlimited)
[root@localhost ~]# docker service update --replicas 5 my-nginx

可以根據環境需求,進行動態擴縮服務數量,比如:10,50,100,.......... 等
[root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ubq32058ujwj my-nginx replicated 5/5 nginx:latest *:8081->80/tcp
2. 再次查看my-nginx服務詳細信息
[root@localhost ~]# docker service inspect my-nginx
{
"ID": "ubq32058ujwjrvlp8n7uqk22f",
"Version": {
"Index": 61
},
# 此處副本數已經改成5
"Mode": {
"Replicated": {
"Replicas": 5
}
},
3. 4台服務器上服務分布
docker-1

docker-2

docker-3

docker-4

方法二:
1. 查看命令使用方法
[root@localhost ~]# docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service # 創建新服務
inspect Display detailed information on one or more services # 檢查顯示一個或多個服務的詳細信息
logs Fetch the logs of a service or task # 日志獲取服務或任務的日志
ls List services # ls列表服務
ps List the tasks of one or more services # ps列出一個或多個服務的任務
rm Remove one or more services # rm刪除一個或多個服務
rollback Revert changes to a service's configuration # 回滾還原對服務配置的更改
scale Scale one or multiple replicated services # 擴展一個或多個復制服務
update Update a service # 更新服務
Run 'docker service COMMAND --help' for more information on a command.
[root@localhost ~]# docker service scale --help Usage: docker service scale SERVICE=REPLICAS [SERVICE=REPLICAS...]
2. 動態擴縮容服務
將服務副本數量擴容到10個
[root@localhost ~]# docker service scale my-nginx=10
my-nginx scaled to 10
overall progress: 10 out of 10 tasks
1/10: running
2/10: running
3/10: running
4/10: running
5/10: running
6/10: running
7/10: running
8/10: running
9/10: running
10/10: running
verify: Service converged
3. 查看副本數量
[root@localhost ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS ubq32058ujwj my-nginx replicated 10/10 nginx:latest *:8081->80/tcp
4. 服務器上的副本分布
docker-1

docker-2

docker-3

docker-4

5. 如果想要減少副本數量,執行:
[root@localhost ~]# docker service scale my-nginx=5
my-nginx scaled to 5
overall progress: 5 out of 5 tasks
1/5: running
2/5: running
3/5: running
4/5: running
5/5: running
verify: Service converged
[root@localhost ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ubq32058ujwj my-nginx replicated 5/5 nginx:latest *:8081->80/tcp
結論:
以上兩種方式均可實現動態擴縮容,方法二更簡單一些!
三、 訪問測試




以上得知,服務,在集群任意節點中都可以訪問!服務可以有多個副本動態擴縮容實現高可用!
在客戶端看來,Swarm集群就是一個整體!
概念:
1. docker run 容器啟動!不具有擴縮容功能! 2. docker service 服務!具有擴縮容功能,滾動更新!
