1. 程式人生 > >docker 實踐(十一)docker swarm

docker 實踐(十一)docker swarm

一、docker swarm部署

部署架構圖:

swarm.png

1.1.docker swarm初始化

1.1.docker swarm-manager初始化

[[email protected] ~]# docker swarm init --advertise-addr 192.168.2.120
Swarm initialized: current node (shyex5019e84dup8kjwgy9esj) is now a manager.
To add a worker to this swarm, run the following command:
    docker swarm join --token SWMTKN-1-2nioyk01u61y4xju7z13ngr70zglt5w0hj2bpfnn9l7d3lso34-c45yo9ivt30qmai0lp3zyb3ks 192.168.2.120:2377  
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

1.1.2.docker manager檢視節點

[[email protected] ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
shyex5019e84dup8kjwgy9esj *   docker-2-120        Ready               Active              Leader              18.09.0

#暫時只有管理節點

1.2.新增work節點

1.2.1.在dm1上執行:

[[email protected] /]# docker swarm join --token SWMTKN-1-2nioyk01u61y4xju7z13ngr70zglt5w0hj2bpfnn9l7d3lso34-c45yo9ivt30qmai0lp3zyb3ks 192.168.2.120:2377
This node joined a swarm as a worker.

1.2.2.在dm2上執行:

[[email protected] ~]# docker swarm join --token SWMTKN-1-2nioyk01u61y4xju7z13ngr70zglt5w0hj2bpfnn9l7d3lso34-c45yo9ivt30qmai0lp3zyb3ks 192.168.2.120:2377
This node joined a swarm as a worker.

1.2.3.在manger節點上檢視:

[[email protected] ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
32ak19ny1nib5woq9wfij5cz4     dm1                 Ready               Active                                  18.09.0
jhf5lcacfdun78t4tie3dt0zy     dm2                 Ready               Active                                  18.09.0
shyex5019e84dup8kjwgy9esj *   docker-2-120        Ready               Active              Leader              18.09.0

二、部署service

2.1.在manager上執行nginx映象的service

[[email protected] ~]# docker service create --name "ckl_web" nginx


2.1.1.檢視service

[[email protected] ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
v3ifjb3k2yye        ckl_web             replicated          1/1                 nginx:latest

#ID:serviceID

#NAME :名稱

#REPLICAS :當前的副本數量

#IMAGE :映象名詞

#PORTS:埠


2.1.2.檢視副本狀態

[[email protected] ~]# docker service ps ckl_web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
cb1cv5dgqfrh        ckl_web.1           nginx:latest        docker-2-120        Running             Running 59 seconds ago


檢視容器執行:

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
acb5a7377b4f        nginx:latest        "nginx -g 'daemon of…"   About a minute ago   Up About a minute   80/tcp              ckl_web.1.cb1cv5dgqfrhrt2bdpk8elzhw


2.2.提升副本,模擬負載均衡

2.2.1.在manager上執行

[[email protected] ~]# docker service scale ckl_web=6
ckl_web scaled to 6
overall progress: 6 out of 6 tasks 
1/6: running   [==================================================>] 
2/6: running   [==================================================>] 
3/6: running   [==================================================>] 
4/6: running   [==================================================>] 
5/6: running   [==================================================>] 
6/6: running   [==================================================>] 
verify: Service converged


2.2.2.檢視擴充套件後副本資訊

[[email protected] ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
v3ifjb3k2yye        ckl_web             replicated          6/6                 nginx:latest

檢視容器執行節點:

[[email protected] ~]# docker service ps ckl_web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
cb1cv5dgqfrh        ckl_web.1           nginx:latest        docker-2-120        Running             Running 7 minutes ago                            
wbx0wbr9w8tq        ckl_web.2           nginx:latest        dm1                 Running             Running about a minute ago                       
mviu588mulo2        ckl_web.3           nginx:latest        dm2                 Running             Running about a minute ago                       
ltnuyjpbj4eo        ckl_web.4           nginx:latest        dm2                 Running             Running about a minute ago                       
lil6pq81fnaa        ckl_web.5           nginx:latest        docker-2-120        Running             Running about a minute ago                       
ap36bx8k6y65        ckl_web.6           nginx:latest        dm1                 Running             Running about a minute ago


#目前正好均勻的執行在三個節點上,每個節點2個容器執行

2.2.3.如果只希望容器執行在worker節點

[[email protected] ~]# docker node update --availability drain docker-2-120 
docker-2-120

2.2.4.檢視node節點狀態

[[email protected] ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
32ak19ny1nib5woq9wfij5cz4     dm1                 Ready               Active                                  18.09.0
jhf5lcacfdun78t4tie3dt0zy     dm2                 Ready               Active                                  18.09.0
shyex5019e84dup8kjwgy9esj *   docker-2-120        Ready               Drain               Leader              18.09.0

2.2.5.檢視service執行

[[email protected] ~]# docker service ps ckl_web                            
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
q5d9hbtzfszp        ckl_web.1           nginx:latest        dm1                 Running             Running 2 minutes ago                        
cb1cv5dgqfrh         \_ ckl_web.1       nginx:latest        docker-2-120        Shutdown            Shutdown 2 minutes ago                       
wbx0wbr9w8tq        ckl_web.2           nginx:latest        dm1                 Running             Running 9 minutes ago                        
mviu588mulo2        ckl_web.3           nginx:latest        dm2                 Running             Running 9 minutes ago                        
ltnuyjpbj4eo        ckl_web.4           nginx:latest        dm2                 Running             Running 9 minutes ago                        
ij9dt6fjjmhy        ckl_web.5           nginx:latest        dm2                 Running             Running 2 minutes ago                        
lil6pq81fnaa         \_ ckl_web.5       nginx:latest        docker-2-120        Shutdown            Shutdown 2 minutes ago                       
ap36bx8k6y65        ckl_web.6           nginx:latest        dm1                 Running             Running 9 minutes ago

#原來manager節點執行的容器已經被分攤到dm1和dm2上了

2.3.減少副本

2.3.1.減少副本數

[[email protected] ~]# docker service scale ckl_web=4
ckl_web scaled to 4
overall progress: 4 out of 4 tasks 
1/4: running   [==================================================>] 
2/4:   
3/4: running   [==================================================>] 
4/4: running   [==================================================>] 
verify: Service converged

2.3.2.檢視service

[[email protected] ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
v3ifjb3k2yye        ckl_web             replicated          4/4                 nginx:latest

#副本數為4

2.3.3.檢視容器執行節點

[[email protected] ~]# docker service ps ckl_web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
q5d9hbtzfszp        ckl_web.1           nginx:latest        dm1                 Running             Running 7 minutes ago                        
cb1cv5dgqfrh         \_ ckl_web.1       nginx:latest        docker-2-120        Shutdown            Shutdown 7 minutes ago                       
wbx0wbr9w8tq        ckl_web.2           nginx:latest        dm1                 Running             Running 14 minutes ago                       
mviu588mulo2        ckl_web.3           nginx:latest        dm2                 Running             Running 14 minutes ago                       
ltnuyjpbj4eo        ckl_web.4           nginx:latest        dm2                 Running             Running 14 minutes ago                       
lil6pq81fnaa        ckl_web.5           nginx:latest        docker-2-120        Shutdown            Shutdown 7 minutes ago

三、故障轉移

swarm內建failover策略可以實現故障轉移

模擬dm1宕機

3.1.檢視node節點狀態

[[email protected] ~]# docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
32ak19ny1nib5woq9wfij5cz4     dm1                 Down                Active                                  18.09.0
jhf5lcacfdun78t4tie3dt0zy     dm2                 Ready               Active                                  18.09.0
shyex5019e84dup8kjwgy9esj *   docker-2-120        Ready               Drain               Leader              18.09.0
#dm1階段狀態為down


3.2.檢視service狀態

[[email protected] ~]# docker service ps ckl_web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
rs3ntbl74en3        ckl_web.1           nginx:latest        dm2                 Running             Running 2 minutes ago                         
q5d9hbtzfszp         \_ ckl_web.1       nginx:latest        dm1                 Shutdown            Running 25 minutes ago                        
cb1cv5dgqfrh         \_ ckl_web.1       nginx:latest        docker-2-120        Shutdown            Shutdown 25 minutes ago                       
kwctm7bg4jha        ckl_web.2           nginx:latest        dm2                 Running             Running 2 minutes ago                         
wbx0wbr9w8tq         \_ ckl_web.2       nginx:latest        dm1                 Shutdown            Running 33 minutes ago                        
mviu588mulo2        ckl_web.3           nginx:latest        dm2                 Running             Running 32 minutes ago                        
ltnuyjpbj4eo        ckl_web.4           nginx:latest        dm2                 Running             Running 32 minutes ago                        
lil6pq81fnaa        ckl_web.5           nginx:latest        docker-2-120        Shutdown            Shutdown 25 minutes ago

#執行在dm1上的容器,已都轉移到dm2上了,故障節點狀態是shutdown


四、訪問docker service

4.1.在manager上部署service

[[email protected] ~]# docker service create --name "ckl_nginx" --replicas=2 nginx


4.2.service執行節點

[[email protected] ~]# docker service ps ckl_nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
p28o2lobduog        ckl_nginx.1         nginx:latest        dm2                 Running             Running 29 seconds ago                       
38yanzwce36u        ckl_nginx.2         nginx:latest        dm1                 Running             Running 28 seconds ago


4.3.在dm1檢視容器

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6a835035f35f        nginx:latest        "nginx -g 'daemon of…"   51 seconds ago      Up 49 seconds       80/tcp              ckl_nginx.2.38yanzwce36uf007j0okvctus

檢視容器並訪問:

[[email protected] ~]# curl http://10.8.95.2
<!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>


4.4.埠對映,外網訪問service

[[email protected] ~]# docker service update --publish-add 8000:80 ckl_nginx

檢視service狀態:

[[email protected] ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
ggjfmz39jzj7        ckl_nginx           replicated          2/2                 nginx:latest        *:8000->80/tcp


[[email protected] ~]# docker service ps ckl_nginx
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE             ERROR               PORTS
r84wybzu2zez        ckl_nginx.1         nginx:latest        dm2                 Running             Running 27 seconds ago                        
p28o2lobduog         \_ ckl_nginx.1     nginx:latest        dm2                 Shutdown            Shutdown 29 seconds ago                       
t5xln1zllf3i        ckl_nginx.2         nginx:latest        dm1                 Running             Running 30 seconds ago                        
38yanzwce36u         \_ ckl_nginx.2     nginx:latest        dm1                 Shutdown            Shutdown 32 seconds ago


外網訪問:

666.png

777.png

檢視docker網路:

[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9a316505e6c8        bridge              bridge              local
bf0464ee4b94        ckl_net             bridge              local
33a5e13e7f47        ckl_net1            bridge              local
aed4e7c4891e        host                host                local
43z63iliw2ok        ingress             overlay             swarm  #swarm建立的overlay網路
cf895048ef39        none                null                local

五、service 之間通訊

5.1.建立overlay網路

[[email protected] ~]# docker network create --driver overlay ckl_ov
p6qmkf3jlbgescuwurwalu5me
[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
9a316505e6c8        bridge              bridge              local
bf0464ee4b94        ckl_net             bridge              local
33a5e13e7f47        ckl_net1            bridge              local
p6qmkf3jlbge        ckl_ov              overlay             swarm  #建立的新網路
aed4e7c4891e        host                host                local
43z63iliw2ok        ingress             overlay             swarm
cf895048ef39        none                null                local

5.2.建立web service

[[email protected] ~]# docker service create --name "ckl_web" --replicas=3 --network ckl_ov nginx
anlm52hs5p12efn5wras7h65v
[[email protected] ~]# docker service ps ckl_web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
tiqpv81m6icb        ckl_web.1           nginx:latest        dm2                 Running             Running about a minute ago                       
tl3i10w296kk        ckl_web.2           nginx:latest        dm1                 Running             Running about a minute ago                       
zdxxqy8zwnvt        ckl_web.3           nginx:latest        dm2                 Running             Running about a minute ago

5.3.建立centos service

[[email protected] ~]# docker service create --name "ckl_cent" --network ckl_ov centos sleep 10000
xut1xxmsp42mw4thixvd4iqt2
#兩個service屬於同一overlay網路


檢視service狀態:

[[email protected] ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xut1xxmsp42m        ckl_cent            replicated          1/1                 centos:latest       
anlm52hs5p12        ckl_web             replicated          3/3                 nginx:latest


[[email protected] ~]# docker service ps ckl_cent
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
fzs6ejkhangm        ckl_cent.1          centos:latest       dm1                 Running             Running 59 seconds ago

                 

5.4.在dm1上測試連通

[[email protected] ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
710f6b55400d        centos:latest       "sleep 10000"            About a minute ago   Up About a minute                       ckl_cent.1.fzs6ejkhangm3r0eh8v46zljx
5f0c2ba01f88        nginx:latest        "nginx -g 'daemon of…"   About an hour ago    Up About an hour    80/tcp              ckl_web.2.tl3i10w296kks0qnh0ri8i0i4
[[email protected] ~]# docker exec -it 710f6b55400d /bin/bash
[[email protected] /]# 
[[email protected] /]# 
[[email protected] /]# ping -c3 ckl_web
PING ckl_web (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2 (10.0.0.2): icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from 10.0.0.2 (10.0.0.2): icmp_seq=2 ttl=64 time=0.168 ms
64 bytes from 10.0.0.2 (10.0.0.2): icmp_seq=3 ttl=64 time=0.120 ms
--- ckl_web ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.120/0.136/0.168/0.025 ms

#10.0.0.2是service 的VIP

在dm1上檢視ip:

[[email protected] ~]# docker inspect 5f0c2ba01f88 | grep IPAddress 
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.4",

在dm2上檢視ip:

[[email protected] ~]# docker inspect `docker ps | grep ckl_web | awk '{print $1}'` | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.5",
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "10.0.0.3",

#對於ckl_cent只需要知道webservice 的名詞就可以訪問,而不需要知道serviceip

六、swarm 升級副本

6.1.檢視當前服務

[[email protected] ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
xut1xxmsp42m        ckl_cent            replicated          1/1                 centos:latest       
anlm52hs5p12        ckl_web             replicated          3/3                 nginx:latest
[[email protected] ~]# docker service ps ckl_web
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE          ERROR               PORTS
tiqpv81m6icb        ckl_web.1           nginx:latest        dm2      &n