开始试用docker的swarm模式

时间:2020-11-28 00:56:21

开始试用docker的swarm模式

docker 1.12以及之后的版本集成了swarmkit等编排服务,现在docker的版本为1.12-rc2版本。本文来尝试试用此种模式建立原生的docker集群

本文将包含如下几点:

  • 在swarm模式下初始化一个docker引擎的集群
  • 添加节点至swarm中
  • 发布一个应用服务到swarm中
  • 当运行起来之后进行swarm管理

设置

尝试本例子需要如下几点要求:

  • 三台网络互通的宿主机:
  • 安装1.12或更高版本的docker
  • 管理节点的IP地址
  • 开启宿主机之间的端口
    • TCP端口2377集群管理端口
    • TCP与UDP端口7946节点之间通讯端口
    • TCP与UDP端口4789 overlay网络通讯端口
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p udp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp --dport 4789 -j ACCEPT
iptables -A INPUT -p udp --dport 4789 -j ACCEPT

创建swarm集群

创建管理节点

docker swarm init --listen-addr <MANAGER-IP>:<PORT>

如下所示:

[root@centos01 container]# docker swarm init --listen-addr 172.18.18.201:2377
Swarm initialized: current node (4am2qb52uw8r2ubxlkq3bxzyl) is now a manager.

[root@centos01 container]# docker info
Containers: 11
Running: 7
Paused: 0
Stopped: 4
Images: 5
Server Version: 1.12.0-rc1
Storage Driver: devicemapper
Pool Name: docker-253:0-2098542-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs
Data file: /dev/loop0
Metadata file: /dev/loop1
Data Space Used: 1.251 GB
Data Space Total: 107.4 GB
Data Space Available: 36.45 GB
Metadata Space Used: 2.642 MB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.145 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count: 0
Data loop file: /var/lib/docker/devicemapper/devicemapper/data
WARNING: Usage of loopback devices is strongly discouraged for production use. Either use `--storage-opt dm.thinpooldev` or use `--storage-opt dm.no_warn_on_loop_devices=true` to suppress this warning.
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
Library Version: 1.02.107-RHEL7 (2015-12-01)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: null bridge host overlay
Swarm: active
NodeID: 4am2qb52uw8r2ubxlkq3bxzyl
IsManager: Yes
Managers: 1
Nodes: 1
CACertHash: sha256:4306ba735e22975ecba482e122e881fc1cac28ed43443e0bf1a4397f354f2cb3
Runtimes: default
Default Runtime: default
Kernel Version: 4.6.2-1.el7.elrepo.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 992 MiB
Name: centos01
ID: 5OPS:GL5A:IKVO:74U5:3T3T:EBSW:5REH:USD3:AM3S:DRU4:ZLOW:EEKK
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
127.0.0.0/8

[root@centos01 container]# docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS LEADER
4am2qb52uw8r2ubxlkq3bxzyl * centos01 Accepted Ready Active Reachable Yes

添加节点到集群

在节点机器上运行如下命令

docker swarm join <MANAGER-IP>:<PORT>

如:

docker swarm join 172.18.18.201:2377
This node joined a Swarm as a worker.

在manager节点上查看节点

[vagrant@centos01 ~]$ docker node ls
ID NAME MEMBERSHIP STATUS AVAILABILITY MANAGER STATUS LEADER
8i07v3mx5ogdz1z68iide3yrn centos03 Accepted Ready Active
cioe124z1315ucs5rwd8n2mdv * centos01 Accepted Ready Active Reachable Yes
dfsp35af3tvt1ztf6ffcehtko centos02 Accepted Ready Active

发布服务

在manager上执行如下命令:

[vagrant@centos01 ~]$ docker service create --replicas 1 --name helloworld alpine ping docker.com
6gxhvlwx8uqbio7fn2yxnw1yg
  • docker service create命令创建一个 service.
  • --name标签命名service为helloworld.
  • --replicas标签来详细声明1个运行实体.
  • 参数alpine ping docker.com定义执行pingg docker.com作为alpine容器的服务.

使用docker service ls查看服务

[vagrant@centos01 ~]$ docker service ls
ID NAME SCALE IMAGE COMMAND
6gxhvlwx8uqb helloworld 1 alpine ping docker.com

使用docker service inspect审查服务

[vagrant@centos01 ~]$ docker service inspect --pretty helloworld
ID: 6gxhvlwx8uqbio7fn2yxnw1yg
Name: helloworld
Mode: REPLICATED
Replicas: 1
Placement:
Strategy: SPREAD
UpateConfig:
Parallelism: 1
ContainerSpec:
Image: alpine
Args: ping docker.com

使用docker service tasks <SERVICE-ID>查看服务运行在哪个节点上

[vagrant@centos01 ~]$ docker service tasks helloworld
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
30nkhczhr8g1ot6jh9couixed helloworld.1 helloworld alpine Running 10 minutes Running centos01
[vagrant@centos01 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8b1e88baadfd alpine:latest "ping docker.com" 10 minutes ago Up 10 minutes helloworld.1.30nkhczhr8g1ot6jh9couixed

Scale service

docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>

如:

[vagrant@centos01 ~]$ docker service scale helloworld=5
helloworld scaled to 5
[vagrant@centos01 ~]$ docker service tasks helloworld
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
30nkhczhr8g1ot6jh9couixed helloworld.1 helloworld alpine Running 13 minutes Running centos01
3g2ini5ovypy24umr85grcm6g helloworld.2 helloworld alpine Preparing 19 seconds Running centos03
4trr53ebdpzxo7wnjfet7gpl6 helloworld.3 helloworld alpine Preparing 19 seconds Running centos02
38t0tzje48uk63ros32olrfou helloworld.4 helloworld alpine Preparing 19 seconds Running centos02
exe4vkbsbaoy2l2lwylbi9g8o helloworld.5 helloworld alpine Running 19 seconds Running centos01

删除service

[vagrant@centos01 ~]$ docker service rm helloworld
helloworld
[vagrant@centos01 ~]$ docker service inspect helloworld
[]
Error: no such service: helloworld

滚动升级

$ docker service create --replicas 3 --name redis --update-delay 10s --update-parallelism 1 redis:3.0.6

0u6a4s31ybk7yw2wyvtikmu50

[root@centos01 docker]# docker service ls
ID NAME SCALE IMAGE COMMAND
3h9kbnrw5lgg redis 3 redis:3.0.6

[root@centos01 docker]# docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
bstvlwynaw6shfv9rgiinyuvp redis.1 redis redis:3.0.6 Running 16 minutes Running centos03
7xnp1n5ii9667xbvr1eaefyqu redis.2 redis redis:3.0.6 Running 16 minutes Running centos02
8w3pnr57j0sb8jpieu9wkuudf redis.3 redis redis:3.0.6 Running 16 minutes Running centos01

[vagrant@centos01 ~]$ docker service update --image redis:3.0.7 redis
redis
[root@centos01 docker]# docker service ls
ID NAME SCALE IMAGE COMMAND
3h9kbnrw5lgg redis 3 redis:3.0.7

[root@centos01 docker]# docker service tasks redis
ID NAME SERVICE IMAGE LAST STATE DESIRED STATE NODE
bstvlwynaw6shfv9rgiinyuvp redis.1 redis redis:3.0.6 Running 17 minutes Running centos03
bkq2qi6j5uq6tl3jn37nurq0z redis.2 redis redis:3.0.7 Preparing 6 seconds Running centos02
8w3pnr57j0sb8jpieu9wkuudf redis.3 redis redis:3.0.6 Running 17 minutes Running centos01

[vagrant@centos01 ~]$ docker service inspect --pretty redis
ID: 3h9kbnrw5lggasae7zl8umw7m
Name: redis
Mode: REPLICATED
Replicas: 3
Placement:
Strategy: SPREAD
UpateConfig:
Parallelism: 1
Delay: 10s
ContainerSpec:
Image: redis:3.0.7
  • --update-parallelism标签配置服务中同步升级的任务数量.
  • --update-delay标签配置一个服务任务或一系列任务升级的时延.

node下线

有些时候需要维护一个节点,此时此节点可能会网络断开或者需要关机,造成节点上服务可用。使用docker node update --availability drain <NODE-ID>将节点下线,swarm会将当前节点上的容器关闭并在其他节点上启动。当维护完成,需要上线是,将节点状态修改为active状态即可,命令如下:docker node update --availability active <NODE-ID>