zl程序教程

您现在的位置是:首页 >  工具

当前栏目

docker-容器间通信

Docker容器 间通信
2023-06-13 09:15:42 时间
[root@ubuntu1804 ~]#ip a

1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

 inet 127.0.0.1/8 scope host lo

 valid_lft forever preferred_lft forever

 inet6 ::1/128 scope host 

 valid_lft forever preferred_lft forever

2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc fq_codel state UP group default qlen 1000

 link/ether 00:0c:29:34:df:91 brd ff:ff:ff:ff:ff:ff

 inet 10.0.0.100/24 brd 10.0.0.255 scope global eth0

 valid_lft forever preferred_lft forever

 inet6 fe80::20c:29ff:fe34:df91/64 scope link 

 valid_lft forever preferred_lft forever

3: docker0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UP group default 

 link/ether 02:42:02:7f:a8:c6 brd ff:ff:ff:ff:ff:ff

 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

 valid_lft forever preferred_lft forever

 inet6 fe80::42:2ff:fe7f:a8c6/64 scope link 

 valid_lft forever preferred_lft forever

137: veth8ca6d43@if136: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue master docker0 state UP group default 

 link/ether fa:96:37:77:a9:a9 brd ff:ff:ff:ff:ff:ff link-netnsid 0

 inet6 fe80::f896:37ff:fe77:a9a9/64 scope link 

 valid_lft forever preferred_lft forever

141: vethf599a47@if140: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue master docker0 state UP group default 

 link/ether 96:e7:52:fe:67:54 brd ff:ff:ff:ff:ff:ff link-netnsid 1

 inet6 fe80::94e7:52ff:fefe:6754/64 scope link 

 valid_lft forever preferred_lft forever

[root@ubuntu1804 ~]#docker run -it --rm alpine:3.11 sh

/ # ip a

1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN qlen 1000

 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

 inet 127.0.0.1/8 scope host lo

 valid_lft forever preferred_lft forever

136: eth0@if137: BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN mtu 1500 qdisc noqueue state UP 

 link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

 valid_lft forever preferred_lft forever

/ # ping 172.17.0.3

PING 172.17.0.3 (172.17.0.3): 56 data bytes

64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.452 ms

64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.190 ms

--- 172.17.0.3 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.190/0.321/0.452 ms

/ # ping 172.17.0.1

PING 172.17.0.1 (172.17.0.1): 56 data bytes

64 bytes from 172.17.0.1: seq=0 ttl=64 time=0.139 ms

64 bytes from 172.17.0.1: seq=1 ttl=64 time=0.183 ms

--- 172.17.0.1 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.139/0.161/0.183 ms

范例:在第二个宿主机上创建容器,跨宿主机的容器通信

[root@ubuntu1804 ~]#docker pull alpine

Using default tag: latest

latest: Pulling from library/alpine

c9b1b535fdd9: Pull complete 

Digest: sha256:ab00606a42621fb68f2ed6ad3c88be54397f981a7b70a79db3d1172b11c4367d

Status: Downloaded newer image for alpine:latest

docker.io/library/alpine:latest

[root@ubuntu1804 ~]#docker ps 

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

cab76bbb3db2 alpine sh About a minute ago Up About a minute jolly_rosalind

[root@ubuntu1804 ~]#ip a

1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

 inet 127.0.0.1/8 scope host lo

 valid_lft forever preferred_lft forever

 inet6 ::1/128 scope host 

 valid_lft forever preferred_lft forever

2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc fq_codel state UP group default qlen 1000

 link/ether 00:0c:29:6b:54:d3 brd ff:ff:ff:ff:ff:ff

 inet 10.0.0.101/24 brd 10.0.0.255 scope global eth0

 valid_lft forever preferred_lft forever

 inet6 fe80::20c:29ff:fe6b:54d3/64 scope link 

 valid_lft forever preferred_lft forever

3: docker0: NO-CARRIER,BROADCAST,MULTICAST,UP mtu 1500 qdisc noqueue state DOWN group default 

 link/ether 02:42:1d:73:8b:71 brd ff:ff:ff:ff:ff:ff

 inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

 valid_lft forever preferred_lft forever

[root@ubuntu1804 ~]#docker ps 

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

[root@ubuntu1804 ~]#docker run -it --rm alpine sh

/ # ip a

1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN qlen 1000

 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

 inet 127.0.0.1/8 scope host lo

 valid_lft forever preferred_lft forever

4: eth0@if5: BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN mtu 1500 qdisc noqueue state UP 

 link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

 valid_lft forever preferred_lft forever

/ # ping -c 1 172.17.0.3

PING 172.17.0.3 (172.17.0.3): 56 data bytes

--- 172.17.0.3 ping statistics ---

1 packets transmitted, 0 packets received, 100% packet loss

4.2 容器名称互联

新建容器时,docker会给自动分配容器名称,容器ID和IP地址,导致容器名称,容器ID和IP不固定,那么如何区分不同的容器,实现和确定目标容器的通信呢?解决方案是给容器起个固定的名称,容器之间通过固定名称实现确定目标的通信

有两种固定名称:

容器名称的别名

注意:两种方式都最少需要两个容器才能实现

通过容器名称互联 容器名称介绍

即在同一个宿主机上的容器之间可以通过自定义的容器名称相互访问,比如:一个业务前端静态页面是使用nginx,动态页面使用的是tomcat,另外还需要负载均衡调度器,如:haproxy 对请求调度至nginx和tomcat的容器,由于容器在启动的时候其内部IP地址是DHCP 随机分配的,而给容器起个固定的名称,则是相对比较固定的,因此比较适用于此场景

容器名称实现

docker run 创建容器,可使用 link选项实现容器名称的引用

--link list Add link to another container

docker run --name 容器名称 先创建指定名称的容器

docker run --link 目标通信的容器ID或容器名称 再创建容器时引用上面容器的名称
实战案例:使用容器名称进行容器间通信 先创建第一个指定容器名称的容器
[root@ubuntu1804 ~]#docker run -it --name server1 --rm alpine:3.11 sh

/ # cat /etc/hosts

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2 cdb5173003f5

/ # ip a

1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN qlen 1000

 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

 inet 127.0.0.1/8 scope host lo

 valid_lft forever preferred_lft forever

150: eth0@if151: BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN mtu 1500 qdisc noqueue state UP 

 link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

 valid_lft forever preferred_lft forever

/ # ping 172.17.0.2

PING 172.17.0.2 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.038 ms

--- 172.17.0.2 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.038/0.038/0.038 ms

/ # ping server1

ping: bad address server1 

/ # ping cdb5173003f5

PING cdb5173003f5 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.040 ms

64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.128 ms

--- cdb5173003f5 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.040/0.084/0.128 ms

/ # 

新建第二个容器时引用第一个容器的名称

会自动将第一个主机的名称加入/etc/hosts文件,从而可以利用第一个容器名称进行访问

[root@ubuntu1804 ~]#docker run -it --rm --name server2 --link server1 alpine:3.11 sh

/ # cat /etc/hosts

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2 server1 cdb5173003f5

172.17.0.3 7ca466320980

/ # ping server1

PING server1 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.111 ms

--- server1 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.111/0.111/0.111 ms

/ # ping server2

ping: bad address server2

/ # ping 7ca466320980

PING 7ca466320980 (172.17.0.3): 56 data bytes

64 bytes from 172.17.0.3: seq=0 ttl=64 time=0.116 ms

64 bytes from 172.17.0.3: seq=1 ttl=64 time=0.069 ms

--- 7ca466320980 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.069/0.092/0.116 ms

/ # ping cdb5173003f5 

PING cdb5173003f5 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.072 ms

64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.184 ms

--- cdb5173003f5 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 0.072/0.128/0.184 ms

[root@ubuntu1804 ~]#docker ps 

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

7ca466320980 alpine:3.11 "sh" 24 seconds ago Up 23 seconds server2

cdb5173003f5 alpine:3.11 "sh" 7 minutes ago Up 7 minutes server1

容器别名介绍

自定义的容器名称可能后期会发生变化,那么一旦名称发生变化,容器内程序之间也必须要随之发生变化,比如:程序通过固定的容器名称进行服务调用,但是容器名称发生变化之后再使用之前的名称肯定是无法成功调用,每次都进行更改的话又比较麻烦,因此可以使用自定义别名的方式解决,即容器名称可以随意更,只要不更改别名即可

容器别名实现

命令格式:

docker run --name 容器名称 先创建指定名称的容器

docker run -d --name 容器名称 --link 目标容器名称 : 容器别名 #给上现创建的容器起别名,来创建新容器
实战案例:使用容器别名

范例:创建第三个容器,引用前面创建的容器,并起别名

[root@ubuntu1804 ~]#docker run -it --rm --name server3 --link server1:server1-alias alpine:3.11 sh

/ # cat /etc/hosts

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2 server1-alias cdb5173003f5 server1

172.17.0.4 d9622c6831f7

/ # ping server1

PING server1 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.101 ms

--- server1 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.101/0.101/0.101 ms

/ # ping server1-alias

PING server1-alias (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.073 ms

--- server1-alias ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.073/0.073/0.073 ms

范例:创建第四个容器,引用前面创建的容器,并起多个别名

[root@ubuntu1804 ~]#docker run -it --rm --name server4 --link server1: server1-alias1 server1-alias2 alpine:3.11 sh

/ # cat /etc/hosts

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

172.17.0.2 server1-alias1 server1-alias2 cdb5173003f5 server1

172.17.0.5 db3d2f084c05

/ # ping server1

PING server1 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.107 ms

--- server1 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.107/0.107/0.107 ms

/ # ping server1-alias1

PING server1-alias1 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.126 ms

--- server1-alias1 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.126/0.126/0.126 ms

/ # ping server1-alias2

PING server1-alias2 (172.17.0.2): 56 data bytes

64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.124 ms

--- server1-alias2 ping statistics ---

1 packets transmitted, 1 packets received, 0% packet loss

round-trip min/avg/max = 0.124/0.124/0.124 ms

/ #

本文链接:http://www.yunweipai.com/34872.html

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/52676.html

DockerHaproxynginxTomcatUbuntu