文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Docker Swarm部署集群

2023-01-31 08:24

关注

一、Swarm简介

Swarm是Docker的一个编排工具,参考官网:https://docs.docker.com/engine/swarm/

Swarm 模式简介

 

 

如果你使用低于1.12.0版本的docker,可以使用独立模式的是swarm,但是建议使用最新版本

特性

 

 

滚动更新。增量跟新,可以自定义更新下个节点的时间间隔,如果有问题,可以会滚到上个版本。

 

本教程进行如下指导:

 

本教程使用docker命令行的方式交互

安装

安装环境要求

 

准备3台主机

 

 

环境说明

操作系统主机名ip地址docker版本
ubuntu-16.04.4-server-amd64manager1192.168.10.104Docker version 18.09.2
ubuntu-16.04.4-server-amd64work1192.168.10.108Docker version 18.09.2
ubuntu-16.04.4-server-amd64work2192.168.10.110Docker version 18.09.2

 

 

 

 

 

创建一个Swarm集群

完成上面的开始过程后,可以开始创建一个swarm集群。确保docker的后台应用已经在主机上运行了。

 

登陆到manager1上,如果使用docker-machine创建的主机,可以docker-machine ssh manager1

运行以下命令来创建一个新的swarm集群:

docker swarm init --advertise-addr <MANAGER1-IP>

MANAGER1-IP 表示管理节点

 

本教程中使用如下命令在manager1上创建swarm集群:

复制代码

root@manager1:~# docker swarm init --advertise-addr 192.168.10.104
Swarm initialized: current node (zmvmswnwv6jcvjt1tmq65zzkg) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4q7uby9b9vjrjryrvl9r7kgq23hx0y6nwmdt3b9kmxpfcn7vmu-97op3d7nkn8rp31e0boz0308w 192.168.10.104:2377
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

复制代码

 

1. 运行docker info来查看当前swarm集群的状态:

root@manager1:~# docker -v
Docker version 18.09.2, build 6247962
root@manager1:~# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 18.09.2
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
Swarm: active
 NodeID: zmvmswnwv6jcvjt1tmq65zzkg
 Is Manager: true
 ClusterID: 04doas9mydex8aq4vadh0b0go
 Managers: 1
 Nodes: 1
 Default Address Pool: 10.0.0.0/8  
 SubnetSize: 24
 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: 192.168.10.104
 Manager Addresses:
  192.168.10.104:2377
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9754871865f7fe2f4e74d43e2fc7ccd237edcbce
runc version: 09c8266bf2fcf9519a651b04ae54c967b9ab86ec
init version: v0.18.0 (expected: fec3683b971d9c3ef73f284f176672c44b448662)
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.0-116-generic
Operating System: Ubuntu 16.04.4 LTS
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 3.859GiB
Name: manager1
ID: 7N32:4Z4C:V5JN:L4I4:PR3K:KRN7:RR6M:MYR6:TBYG:EB5C:MDTA:CRTY
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: No swap limit support

运行docker node ls来查看节点信息

root@manager1:~# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
zmvmswnwv6jcvjt1tmq65zzkg *   manager1            Ready               Active              Leader              18.09.2

 

将节点加入到swarm集群中

一旦前面的创建swarm集群完成,你就可以加入工作节点了。

 

ssh到要加入集群的节点上,我们要加入worker1.

运行创建swarm集群时候产生的命令来将woker1加入到集群中:

root@work1:~# docker swarm join --token SWMTKN-1-4q7uby9b9vjrjryrvl9r7kgq23hx0y6nwmdt3b9kmxpfcn7vmu-97op3d7nkn8rp31e0boz0308w 192.168.10.104:2377
This node joined a swarm as a worker.

 

如果你找不到加入命令了,可以在管理节点运行下列命令找回加入命令:

root@manager1:~# docker swarm join-token worker
To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-4q7uby9b9vjrjryrvl9r7kgq23hx0y6nwmdt3b9kmxpfcn7vmu-97op3d7nkn8rp31e0boz0308w 192.168.10.104:2377

 

ssh到worker2
运行加入集群的命令来将worker2加入到集群:

root@worker2:~# docker swarm join --token SWMTKN-1-4q7uby9b9vjrjryrvl9r7kgq23hx0y6nwmdt3b9kmxpfcn7vmu-97op3d7nkn8rp31e0boz0308w 192.168.10.104:2377
This node joined a swarm as a worker.

 

ssh到manager1节点运行docker node ls命令来查看集群节点情况:

root@manager1:~# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
zmvmswnwv6jcvjt1tmq65zzkg *   manager1            Ready               Active              Leader              18.09.2
pi6ori8t1tuestb3hzhnn265v     work1               Ready               Active                                  18.09.2
ohivom1sdi1vz1oaer1b9wpl0     work2               Ready               Active                                  18.09.2

MANAGER列表明了集群中的管理节点。worker节点的空意味着它们是工作节点

 

在创建一个swarm集群后,就可以部署服务了。本教程中你也可以加入工作节点,但是不是必须的。

ssh到manager1节点
运行如下命令:

root@manager1:~# docker service create --replicas 1 --name helloworld alpine ping docker.com
qf8qydwuah1ym9xj5yxrxvhak
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged

 

运行docker service ls来查看运行的服务:

root@manager1:~# docker service lsID                  NAME                MODE                REPLICAS            IMAGE               PORTS
qf8qydwuah1y        helloworld          replicated          1/1                 alpine:latest

 

在你部署服务到Swarm集群上后,可以使用命令行来检查运行的服务

 

ssh到管理节点
运行命令docker service inspect --pretty <ID> 来查看优化显示的服务详情

root@manager1:~# docker service inspect --pretty qf8qydwuah1y

ID:        qf8qydwuah1ym9xj5yxrxvhak
Name:        helloworld
Service Mode:    Replicated
 Replicas:    1
Placement:
UpdateConfig:
 Parallelism:    1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:    1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:        alpine:latest@sha256:72c42ed48c3a2db31b7dafe17d275b634664a708d901ec9fd57b1529280f01fb
 Args:        ping docker.com 
 Init:        false
Resources:
Endpoint Mode:    vip

去掉--pretty选项将以json格式输出

 

运行docker service ps <ID> 将查看到哪些节点在运行该服务实例:

root@manager1:~# docker service ps qf8qydwuah1y
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
6u05btfqzo6j        helloworld.1        alpine:latest       manager1            Running             Running 5 minutes ago

 

在运行任务的节点上运行docker ps也能看到这个任务运行的容器。备注:目前运行在manager1上面

root@manager1:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
236ed4a13f7a        alpine:latest       "ping docker.com"   6 minutes ago       Up 6 minutes                            helloworld.1.6u05btfqzo6j4mo4uxm5543mi

 

一旦你在swarm集群中部署一个服务后,你就可以使用命令行来改变服务的实例个数。在服务中运行的容器称为“任务”

语法:

docker service scale <ID>=数量

 

ssh到manager1节点
运行以下命令来改变服务的期望实例数:

复制代码

root@manager1:~# docker service scale qf8qydwuah1y=3qf8qydwuah1y scaled to 3overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service converged

复制代码

 

运行以下命令来查看更新的任务列表:

root@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
qf8qydwuah1y        helloworld          replicated          3/3                 alpine:latest       
root@manager1:~# docker service ps qf8qydwuah1y
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
6u05btfqzo6j        helloworld.1        alpine:latest       manager1            Running             Running 10 minutes ago                           
m96ohuz60dw4        helloworld.2        alpine:latest       work1               Running             Running about a minute ago                       
9dldkulmsvwj        helloworld.3        alpine:latest       work2               Running             Running about a minute ago

可以看到这3个任务被分布到了集群中的不同节点

 

ssh到运行服务的主机work1上运行docker ps查看运行的容器:

root@work1:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
fafaa17a2c6a        alpine:latest       "ping docker.com"   2 minutes ago       Up 2 minutes                            helloworld.2.m96ohuz60dw4twr9np4kd8hz3

 

接下来删除应用


ssh到管理节点
运行docker service rm <ID>来删除服务:

复制代码

root@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
qf8qydwuah1y        helloworld          replicated          3/3                 alpine:latest       
root@manager1:~# docker service rm qf8qydwuah1yqf8qydwuah1y
root@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS

复制代码

 

运行docker service inspect <ID>会发现服务不存在了

root@manager1:~# docker service inspect qf8qydwuah1y
[]
Status: Error: no such service: qf8qydwuah1y, Code: 1

尽管服务不存在了,任务容器还需要几秒钟来清理,你可以在节点上docker ps查看任务什么时候被移除。

 

在前面的章节中,修改了实例数。本节使用etcd:2.0.5 镜像来部署服务,然后滚动升级到etcd:2.0.10

 

ssh到管理节点
部署etcd:2.0.5 服务,配置10s的更新间隔:

复制代码

root@manager1:~# docker service create --replicas 2 --name etcd --update-delay 10s elcolio/etcd:2.0.5

vh7w3mq5q0vc634w8x6m8r3m6
overall progress: 2 out of 2 tasks 
1/2: running   
2/2: running   
verify: Service converged

复制代码

 

 

查看etcd服务

root@manager1:~# docker service inspect --pretty etcd

ID:        vh7w3mq5q0vc634w8x6m8r3m6
Name:        etcd
Service Mode:    Replicated
 Replicas:    2
Placement:
UpdateConfig:
 Parallelism:    1
 Delay:        10s
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:    1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:        elcolio/etcd:2.0.5@sha256:fa9c5bdfd7164b75d944da3693d891e1fd18c7c757bbb5c00caa99aef312a428
 Init:        false
Resources:
Endpoint Mode:    vip

 

现在可以更新etcd的容器镜像了,语法:

docker service update --image <镜像名> <服务名>

 

运行以下命令,swarm的管理节点将会根据更新策略UpdateConfig来更新各个节点:

复制代码

root@manager1:~# docker service update --image elcolio/etcd:2.0.10 etcd
etcd
overall progress: 2 out of 2 tasks 
1/2: running   
2/2: running   
verify: Service converged

复制代码

调度器依照以下步骤来滚动更新:

 

运行命令docker service inspect --pretty etcd来查看新镜像的期望状态,可以看到显示了UpdateStatus完成。

root@manager1:~# docker service inspect --pretty etcd

ID:        vh7w3mq5q0vc634w8x6m8r3m6
Name:        etcd
Service Mode:    Replicated
 Replicas:    2
UpdateStatus:
 State:        completed
 Started:    2 minutes ago
 Completed:    About a minute ago
 Message:    update completed
Placement:
UpdateConfig:
 Parallelism:    1
 Delay:        10s
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Update order:      stop-first
RollbackConfig:
 Parallelism:    1
 On failure:    pause
 Monitoring Period: 5s
 Max failure ratio: 0
 Rollback order:    stop-first
ContainerSpec:
 Image:        elcolio/etcd:2.0.10@sha256:9a2e9a6ad26ddd87204b248c38d18b397881fc16283e4ac4ed5bfbf2ce03fa4c
 Init:        false
Resources:
Endpoint Mode:    vip

 

如果中间有升级失败的,则会显示如下信息:

复制代码

$ docker service inspect --pretty etcd

ID:             0u6a4s31ybk7yw2wyvtikmu50
Name:           redis
...snip...
Update status:
 State:      paused
 Started:    11 seconds ago
 Message:    update paused due to failure or early termination of task 9p7ith557h8ndf0ui9s0q951b
...snip...

复制代码

 

运行docker service ps <服务名>来查看本次滚动更新的过程:

复制代码

root@manager1:~# docker service ps etcd
ID                  NAME                IMAGE                 NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
nzwtsi4p8stw        etcd.1              elcolio/etcd:2.0.10   work1               Running             Running 3 minutes ago                        
lom9z7y8rlps         \_ etcd.1          elcolio/etcd:2.0.5    work1               Shutdown            Shutdown 3 minutes ago                       
8h8xjzyhlq1a        etcd.2              elcolio/etcd:2.0.10   manager1            Running             Running 3 minutes ago                        
6hpxbv34jnfz         \_ etcd.2          elcolio/etcd:2.0.5    manager1            Shutdown            Shutdown 3 minutes ago

复制代码

 

注意升级后老的容器只是停止了,并没有删除

复制代码

root@manager1:~# docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS                        PORTS                               NAMES
e905f60e2ec3        elcolio/etcd:2.0.10   "/bin/run.sh"            4 minutes ago       Up 4 minutes                  2379-2380/tcp, 4001/tcp, 7001/tcp   etcd.2.8h8xjzyhlq1a7o5wu5tfqq17z
13886eb8ea94        elcolio/etcd:2.0.5    "/bin/run.sh"            7 minutes ago       Exited (137) 4 minutes ago                                        etcd.2.6hpxbv34jnfz0bjl1yx4xnwdd
b0963cce9bf3        elcolio/etcd:2.0.5    "/bin/run.sh /bin/ba…"   12 minutes ago      Exited (130) 11 minutes ago                                       hopeful_feistel

复制代码

 

 

ssh到manageer1
运行docker node ls,验证所有节点都是ACTIVE的:

复制代码

root@manager1:~# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
zmvmswnwv6jcvjt1tmq65zzkg *   manager1            Ready               Active              Leader              18.09.2pi6ori8t1tuestb3hzhnn265v     work1               Ready               Active                                  18.09.2ohivom1sdi1vz1oaer1b9wpl0     work2               Ready               Active                                  18.09.2

复制代码

 

如果弄的etcd服务还没有从滚动更新中起来,需要启动起来:
运行docker service ps etcd查看管理节点如何分配任务到不同节点:

复制代码

root@manager1:~# docker service ps etcd
ID                  NAME                IMAGE                 NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
nzwtsi4p8stw        etcd.1              elcolio/etcd:2.0.10   work1               Running             Running 6 minutes ago                        
lom9z7y8rlps         \_ etcd.1          elcolio/etcd:2.0.5    work1               Shutdown            Shutdown 6 minutes ago                       
8h8xjzyhlq1a        etcd.2              elcolio/etcd:2.0.10   manager1            Running             Running 6 minutes ago                        
6hpxbv34jnfz         \_ etcd.2          elcolio/etcd:2.0.5    manager1            Shutdown            Shutdown 6 minutes ago

复制代码

 

运行docker node update --availability drain <NODE>来下线一个节点:

root@manager1:~# docker node update --availability drain manager1
manager1

 

运行以下来检查节点的可用性:
可以看到该节点的可用性是Drain

复制代码

root@manager1:~# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
zmvmswnwv6jcvjt1tmq65zzkg *   manager1            Ready               Drain               Leader              18.09.2pi6ori8t1tuestb3hzhnn265v     work1               Ready               Active                                  18.09.2ohivom1sdi1vz1oaer1b9wpl0     work2               Ready               Active                                  18.09.2

复制代码

 

docker node inspect --pretty manager1

root@manager1:~# docker node inspect --pretty manager1
ID:            zmvmswnwv6jcvjt1tmq65zzkg
Hostname:                  manager1
Joined at:                 2019-08-24 12:11:37.150001136 +0000 utc
Status:
 State:            Ready
 Availability:             Drain
 Address:        192.168.10.104
Manager Status:
 Address:        192.168.10.104:2377
 Raft Status:        Reachable
 Leader:        Yes
Platform:
 Operating System:    linux
 Architecture:        x86_64
Resources:
 CPUs:            1
 Memory:        3.859GiB
Plugins:
 Log:        awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog
 Network:        bridge, host, macvlan, null, overlay
 Volume:        local
Engine Version:        18.09.2
TLS Info:
 TrustRoot:
-----BEGIN CERTIFICATE-----
MIIBajCCARCgAwIBAgIUHwOd2JFLTCBePSGfOYdPvomygdEwCgYIKoZIzj0EAwIw
EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTkwODI0MTIwNzAwWhcNMzkwODE5MTIw
NzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
A0IABDQ1v1QxJoRfkoo6hWcKkYD6ixGtd/YCnTVuqOcpyh97dQ3qVPUIEJoafORt
5yQCu8mLOCH1mWrXjA2yVo/Z6DqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBT3zbMseoYHkZ60+VhVDGn1qdv4njAKBggqhkjO
PQQDAgNIADBFAiA/nXEN/f6wpUtOWwUBDNAXlKmhp7j+MjfD84+ksu+JEgIhAL6O
ZYp25KHMOGQaVWDPJZIzObWofJvxFwE4hHRkbCaH
-----END CERTIFICATE-----

 Issuer Subject:    MBMxETAPBgNVBAMTCHN3YXJtLWNh
 Issuer Public Key:    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENDW/VDEmhF+SijqFZwqRgPqLEa139gKdNW6o5ynKH3t1DepU9QgQmhp85G3nJAK7yYs4IfWZateMDbJWj9noOg==

运行docker service ps etcd来查看管理节点是如何重新分配任务的:
可以看到管理节点将下线节点的任务停止了,为了保障副本数量,重新在active的节点上调度了任务。

复制代码

root@manager1:~# docker service ps etcd
ID                  NAME                IMAGE                 NODE                DESIRED STATE       CURRENT STATE                 ERROR               PORTS
nzwtsi4p8stw        etcd.1              elcolio/etcd:2.0.10   work1               Running             Running 9 minutes ago                             
lom9z7y8rlps         \_ etcd.1          elcolio/etcd:2.0.5    work1               Shutdown            Shutdown 9 minutes ago                            
31x8luhz56zn        etcd.2              elcolio/etcd:2.0.10   work2               Running             Running about a minute ago                        
8h8xjzyhlq1a         \_ etcd.2          elcolio/etcd:2.0.10   manager1            Shutdown            Shutdown about a minute ago                       
6hpxbv34jnfz         \_ etcd.2          elcolio/etcd:2.0.5    manager1            Shutdown            Shutdown 9 minutes ago

复制代码

 

运行docker node update --availability active <NODE>来重新active该节点:

root@manager1:~# docker node update --availability active manager1
manager1

 

查看节点状态,可以看到节点状态重新为Active

root@manager1:~# docker node inspect --pretty manager1
ID:            zmvmswnwv6jcvjt1tmq65zzkg
Hostname:                  manager1
Joined at:                 2019-08-24 12:11:37.150001136 +0000 utc
Status:
 State:            Ready
 Availability:             Active
 Address:        192.168.10.104
Manager Status:
 Address:        192.168.10.104:2377
 Raft Status:        Reachable
 Leader:        Yes
Platform:
 Operating System:    linux
 Architecture:        x86_64
Resources:
 CPUs:            1
 Memory:        3.859GiB
Plugins:
 Log:        awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog
 Network:        bridge, host, macvlan, null, overlay
 Volume:        local
Engine Version:        18.09.2
TLS Info:
 TrustRoot:
-----BEGIN CERTIFICATE-----
MIIBajCCARCgAwIBAgIUHwOd2JFLTCBePSGfOYdPvomygdEwCgYIKoZIzj0EAwIw
EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMTkwODI0MTIwNzAwWhcNMzkwODE5MTIw
NzAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
A0IABDQ1v1QxJoRfkoo6hWcKkYD6ixGtd/YCnTVuqOcpyh97dQ3qVPUIEJoafORt
5yQCu8mLOCH1mWrXjA2yVo/Z6DqjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBT3zbMseoYHkZ60+VhVDGn1qdv4njAKBggqhkjO
PQQDAgNIADBFAiA/nXEN/f6wpUtOWwUBDNAXlKmhp7j+MjfD84+ksu+JEgIhAL6O
ZYp25KHMOGQaVWDPJZIzObWofJvxFwE4hHRkbCaH
-----END CERTIFICATE-----

 Issuer Subject:    MBMxETAPBgNVBAMTCHN3YXJtLWNh
 Issuer Public Key:    MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAENDW/VDEmhF+SijqFZwqRgPqLEa139gKdNW6o5ynKH3t1DepU9QgQmhp85G3nJAK7yYs4IfWZateMDbJWj9noOg==

当节点重新active的时候,在以下情况下它会重新接受任务:

 

 

为一个服务暴露端口

使用--publish来在创建一个服务的时候暴露端口。target指明容器内暴露的端口。published指明绑定到路由网络上的端口。如果不写published,就会为每个服务绑定一个随机的高数字端口。你需要检查任务才能确定端口

 

先删除etcd,再重新部署etcd,指定映射端口,查看进程

root@manager1:~# docker service rm etcd
etcd
root@manager1:~# docker service create --name etcd --publish published=2379,target=2379 --replicas 1 elcolio/etcd:2.0.10
0xej3ym93411svulph7f5l0m0
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged 
root@manager1:~# docker service ps etcd
ID                  NAME                IMAGE                 NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
tqmgklo7fbmb        etcd.1              elcolio/etcd:2.0.10   manager1            Running             Running 14 seconds ago

1.png

https://docs.docker.com/engine/swarm/images/ingress-routing-mesh.png

 

你可以用以下命令给一个已经存在的服务暴露端口

复制代码

root@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                 PORTS
0xej3ym93411        etcd                replicated          1/1                 elcolio/etcd:2.0.10   *:2379->2379/tcp
root@manager1:~# 
root@manager1:~# docker service update --publish-add published=20379,target=2379 etcd
etcd
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged

复制代码

 

你可以使用docker service inspect来查看服务暴露的端口:

root@manager1:~# docker service inspect --format="{{json .Endpoint.Spec.Ports}}" etcd
[{"Protocol":"tcp","TargetPort":2379,"PublishedPort":20379,"PublishMode":"ingress"},{"Protocol":"tcp","TargetPort":2379,"PublishedPort":2379,"PublishMode":"ingress"}]

 

访问etcd api,查看版本

使用命令:docker service ps etcd 得知etcd运行在manager1,因此访问地址为:

root@manager1:~# curl http://192.168.10.104:20379/version
etcd 2.0.10

 

仅暴露一个TCP或UDP端口

注意:这部分内容出现的命令,不需要执行

默认你暴露的端口都是TCP的。如果你使用长语法(Docker 1.13 and higher),设置protocol为tcp或udp即可暴露相应端口

仅TCP

长语法
$ docker service create --name dns-cache \
  --publish published=53,target=53 \
  dns-cache
短语法
$ docker service create --name dns-cache \
  -p 53:53 \
  dns-cache

 

TCP和UDP

长语法
$ docker service create --name dns-cache \
  --publish published=53,target=53 \
  --publish published=53,target=53,protocol=udp \
  dns-cache
 短语法
$ docker service create --name dns-cache \
  -p 53:53 \
  -p 53:53/udp \
  dns-cache

 

只暴露UDP
长语法
$ docker service create --name dns-cache \
  --publish published=53,target=53,protocol=udp \
  dns-cache
短语法
$ docker service create --name dns-cache \
  -p 53:53/udp \
  dns-cache

 

绕过路由网络

$ docker service create --name dns-cache \
  --publish published=53,target=53,protocol=udp,mode=host \
  --mode global \
  dns-cache

 1.png

 

安装haproxy

由于机器资源不够,这里在manager1节点,安装haproxy

apt-get install -y haproxy

 

配置haproxy

vim /etc/haproxy/haproxy.cfg

最后一行添加

# Configure HAProxy to listen on port 80
frontend http_front
   bind *:80
   stats uri /haproxy?stats
   default_backend http_back

# Configure HAProxy to route requests to swarm nodes on port 8080
backend http_back
   balance roundrobin
   server node1 192.168.10.104:2379 check
   server node2 192.168.10.108:2379 check
   server node3 192.168.10.110:2379 check

 

重新加载配置

service haproxy reload

 

访问haproxy

http://192.168.10.104/haproxy?stats

效果如下:

1.png

 

 可以发现3台node的Act状态为Y,表示活跃。

 

访问etcd api的版本

http://192.168.10.104/version

效果如下:

1.png

 

 

本文参考链接:

https://www.cnblogs.com/drawnkid/p/8487337.html


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯