docker swarm實踐

準備

準備3臺機器,包含一臺管理節點,兩臺工做節點的最小的swarm集羣html

172.16.0.200  Ubuntu14.04node

172.16.0.201  Ubuntu14.04nginx

172.16.0.202  Ubuntu14.04web

生成環境最好2n+1(n>=1)個manager節點,但也不是越多越好,官方建議是7個manager節點docker

 

安裝docker

 

使用腳本自動安裝

在測試或開發環境中 Docker 官方爲了簡化安裝流程,提供了一套便捷的安裝腳本,Ubuntu 系統上可使用這套腳本安裝:npm

$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

執行這個命令後,會下載腳本到get-docker.sh,並使用阿里雲的鏡像下載,而後腳本會把 Docker CE 的 Edge 版本安裝在系統中。且是默認啓動。ubuntu

api

直接只有Daocloud的安裝腳本安裝瀏覽器

curl -sSL https://get.daocloud.io/docker | sh

 

啓動命令

service docker start

 

創建docker用戶組

默認狀況下,docker 命令會使用 Unix socket 與 Docker 引擎通信。而只有 root 用戶和 docker 組的用戶才能夠訪問 Docker 引擎的 Unix socket。出於安全考慮,通常 Linux 系統上不會直接使用 root 用戶。所以,更好地作法是將須要使用 docker 的用戶加入 docker 用戶組。安全

創建docker組

groupadd docker

將當前用戶加入docker組

usermod -aG docker $USER

退出當前終端並從新登陸,進行以下測試。

 

測試docker是否正確安裝

$ docker run hello-world

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

若能輸出以上信息,則是正確安裝

 

建立swarm集羣

3臺機器見最上面,都安裝docker環境。如今以172.16.0.200爲manager,其他2臺爲worker

 

初始化集羣

咱們使用 docker swarm init 在本機初始化一個 Swarm 集羣。

root@ubuntu:~# docker swarm init --advertise-addr 172.16.0.200
Swarm initialized: current node (u66elsqnr7cx3ufefopuvchbm) is now a manager.

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

    docker swarm join --token SWMTKN-1-1im8j7ggh1wqwxppvg3cl1mbpkzsnux4g4vgftg6s08dydl8xw-0iorbvp4rqvsqpe658i054xii 172.16.0.200:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

若是你的 Docker 主機有多個網卡,擁有多個 IP,必須使用 --advertise-addr 指定 IP。

執行 docker swarm init 命令的節點自動成爲管理節點

 

增長工做節點

登陸201

root@api:~# ssh 172.16.0.201
root@172.16.0.201's password: 
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)
Last login: Fri Dec 29 12:05:09 2017 from 172.16.0.200

加入到集羣

依照上面初始化集羣成功後的提示執行加入命令便可

root@ubuntu:~# docker swarm join --token SWMTKN-1-1im8j7ggh1wqwxppvg3cl1mbpkzsnux4g4vgftg6s08dydl8xw-0iorbvp4rqvsqpe658i054xii 172.16.0.200:2377
This node joined a swarm as a worker.

登陸202

root@api:~# ssh 172.16.0.202
root@172.16.0.202's password: 
Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64)
Last login: Fri Dec 29 12:05:09 2017 from 172.16.0.200

加入到集羣

root@ubuntu:~# docker swarm join --token SWMTKN-1-1im8j7ggh1wqwxppvg3cl1mbpkzsnux4g4vgftg6s08dydl8xw-0iorbvp4rqvsqpe658i054xii 172.16.0.200:2377
This node joined a swarm as a worker.

 

查看集羣

通過上邊的兩步,咱們已經擁有了一個最小的 Swarm 集羣,包含一個管理節點和兩個工做節點。

在管理節點使用 docker node ls 查看集羣。

root@ubuntu:~# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
c88xqfzcbhhlg6c07oochr2g7     ubuntu              Ready               Active              
rq5oh6hfdo32t9xbl7z7sgikm     ubuntu              Ready               Active              
u66elsqnr7cx3ufefopuvchbm *   ubuntu              Ready               Active              Leader

退出集羣

root@ubuntu:~# docker swarm leave
Node left the swarm.

兩臺都退出後,manager上查看

root@ubuntu:~# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
c88xqfzcbhhlg6c07oochr2g7     ubuntu              Down                Active              
rq5oh6hfdo32t9xbl7z7sgikm     ubuntu              Down                Active              
u66elsqnr7cx3ufefopuvchbm *   ubuntu              Ready               Active              Leader

可見STATUS=Down了

 

疑問

上面可見有個token,那麼我忘記後面怎麼再加入新的worker節點或manager節點呢? 經過 docker swarm join-token worker查看,見下

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

    docker swarm join --token SWMTKN-1-1im8j7ggh1wqwxppvg3cl1mbpkzsnux4g4vgftg6s08dydl8xw-0iorbvp4rqvsqpe658i054xii 172.16.0.200:2377

加入manager也同樣,換下參數

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

    docker swarm join --token SWMTKN-1-1im8j7ggh1wqwxppvg3cl1mbpkzsnux4g4vgftg6s08dydl8xw-469wlqjh1jjuupv8ha29l2rzm 172.16.0.200:2377

也可更新 token

$ docker swarm join-token --rotate worker
Succesfully rotated worker join token.
 
To add a worker to this swarm, run the following command:
 
    docker swarm join \
    --token SWMTKN-1-3pu6hszjas19xyp7ghgosyx9k8atbfcr8p2is99znpy26u2lkl-b30ljddcqhef9b9v4rs7mel7t \
    172.16.0.200:2377

使用–rotate更新token以後,只能用新的token來加入集羣。

-q或–quiet參數只打印token:

root@ubuntu:~# docker swarm join-token -q worker
SWMTKN-1-1im8j7ggh1wqwxppvg3cl1mbpkzsnux4g4vgftg6s08dydl8xw-0iorbvp4rqvsqpe658i054xii

 

部署服務

咱們使用 docker service 命令來管理 Swarm 集羣中的服務,該命令只能在管理節點運行。

 

新建服務

管理節點執行

root@ubuntu:~# docker service create --name nginx --replicas 3 -p 80:80 nginx
tqd95pxsro7o0rs33ylz9zimj
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged

如今咱們使用瀏覽器,輸入任意節點 IP ,便可看到 nginx 默認頁面,如curl http://172.16.0.200

root@ubuntu:~# curl http://172.16.0.172
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

到各臺機器查看,上面都已經起了docker 服務

root@worker2:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
08a92a22061b        nginx:latest        "nginx -g 'daemon of…"   33 seconds ago      Up 33 seconds       80/tcp              nginx.1.tfhtoyshmzun54x17l3l3sop5

 

查看服務

使用 docker service ls 來查看當前 Swarm 集羣運行的服務。

root@ubuntu:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
tqd95pxsro7o        nginx               replicated          3/3                 nginx:latest        *:80->80/tcp

使用 docker service ps xxx 來查看某個服務的詳情,分佈在哪一個node等

root@manager1:~# docker service ps nginx 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
tfhtoyshmzun        nginx.1             nginx:latest        worker2             Running             Running 18 minutes ago                       
p6b1gfragl8y        nginx.2             nginx:latest        manager1            Running             Running 16 minutes ago                       
250owqr51y50        nginx.3             nginx:latest        worker1             Running             Running 20 minutes ago

使用 docker service logs xxx 來查看某個服務的log,前面我訪問curl http://172.16.0.200 3次,log以下

root@manager1:~# docker service logs nginx 
nginx.2.p6b1gfragl8y@manager1    | 10.255.0.2 - - [02/Jan/2018:09:58:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
nginx.1.tfhtoyshmzun@worker2    | 10.255.0.2 - - [02/Jan/2018:10:01:48 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
nginx.3.250owqr51y50@worker1    | 10.255.0.2 - - [02/Jan/2018:10:05:12 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

上面nginx是service名稱,也可訪問具體服務中的某一個服務的log,logs後面按tab鍵,會彈出名稱. 我又訪問了3次,可見3臺上分別有2次訪問,可見其實現了負載均衡

root@manager1:~# docker service logs 250owqr51y50 
nginx.3.250owqr51y50@worker1    | 10.255.0.2 - - [02/Jan/2018:10:05:12 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
nginx.3.250owqr51y50@worker1    | 10.255.0.2 - - [02/Jan/2018:10:06:43 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
root@manager1:~# docker service logs p6b1gfragl8y 
nginx.2.p6b1gfragl8y@manager1    | 10.255.0.2 - - [02/Jan/2018:09:58:31 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
nginx.2.p6b1gfragl8y@manager1    | 10.255.0.2 - - [02/Jan/2018:10:06:36 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
root@manager1:~# docker service logs tfhtoyshmzun 
nginx.1.tfhtoyshmzun@worker2    | 10.255.0.2 - - [02/Jan/2018:10:01:48 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"
nginx.1.tfhtoyshmzun@worker2    | 10.255.0.2 - - [02/Jan/2018:10:06:42 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.35.0" "-"

 

刪除服務

使用 docker service rm xxx 來從swarm集羣移除某個服務。

root@manager1:~# docker service rm nginx 
nginx

查看,已經無nginx的服務

root@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS

到worker節點上查看,也已經刪除了docker 服務

root@worker1:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

 

在swarm中使用compose部署

在swarm集羣中也可使用compose文件(docker-compose.yml)來配置,啓動多個服務,咱們以部署WordPress爲例進行說明

 

配置文件

manager1節點上的 docker-compose.yml

version: "3"
services:
  web:
    image: nginx
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

這裏:

一、起了2個services:(web 和 visualizer)

二、web是3個nginx組成的。 visualizer是一個開源項目,可用一個圖來看到整個swarm上運行的容器,這裏指定了只能運行在manager節點上

三、起了一個網絡webnet,類型爲overlay,見最下面一行。啓動的容器都使用此網絡互聯

root@manager1:~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
965de71420b3        bridge              bridge              local
f66cd75a8741        docker_gwbridge     bridge              local
136fb30aa99c        host                host                local
73ha87ntxcd5        ingress             overlay             swarm
eebca5dc00a0        none                null                local
pjxvmr7b1wcq        proj_webnet         overlay             swarm

 

部署服務

deploy 部署

-c 指定配置文件

proj 名稱隨便起

root@manager1:~# docker stack deploy -c docker-compose.yml proj
Creating network proj_webnet
Creating service proj_web
Creating service proj_visualizer

部署完成之後,訪問http://任意節點:8080,即會看到監控界面

查看服務

列出全部stack

root@manager1:~# docker stack ls 
NAME                SERVICES
proj                2

一個stack,2個services(web和visualizer)

列出全部服務services

root@manager1:~# docker stack services proj 
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
44u5poqrieoy        proj_visualizer     replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
s2hlawvwwal4        proj_web            replicated          3/3                 nginx:latest                      *:80->80/tcp

列出stack中任務狀況,分佈狀況

root@manager1:~# docker stack ps proj 
ID                  NAME                IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
quexa31y9kkt        proj_visualizer.1   dockersamples/visualizer:stable   manager1            Running             Running 20 minutes ago                       
4ozvbgpkrqtb        proj_web.1          nginx:latest                      worker2             Running             Running 21 minutes ago                       
skkh5uzsyl9o        proj_web.2          nginx:latest                      manager1            Running             Running 21 minutes ago                       
uns9r5vdx1x4        proj_web.3          nginx:latest                      worker1             Running             Running 21 minutes ago

 

擴容服務

好比由3份變爲5份 docker service scale proj_web=5 

root@manager1:~# docker service scale proj_web=5
proj_web 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@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
lhxiyrevf4dp        proj_visualizer     replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
uxo0piooz4it        proj_web            replicated          5/5                 nginx:latest                      *:80->80/tcp
root@manager1:~# docker service ps proj_web 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
6jqcnikrh39j        proj_web.1          nginx:latest        worker1             Running             Running 4 minutes ago                       
o7gq6w3wisbk        proj_web.2          nginx:latest        worker2             Running             Running 4 minutes ago                       
15hzrtciynx7        proj_web.3          nginx:latest        manager1            Running             Running 4 minutes ago                       
zjtcv1e68aag        proj_web.4          nginx:latest        worker1             Running             Running 2 minutes ago                       
7mvta3g7m8fm        proj_web.5          nginx:latest        worker2             Running             Running 2 minutes ago

減配置直接設置較少的數量便可,好比再設置回3個副本

root@manager1:~# docker service scale proj_web=3
proj_web scaled to 3
overall 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
lhxiyrevf4dp        proj_visualizer     replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
uxo0piooz4it        proj_web            replicated          3/3                 nginx:latest                      *:80->80/tcp
root@manager1:~# docker service ps proj_web     
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
15hzrtciynx7        proj_web.3          nginx:latest        manager1            Running             Running 6 minutes ago                       
zjtcv1e68aag        proj_web.4          nginx:latest        worker1             Running             Running 4 minutes ago                       
7mvta3g7m8fm        proj_web.5          nginx:latest        worker2             Running             Running 4 minutes ago

 

移除服務

docker stack rm xxx 移除服務

root@manager1:~# docker stack rm proj
Removing service proj_visualizer
Removing service proj_web
Removing network proj_webnet
root@manager1:~# docker stack ls
NAME                SERVICES

root@manager1:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

webnet的網絡也刪除了

root@worker2:~# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
feff2a6d1503        bridge              bridge              local
2f0e401d10a6        docker_gwbridge     bridge              local
7a60d8ee6f8b        host                host                local
73ha87ntxcd5        ingress             overlay             swarm
98442c4c5766        none                null                local

 

-----------------------

測試負載均衡

好比我在202上 stop 容器

root@worker2:~# docker stop 505
505
root@manager1:~# docker stack ps proj 
ID                  NAME                IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
quexa31y9kkt        proj_visualizer.1   dockersamples/visualizer:stable   manager1            Running             Running 31 minutes ago                       
4ozvbgpkrqtb        proj_web.1          nginx:latest                      worker2             Shutdown            Complete 3 seconds ago                       
skkh5uzsyl9o        proj_web.2          nginx:latest                      manager1            Running             Running 32 minutes ago                       
uns9r5vdx1x4        proj_web.3          nginx:latest                      worker1             Running             Running 32 minutes ago

可看到worker2 Shutdown

本覺得過會會新起個容器,可沒有

root@manager1:~# docker stack ps proj       
ID                  NAME                IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
quexa31y9kkt        proj_visualizer.1   dockersamples/visualizer:stable   manager1            Running             Running 37 minutes ago                       
4ozvbgpkrqtb        proj_web.1          nginx:latest                      worker2             Shutdown            Complete 6 minutes ago                       
skkh5uzsyl9o        proj_web.2          nginx:latest                      manager1            Running             Running 38 minutes ago                       
uns9r5vdx1x4        proj_web.3          nginx:latest                      worker1             Running             Running 38 minutes ago

本覺得再從新啓動202上的容器會恢復,可仍是沒有

root@worker2:~# docker start 505
505
root@manager1:~# docker stack ps proj 
ID                  NAME                IMAGE                             NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
quexa31y9kkt        proj_visualizer.1   dockersamples/visualizer:stable   manager1            Running             Running 40 minutes ago                       
4ozvbgpkrqtb        proj_web.1          nginx:latest                      worker2             Shutdown            Complete 8 minutes ago                       
skkh5uzsyl9o        proj_web.2          nginx:latest                      manager1            Running             Running 41 minutes ago                       
uns9r5vdx1x4        proj_web.3          nginx:latest                      worker1             Running             Running 41 minutes ago

那麼刪除容器試試呢,仍是沒有--!

root@worker2:~# docker rm -f 505 
505
root@worker2:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
root@manager1:~# docker stack ps proj       
ID                  NAME                IMAGE                             NODE                DESIRED STATE       CURRENT STATE          ERROR               PORTS
quexa31y9kkt        proj_visualizer.1   dockersamples/visualizer:stable   manager1            Running             Running 1 hours ago                        
4ozvbgpkrqtb        proj_web.1          nginx:latest                      worker2             Shutdown            Complete 1 hours ago                       
skkh5uzsyl9o        proj_web.2          nginx:latest                      manager1            Running             Running 1 hours ago                        
uns9r5vdx1x4        proj_web.3          nginx:latest                      worker1             Running             Running 1 hours ago

雖然服務掛了,可是訪問沒問題 curl http://172.16.0.202,見下

root@api:~# curl http://172.16.0.174
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

幾經測試,發現kill掉的容器會立刻發現並重啓,見下:

kill 掉202上的容器

root@worker2:~# docker kill 2ff47
2ff47
root@worker2:~# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

發現副本又3個變爲2個

root@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
lhxiyrevf4dp        proj_visualizer     replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
uxo0piooz4it        proj_web            replicated          2/3                 nginx:latest                      *:80->80/tcp

但幾秒鐘後就新起了一個容器,3個副本就恢復了。 ps看的話仍是能看到Shutdown的那個容器

root@manager1:~# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
lhxiyrevf4dp        proj_visualizer     replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
uxo0piooz4it        proj_web            replicated          3/3                 nginx:latest                      *:80->80/tcp
root@manager1:~# docker service ps proj_web 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR                         PORTS
15hzrtciynx7        proj_web.3          nginx:latest        manager1            Running             Running 9 minutes ago                                  
zjtcv1e68aag        proj_web.4          nginx:latest        worker1             Running             Running 6 minutes ago                                  
gu528xwks2h8        proj_web.5          nginx:latest        worker2             Running             Running 22 seconds ago                                 
7mvta3g7m8fm         \_ proj_web.5      nginx:latest        worker2             Shutdown            Failed 28 seconds ago    "task: non-zero exit (137)"

因而可知,docker stop停掉的容器可能認爲是人工的方式,人爲之,docker swarm集羣就再也不新起,這裏多是官方的bug

docker service update proj_web 也會使上面docker stop方式停掉的容器重啓

root@manager1:~# docker service update proj_web 
proj_web
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3:   
3/3: running   [==================================================>] 
verify: Service converged

而且刪掉了原各類緣由退出的容器,如下可見原 「7mvta3g7m8fm         \_ proj_web.5      nginx:latest        worker2             Shutdown            Failed 5 minutes ago      "task: non-zero exit (137)"」的容器沒了

root@manager1:~# docker service ps proj_web 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
r5ievoac5x3o        proj_web.1          nginx:latest        worker2             Running             Running 11 seconds ago                       
15hzrtciynx7        proj_web.3          nginx:latest        manager1            Running             Running 16 minutes ago                       
zjtcv1e68aag        proj_web.4          nginx:latest        worker1             Running             Running 13 minutes ago

去202上看退出的容器也是沒了

root@worker2:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
69346c5e694e        nginx:latest        "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        80/tcp              proj_web.1.r5ievoac5x3obvgelod00o9vw

 

又發現個問題,當嘗試用attach進入容器時,會一直hang住,手動斷開後,容器掛了

root@manager1:~# docker attach proj_web.3.15hzrtciynx72plzhjula2cd5 
^C
root@manager1:~# 
root@manager1:~# docker service ls    
ID                  NAME                MODE                REPLICAS            IMAGE                             PORTS
lhxiyrevf4dp        proj_visualizer     replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
uxo0piooz4it        proj_web            replicated          2/3                 nginx:latest                      *:80->80/tcp
root@manager1:~# docker stack ps proj 
ID                  NAME                IMAGE                             NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
r5ievoac5x3o        proj_web.1          nginx:latest                      worker2             Running             Running 18 hours ago                          
ige19sbe6zma        proj_visualizer.1   dockersamples/visualizer:stable   manager1            Running             Running 19 hours ago                          
15hzrtciynx7        proj_web.3          nginx:latest                      manager1            Shutdown            Complete 18 seconds ago                       
zjtcv1e68aag        proj_web.4          nginx:latest                      worker1             Running             Running 19 hours ago

發現proj_web.3已經Shutdown了,並且集羣感知不到,不會重啓,就像前面的手動stop同樣

當docker service update時也會hang住,且沒有新起掛掉的容器

root@manager1:~# docker service update proj_web 
proj_web
overall progress: 2 out of 3 tasks 
1/3:   
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
^C
Operation continuing in background.
Use `docker service ps proj_web` to check progress.

root@manager1:~# docker service ps proj_web 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
r5ievoac5x3o        proj_web.1          nginx:latest        worker2             Running             Running 19 hours ago                          
15hzrtciynx7        proj_web.3          nginx:latest        manager1            Shutdown            Complete 12 minutes ago                       
zjtcv1e68aag        proj_web.4          nginx:latest        worker1             Running             Running 19 hours ago

當docker service scale proj_web=3時也會hang住,只是新加的容器啓動了,那個死去的容器就是連不通,多是服務內部網絡的問題

root@manager1:~# docker service scale proj_web=4
proj_web scaled to 4
overall progress: 3 out of 4 tasks 
1/4: running   [==================================================>] 
2/4:   
3/4: running   [==================================================>] 
4/4: running   [==================================================>]

考慮是容器網絡的問題,那麼把有問題的容器刪掉呢

root@manager1:~# docker ps -a
CONTAINER ID        IMAGE                             COMMAND                  CREATED              STATUS                      PORTS               NAMES
ecd4a8bebc9c        nginx:latest                      "nginx -g 'daemon of…"   About a minute ago   Up About a minute           80/tcp              proj_web.2.xwmvxfs23ijab0wessptod8d7
d58eb620e9aa        nginx:latest                      "nginx -g 'daemon of…"   19 hours ago         Exited (0) 21 minutes ago                       proj_web.3.15hzrtciynx72plzhjula2cd5
1879b088ca37        dockersamples/visualizer:stable   "npm start"              19 hours ago         Up 19 hours                 8080/tcp            proj_visualizer.1.ige19sbe6zma322oplynf7csp
5bc982461a41        dockersamples/visualizer:stable   "npm start"              27 hours ago         Exited (0) 19 hours ago                         proj_visualizer.1.quexa31y9kkt1m4a4pqcwskzt
root@manager1:~# docker rm d58
d58
root@manager1:~# docker service update proj_web 
proj_web
overall progress: 3 out of 4 tasks 
1/4:   
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
^C
Operation continuing in background.
Use `docker service ps proj_web` to check progress.
##### 可見刪掉也仍是不行的,集羣服務裏仍是有4個副本,只是一個一直不通
root@manager1:~# docker rm 5bc
5bc
root@manager1:~# docker service update proj_web 
proj_web
overall progress: 3 out of 4 tasks 
1/4:   
2/4: running   [==================================================>] 
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
^C
Operation continuing in background.
Use `docker service ps proj_web` to check progress.
root@manager1:~# docker service scale proj_web=3
proj_web scaled to 3
overall progress: 3 out of 3 tasks 
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 
##### 當重置爲3個副本時,就ok了。也就說明了是壞掉容器的網絡問題
root@manager1:~# docker service ps proj_web 
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
r5ievoac5x3o        proj_web.1          nginx:latest        worker2             Running             Running 19 hours ago                        
xwmvxfs23ija        proj_web.2          nginx:latest        manager1            Running             Running 4 minutes ago                       
zjtcv1e68aag        proj_web.4          nginx:latest        worker1             Running             Running 19 hours ago                        
root@manager1:~#
相關文章
相關標籤/搜索