docker swarm mode 配置使用

swarm mode说明

swarm mode 是 docker 在1.12版本中引入的集群配置工具,将原本的 docker swarm 集群配置工具直接集成在了 docker-engine 中.这种情况下,在只安装了docker-engine的情况下,都可以完成 docker 集群的组建和相应的操作.

运行环境

ubuntu14.04.4

4.2.0 kernel

docker 1.12.0-rc2 (注意:在docker 1.12.0-rc1后才有swarm mode)

准备了ip分别为192.168.4.231/232/233的3台主机

此时查看 docker info 中, Swarm状态为inactive.

创建集群

在主机231上执行 docker swarm init --listen-addr 192.168.4.231:2377

此时通过 docker info 查看 Swarm 状态如下:

Swarm: active
 NodeID: 1lsp4r0esfl6a7vtg5hb02ztm
 IsManager: Yes
 Managers: 1
 Nodes: 1
 CACertHash: sha256:63030424e110733683d6f7543e3887f12021a1704592960e492a170144c025f5

通过 docker node ls 查看如下:

root@ubuntu231:~# docker node ls
ID                           NAME       MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS
1lsp4r0esfl6a7vtg5hb02ztm *  ubuntu231  Accepted    Ready   Active        Leader

通过 docker swarm inspect 查看如下:

root@ubuntu231:~# docker swarm inspect
[
    {
        "ID": "6toicfhqgbbjucri68f2pcgs2",
        "Version": {
            "Index": 11
        },
        "CreatedAt": "2016-07-04T12:07:56.816450141Z",
        "UpdatedAt": "2016-07-04T12:07:56.996227642Z",
        "Spec": {
            "Name": "default",
            "AcceptancePolicy": {
                "Policies": [
                    {
                        "Role": "worker",
                        "Autoaccept": true
                    },
                    {
                        "Role": "manager",
                        "Autoaccept": false
                    }
                ]
            },
            "Orchestration": {
                "TaskHistoryRetentionLimit": 10
            },
            "Raft": {
                "SnapshotInterval": 10000,
                "LogEntriesForSlowFollowers": 500,
                "HeartbeatTick": 1,
                "ElectionTick": 3
            },
            "Dispatcher": {
                "HeartbeatPeriod": 5000000000
            },
            "CAConfig": {
                "NodeCertExpiry": 7776000000000000
            }
        }
    }
]

节点加入集群

在232/233两主机上执行 docker swarm join 192.168.4.231:2377

此时两主机上查看 docker info:

Swarm: active
 NodeID: f51y1qkkarppreo9kt93f4zuy
 IsManager: No

此时两主机上查看 docker node ls:

root@ubuntu233:~# docker node ls
Error response from daemon: This node is not participating as a Swarm manager

在231上查看 docker info:

Swarm: active
 NodeID: 1lsp4r0esfl6a7vtg5hb02ztm
 IsManager: Yes
 Managers: 1
 Nodes: 3
 CACertHash: sha256:63030424e110733683d6f7543e3887f12021a1704592960e492a170144c025f5

在231上查看 docker node ls:

root@ubuntu231:~# docker node ls
ID                           NAME       MEMBERSHIP  STATUS  AVAILABILITY  MANAGER STATUS
1lsp4r0esfl6a7vtg5hb02ztm *  ubuntu231  Accepted    Ready   Active        Leader
6dd63h58bw9vhuxp94208kq0a    ubuntu233  Accepted    Ready   Active        
f51y1qkkarppreo9kt93f4zuy    ubuntu232  Accepted    Ready   Active        

在231上查看 docker swarm inspect:

root@ubuntu231:~# docker swarm inspect
[
    {
        "ID": "6toicfhqgbbjucri68f2pcgs2",
        "Version": {
            "Index": 11
        },
        "CreatedAt": "2016-07-04T12:07:56.816450141Z",
        "UpdatedAt": "2016-07-04T12:07:56.996227642Z",
        "Spec": {
            "Name": "default",
            "AcceptancePolicy": {
                "Policies": [
                    {
                        "Role": "worker",
                        "Autoaccept": true
                    },
                    {
                        "Role": "manager",
                        "Autoaccept": false
                    }
                ]
            },
            "Orchestration": {
                "TaskHistoryRetentionLimit": 10
            },
            "Raft": {
                "SnapshotInterval": 10000,
                "LogEntriesForSlowFollowers": 500,
                "HeartbeatTick": 1,
                "ElectionTick": 3
            },
            "Dispatcher": {
                "HeartbeatPeriod": 5000000000
            },
            "CAConfig": {
                "NodeCertExpiry": 7776000000000000
            }
        }
    }
]

可以看到 231 主机为 manager 节点,其他两个为 worker 节点.在 worker 节点上,无法查看 swarm node 信息.

通过服务使用集群

在231,即 manager 节点上,通过执行如下命令启动一个服务.

docker service create --replicas 3 --name test busybox ping www.baidu.com

执行后通过 docker service ls 查看服务情况.

root@ubuntu231:~# docker service ls
ID            NAME  REPLICAS  IMAGE    COMMAND
52mpkhlszznu  test  3/3       busybox  ping www.baidu.com

可以看到此服务复制数为3.

分别在3台主机查看容器

root@ubuntu231:~# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
4c2c3d36ee0d        busybox:latest      "ping www.baidu.com"   About a minute ago   Up About a minute                       test.1.bx4hz20s11msmlp04w3uerg18
root@ubuntu232:~# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
5fb24cf0ff0e        busybox:latest      "ping www.baidu.com"   About a minute ago   Up About a minute                       test.3.358cfwsw2ty2brt5ve045r61b
root@ubuntu233:~# docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED              STATUS              PORTS               NAMES
104191844da9        busybox:latest      "ping www.baidu.com"   About a minute ago   Up About a minute                       test.2.971p65qenkoqdo6hpvkq9f5id

可以看到此服务的容器被平均分布到3台主机上去运行了.

也可以通过在 manager 节点上执行 docker service tasks test 查看此服务任务的分布情况.

root@ubuntu231:~# docker service tasks test
ID                         NAME    SERVICE  IMAGE    LAST STATE         DESIRED STATE  NODE
bx4hz20s11msmlp04w3uerg18  test.1  test     busybox  Running 5 minutes  Running        ubuntu231
971p65qenkoqdo6hpvkq9f5id  test.2  test     busybox  Running 5 minutes  Running        ubuntu233
358cfwsw2ty2brt5ve045r61b  test.3  test     busybox  Running 5 minutes  Running        ubuntu232

在使用 service 服务的时候,每台主机上的 docker run 还是可以一样正常使用.

服务规模调整

在 manager 节点上执行命令 docker service scale test=5 即可完成服务扩容.此处是将test 服务的容器数扩容到 5.

通过 docker service tasks test 查看服务:

root@ubuntu231:~# docker service tasks test
ID                         NAME    SERVICE  IMAGE    LAST STATE          DESIRED STATE  NODE
bx4hz20s11msmlp04w3uerg18  test.1  test     busybox  Running 15 minutes  Running        ubuntu231
971p65qenkoqdo6hpvkq9f5id  test.2  test     busybox  Running 15 minutes  Running        ubuntu233
358cfwsw2ty2brt5ve045r61b  test.3  test     busybox  Running 15 minutes  Running        ubuntu232
b1cu1mwnw98oymi1vgbcl3l84  test.4  test     busybox  Running 20 seconds  Running        ubuntu232
7t8kfpfv4zegut9fbc1bbwaf6  test.5  test     busybox  Running 20 seconds  Running        ubuntu231

可以看到在经过一段时间后,此服务的容器数扩展到5个,并调度到不同主机上.

同理, 通过 docker service scale test=2 此命令指定不同的 scale 数,可以随意控制服务的容器数量.

root@ubuntu231:~# docker service tasks test
ID                         NAME    SERVICE  IMAGE    LAST STATE          DESIRED STATE  NODE
358cfwsw2ty2brt5ve045r61b  test.3  test     busybox  Running 17 minutes  Running        ubuntu232
7t8kfpfv4zegut9fbc1bbwaf6  test.5  test     busybox  Running 2 minutes   Running        ubuntu231

缩容的话, docker 会随机选择容器关闭.

服务移除

通过 docker service rm test 即可移除服务. 当移除服务后, 每台主机上相关的容器也就被移除了.