docker-swarm网络

先删除上一次我们的三个副本

[root@node1 ~]# docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                               PORTS
q7nb1cpvvgqn        web1                replicated          3/3                 192.168.172.128:5000/httpd:latest   
[root@node1 ~]# docker service rm web1
web1

然后我们重新创建副本

[root@node1 ~]# docker service create --name webserver --replicas=2 httpd
tlfxl4w83kxpre4kq90hst5wm
overall progress: 2 out of 2 tasks 
1/2: running   
2/2: running   
verify: Service converged 
[root@node1 ~]# docker service ps webserver
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
82myr68i7217        webserver.1         httpd:latest        node2               Running             Running 34 seconds ago                       
qnijdtjuufne        webserver.2         httpd:latest        node3               Running             Running 33 seconds ago                       

通过docker   inspect  可以查看到容器的ip地址,容器只能访问内部的地址,但是访问不到外网的那个地址

 

[root@node2 ~]# curl 172.17.0.2
<html><body><h1>It works!</h1></body></html>

 

更新一下,暴露给外部

[root@node1 ~]# docker service update --publish-add 8889:80 webserver

我们再来访问一下用外部地址,发现可以访问到

[root@node2 ~]#  curl 192.168.172.131:8889
<html><body><h1>It works!</h1></body></html>

现在我们再查看一下网络

[root@node1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0cec315fc82b        bridge              bridge              local
6cfc4498f85f        docker_gwbridge     bridge              local
5d6420257a59        host                host                local
xpgy4pggvyjk        ingress             overlay             swarm
aef29cb54b5f        none                null                local

 

Ingress    swarm自动创建的一个网络  所有的swarm节点都可以使用这个网络

 

swarm2上跑一个容器

 

[root@node2 ~]# docker run -it --network container:webserver.1.89yc81js827uymtki5vodxot1 192.168.172.128:5000/busybox

 

进入容器以后会发现有两个网络

13: eth0@if14: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue 
    link/ether 02:42:0a:00:00:06 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.6/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
15: eth1@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue 
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth1
       valid_lft forever preferred_lft forever

和主机的docker_gwbridge对应

3: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:46:83:2f:85 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 brd 172.18.255.255 scope global docker_gwbridge
       valid_lft forever preferred_lft forever
    inet6 fe80::42:46ff:fe83:2f85/64 scope link 
       valid_lft forever preferred_lft forever

服务之间的互相通信

服务发现

一种实现方法是将所有服务都publish出去,然后通过routing mesh访问,但是缺点是将服务暴露到了外网,造成安全隐患问题

如果不更新,,那么swarm就要提供一种机制,能够让服务通过简单的方法访问到其他的服务,当服务副本的ip发生变化的时候,不会影响到访问该服务,当服务副本数量发生变化的时候不影响访问,通过服务发现,服务的使用者不需要知道服务在哪里运行,ip是多少,就能和服务通信

创建一个overlay网络

[root@node1 ~]# docker network create --driver overlay caoyi
1m4pbh5ocntq1a1m2qj21nyyl
[root@node1 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
0cec315fc82b        bridge              bridge              local
1m4pbh5ocntq        caoyi               overlay             swarm
6cfc4498f85f        docker_gwbridge     bridge              local
5d6420257a59        host                host                local
xpgy4pggvyjk        ingress             overlay             swarm
aef29cb54b5f        none                null                local

不可以直接使用ingress,因为ingress没有提供服务发现,所以必须创建自己的overlay网络

部署server到overlay

[root@node1 ~]# docker service create --name caoyi --replicas=3 --network caoyi httpd   ##使用刚才创建的overlay网络caoyi
sa5iunuj0n0ubor9a76wbfjk8
overall progress: 3 out of 3 tasks 
1/3: running   
2/3: running   
3/3: running   
verify: Service converged 

部署一个util服务用语测试挂载到同一个overlay网络

[root@node1 ~]# docker service create --name test --network caoyi busybox sleep 10000000
usr8hp1su61wfind9j2qn910b
overall progress: 1 out of 1 tasks 
1/1: running   
verify: Service converged 

sleep 10000000的作用是保持服务容器一直处于运行状态

验证

[root@node1 ~]# docker exec test.1.ndtocntqwf7u75u9bbnq3t5zi ping -c 3 caoyi
PING caoyi (10.0.1.2): 56 data bytes
64 bytes from 10.0.1.2: seq=0 ttl=64 time=0.082 ms
64 bytes from 10.0.1.2: seq=1 ttl=64 time=0.060 ms
64 bytes from 10.0.1.2: seq=2 ttl=64 time=0.057 ms

--- caoyi ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.057/0.066/0.082 ms

可以看到caoyi的ip为10.0.1.2这是caoyi服务中的vip,swarm会将对vip的访问负载均衡dao每一个副本

"VirtualIPs": [
                {
                    "NetworkID": "1m4pbh5ocntq1a1m2qj21nyyl",
                    "Addr": "10.0.1.2/24"

滚动更新

[root@node1 ~]# docker  pull   httpd:2.2
2.2: Pulling from library/httpd
f49cf87b52c1: Pull complete 
24b1e09cbcb7: Pull complete 
8a4e0d64e915: Pull complete 
bcbe0eb4ca51: Pull complete 
16e370c15d38: Pull complete 
Digest: sha256:9784d70c8ea466fabd52b0bc8cde84980324f9612380d22fbad2151df9a430eb
Status: Downloaded newer image for httpd:2.2
docker.io/library/httpd:2.2
[root@node1 ~]# docker  pull   httpd:2.4
2.4: Pulling from library/httpd
Digest: sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51
Status: Downloaded newer image for httpd:2.4
docker.io/library/httpd:2.4
[root@node1 ~]# docker tag httpd:2.2 192.168.172.128:5000/httpd:2.2
[root@node1 ~]# docker tag httpd:2.4 192.168.172.128:5000/httpd:2.4
[root@node1 ~]# docker push 192.168.172.128:5000/httpd:2.2
The push refers to repository [192.168.172.128:5000/httpd]
ab5efd5aec77: Pushed 
9058feb62b4a: Pushed 
3f7f50ced288: Pushed 
71436bd6f1c4: Pushed 
4bcdffd70da2: Pushed 
2.2: digest: sha256:558680adf8285edcfe4813282986eb7143e3c372610c6ba488723786bd5b34c5 size: 1366
[root@node1 ~]# docker push 192.168.172.128:5000/httpd:2.4
The push refers to repository [192.168.172.128:5000/httpd]
5d727ac94391: Layer already exists 
4cfc2b1d3e90: Layer already exists 
484fa8d4774f: Layer already exists 
ca9ad7f0ab91: Layer already exists 
13cb14c2acd3: Layer already exists 
2.4: digest: sha256:ad116b4faf32a576572c1501e3c83ecae52ed3ba161de2f50a89d24b796bd3eb size: 1367

以上是下载httpd2.2和httpd2.4以及给镜像标签 上传镜像到私有仓库

现在我们来查看一下httpd的版本先运行一个httpd2.2

[root@node1 ~]# docker run -it 192.168.172.128:5000/httpd:2.2 apachectl -v
Server version: Apache/2.2.34 (Unix)
Server built:   Jan 18 2018 23:12:10
[root@node1 ~]# docker service update --image 192.168.172.128:5000/httpd myweb
caoyi
overall progress: 3 out of 3 tasks   ##更新一下再来查看
1/3: running   [==================================================>] 
2/3: running   [==================================================>] 
3/3: running   [==================================================>] 
verify: Service converged 

现在更新完以后我们再来查看

[root@node1 ~]# docker exec -it caoyi.1.j0urb78ojfo1f3b8wve7bo4sn apachectl -v
Server version: Apache/2.4.43 (Unix)
Server built:   Jun  9 2020 07:00:39

我们把副本加到5个 每次更新两个  间隔1分20秒

[root@node1 ~]# docker service update --replicas 5 --update-parallelism 2 --update-delay 30s myweb

查看当前服务的配置

[root@node1 ~]# docker service inspect --pretty myweb

ID:        sa5iunuj0n0ubor9a76wbfjk8
Name:        myweb
Service Mode:    Replicated
 Replicas:    5
Placement:
UpdateConfig:
 Parallelism:    2
 Delay:        30s
 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:        192.168.172.128:5000/httpd:latest@sha256:ad116b4faf32a576572c1501e3c83ecae52ed3ba161de2f50a89d24b796bd3eb
 Init:        false
Resources:
Networks: caoyi 
Endpoint Mode:    vip

 

 

 可以看到更新的时候卡住了30秒,每次更新两个

现在我们看看有没有从2.2更新到2.4

[root@node1 ~]# docker service ps myweb
ID                  NAME                IMAGE                            NODE                DESIRED STATE       CURRENT STATE                 ERROR               PORTS
zz2at22n9d1y        myweb.1             192.168.172.128:5000/httpd:2.4   node1               Running             Running 2 minutes ago                             
encntggj4u77         \_ myweb.1         192.168.172.128:5000/httpd:2.2   node2               Shutdown            Shutdown 2 minutes ago                            
rmmzup05knrr        myweb.2             192.168.172.128:5000/httpd:2.4   node2               Running             Running 2 minutes ago                             
fvxt7jwccg90         \_ myweb.2         192.168.172.128:5000/httpd:2.2   node1               Shutdown            Shutdown 2 minutes ago                            
jox66cx2stxy        myweb.3             192.168.172.128:5000/httpd:2.4   node2               Running             Running about a minute ago                        
skbbzxi6tnk6         \_ myweb.3         192.168.172.128:5000/httpd:2.2   node2               Shutdown            Shutdown about a minute ago                       
ruy30btf8m7r        myweb.4             192.168.172.128:5000/httpd:2.4   node1               Running             Running 2 minutes ago                             
rc9c8r043dw5         \_ myweb.4         192.168.172.128:5000/httpd:2.2   node3               Shutdown            Shutdown 2 minutes ago                            
vduuqlxqs71g        myweb.5             192.168.172.128:5000/httpd:2.4   node3               Running             Running 2 minutes ago                             
mivpa3fgwb43         \_ myweb.5         192.168.172.128:5000/httpd:2.2   node3               Shutdown            Shutdown 2 minutes ago                            

镜像的回滚

[root@node1 ~]# docker   service   update  --rollback  myweb
myweb
rollback: manually requested rollback 
overall progress: rolling back update: 5 out of 5 tasks 
1/5: running   
2/5: running   
3/5: running   
4/5: running   
5/5: running   
verify: Service converged 
[root@node1 ~]# docker service ps myweb
ID                  NAME                IMAGE                            NODE                DESIRED STATE       CURRENT STATE                 ERROR               PORTS
6iody3mpjwo5        myweb.1             192.168.172.128:5000/httpd:2.2   node3               Running             Running about a minute ago                        
zz2at22n9d1y         \_ myweb.1         192.168.172.128:5000/httpd:2.4   node1               Shutdown            Shutdown about a minute ago                       
encntggj4u77         \_ myweb.1         192.168.172.128:5000/httpd:2.2   node2               Shutdown            Shutdown 9 minutes ago                            
qtnpapix26x7        myweb.2             192.168.172.128:5000/httpd:2.2   node2               Running             Running about a minute ago                        
rmmzup05knrr         \_ myweb.2         192.168.172.128:5000/httpd:2.4   node2               Shutdown            Shutdown about a minute ago                       
fvxt7jwccg90         \_ myweb.2         192.168.172.128:5000/httpd:2.2   node1               Shutdown            Shutdown 9 minutes ago                            
y06ujqzd1vdr        myweb.3             192.168.172.128:5000/httpd:2.2   node2               Running             Running about a minute ago                        
jox66cx2stxy         \_ myweb.3         192.168.172.128:5000/httpd:2.4   node2               Shutdown            Shutdown about a minute ago                       
skbbzxi6tnk6         \_ myweb.3         192.168.172.128:5000/httpd:2.2   node2               Shutdown            Shutdown 8 minutes ago                            
ydtuu63pq08d        myweb.4             192.168.172.128:5000/httpd:2.2   node1               Running             Running about a minute ago                        
ruy30btf8m7r         \_ myweb.4         192.168.172.128:5000/httpd:2.4   node1               Shutdown            Shutdown about a minute ago                       
rc9c8r043dw5         \_ myweb.4         192.168.172.128:5000/httpd:2.2   node3               Shutdown            Shutdown 9 minutes ago                            
2pdi87j6nt1l        myweb.5             192.168.172.128:5000/httpd:2.2   node3               Running             Running about a minute ago                        
vduuqlxqs71g         \_ myweb.5         192.168.172.128:5000/httpd:2.4   node3               Shutdown            Shutdown about a minute ago                       
mivpa3fgwb43         \_ myweb.5         192.168.172.128:5000/httpd:2.2   node3               Shutdown            Shutdown 9 minutes ago                            

Replicated mode global mode

第一种是根据资源的不同在节点上生成容器或停止容器

第二种是在每一个节点生成一个容器有且只有一个(不同服务名除外)

 

[root@node1 ~]# docker  service   create   --name web1 --mode global 192.168.172.128:5000/httpd
zqfp5b77ux7jdxcjle81jqtqu
overall progress: 3 out of 3 tasks 
wl9tv3om7ubb: running   
hv3mxu6u7l7e: running   
35rbxdx15fmi: running   
verify: Service converged 

 

查看服务信息

[root@node1 ~]# docker service inspect --pretty web1
Name:        web1
Service Mode:    Global     ##  模式是global

使用label控制容器在那个节点上

 

为每个节点定义label

 

[root@node1 ~]# docker  node   update  --label-add   env=test    node2
node2

 

[root@node1 ~]# docker node inspect --pretty node2
ID:            hv3mxu6u7l7ei2h565c52yuf2
Labels:
 - env=test     ##

查看

为node3设置

[root@node1 ~]# docker    node   update  --label-add     env=test2 node3
node3

创建服务全部放在labels=test

 

[root@node1 ~]# docker  service create   --name  web2  --replicas 5  --constraint  node.labels.env==test   httpd
9qtdv8by3r3zgimnjkrwqdcku
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@node1 ~]# docker service ps web2
ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
cetig5x4t4xx        web2.1              httpd:latest        node2               Running             Running 18 seconds ago                       
9duicmaqvzjr        web2.2              httpd:latest        node2               Running             Running 18 seconds ago                       
gfmer9k3etr3        web2.3              httpd:latest        node2               Running             Running 18 seconds ago                       
wtpuarblwryc        web2.4              httpd:latest        node2               Running             Running 18 seconds ago                       
lnq954vuav7r        web2.5              httpd:latest        node2               Running             Running 18 seconds ago         

 

查看

[root@node1 ~]# docker  service   inspect --pretty   web2

ID:        9qtdv8by3r3zgimnjkrwqdcku
Name:        web2
Service Mode:    Replicated
 Replicas:    5
Placement:
 Constraints:    [node.labels.env==test]
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:        httpd:latest@sha256:387f896f9b6867c7fa543f7d1a686b0ebe777ed13f6f11efc8b94bec743a1e51
 Init:        false
Resources:
Endpoint Mode:    vip

迁移服务:

 

先删除标签为test的服务

 

docker  service  update   --constraint-rm   node.labels.env==test  web2

 

再新添加一个

docker  service  update   --constraint-add   node.labels.env==test2  web1
docker  service create   --name web3  --mode   global    --constraint  node.labels.env==test     192.168.172.128:5000/httpd