大家好,今天分享docker 使用–link实现容器互联
运行镜像
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest fb5657adc892 5 months ago 680MB
[root@localhost ~]# docker run -d -P --name tomcat110 tomcat
66a07f503ef467112b2c3ffa43872593b3c108119898d6eb2fcdbcded8a5f28c
[root@localhost ~]#
[root@localhost ~]# docker run -d -P --name tomcat112 tomcat
5159e166f18b000f19e305d44ebd7633647ec927cc51ba7bc598f1ea5c30d136
[root@localhost ~]#
查看现在的容器状态
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5159e166f18b tomcat "catalina.sh run" 36 seconds ago Up 31 seconds 0.0.0.0:49154->8080/tcp, :::49154->8080/tcp tomcat112
66a07f503ef4 tomcat "catalina.sh run" 2 minutes ago Up 2 minutes 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp tomcat110
查看tomcat112容器的系统信息
[root@localhost ~]# docker inspect 5159e166f18b
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.3",
"IPPrefixLen": 16,
注意看它的ip地址
查看tomcat110容器的系统信息
[root@localhost ~]# docker inspect 66a07f503ef4
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
进入tomcat112 容器
[root@localhost ~]# docker exec -it 5159e166f18b /bin/bash
或者:
[root@localhost ~]# docker exec -it tomcat112 /bin/bash
这里,会遇见一个问题就是tomcat 容器没有ping 命令
先apt update
然后apt install -y net-tools
apt install -y iproute2
apt install -y iputils-ping
这样就解决了
tomcat容器里查看ip 地址
root@5159e166f18b:/usr/local/tomcat# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.3 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:03 txqueuelen 0 (Ethernet)
RX packets 3943 bytes 10455523 (9.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3342 bytes 183387 (179.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
安装ip addr
root@5159e166f18b:/usr/local/tomcat# apt install -y iproute2
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
iproute2 is already the newest version (5.10.0-4).
0 upgraded, 0 newly installed, 0 to remove and 38 not upgraded.
root@5159e166f18b:/usr/local/tomcat# ip addr
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
110: eth0@if111: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
tomcat112容器可以和tomcat110容器通信
root@5159e166f18b:/usr/local/tomcat# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.161 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.058 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.063 ms
64 bytes from 172.17.0.2: icmp_seq=5 ttl=64 time=0.060 ms
此时,我们进入tomcat110 容器,也发现了同样的问题
[root@localhost ~]# docker exec -it tomcat110 /bin/bash
root@66a07f503ef4:/usr/local/tomcat# ping 172.17.0.3
bash: ping: command not found
继续这样的操作```
```c
root@66a07f503ef4:/usr/local/tomcat# apt update
Get:1 http://security.debian.org/debian-security bullseye-security InRelease [44.1 kB]
Get:2 http://deb.debian.org/debian bullseye InRelease [116 kB]
Get:3 http://deb.debian.org/debian bullseye-updates InRelease [39.4 kB]
Get:4 http://security.debian.org/debian-security bullseye-security/main amd64 Packages [153 kB]
Get:5 http://deb.debian.org/debian bullseye/main amd64 Packages [8182 kB]
Get:6 http://deb.debian.org/debian bullseye-updates/main amd64 Packages [2592 B]
Fetched 8537 kB in 1min 56s (73.7 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
38 packages can be upgraded. Run 'apt list --upgradable' to see them.
root@66a07f503ef4:/usr/local/tomcat#
使一下这条命令
root@66a07f503ef4:/usr/local/tomcat# apt list
root@66a07f503ef4:/usr/local/tomcat# apt install -y net-tools
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
net-tools
0 upgraded, 1 newly installed, 0 to remove and 38 not upgraded.
Need to get 250 kB of archives.
After this operation, 1015 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian bullseye/main amd64 net-tools amd64 1.60+git20181103.0eebece-1 [250 kB]
Fetched 250 kB in 5s (54.3 kB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package net-tools.
(Reading database ... 12672 files and directories currently installed.)
Preparing to unpack .../net-tools_1.60+git20181103.0eebece-1_amd64.deb ...
Unpacking net-tools (1.60+git20181103.0eebece-1) ...
Setting up net-tools (1.60+git20181103.0eebece-1) ...
root@66a07f503ef4:/usr/local/tomcat# apt install -y iproute2
root@66a07f503ef4:/usr/local/tomcat# apt install -y iputils-ping
root@66a07f503ef4:/usr/local/tomcat# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 4541 bytes 10487891 (10.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3351 bytes 184301 (179.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@66a07f503ef4:/usr/local/tomcat# ip addr
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
108: eth0@if109: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
测试通信,没问题
root@66a07f503ef4:/usr/local/tomcat# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.093 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.030 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.029 ms
64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.032 ms
在服务器上使用容器名通信(发现不行)
root@66a07f503ef4:/usr/local/tomcat# exit
exit
[root@localhost ~]# docker exec -it tomcat110 ping tomcat112
ping: tomcat112: Name or service not known
[root@localhost ~]#
使用–link 操作 ,再起来一个容器
[root@localhost ~]# docker run -d -P --name tomcat456 --link tomcat110 tomcat
0615c2c3282066a25fae64c970e947ac97346be93cca9c52f2e8b83c018a6fa9
[root@localhost ~]#
这个时候就可以通信了,可以通过服务名通信
[root@localhost ~]# docker exec -it tomcat456 ping tomcat110
PING tomcat110 (172.17.0.2) 56(84) bytes of data.
64 bytes from tomcat110 (172.17.0.2): icmp_seq=1 ttl=64 time=0.149 ms
64 bytes from tomcat110 (172.17.0.2): icmp_seq=2 ttl=64 time=0.062 ms
64 bytes from tomcat110 (172.17.0.2): icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from tomcat110 (172.17.0.2): icmp_seq=4 ttl=64 time=0.056 ms
64 bytes from tomcat110 (172.17.0.2): icmp_seq=5 ttl=64 time=0.057 ms
注意: 一定进入tomcat456 容器 进行
先apt update
然后apt install -y net-tools
apt install -y iproute2
apt install -y iputils-ping
接着再来:
反过来就不行(这是正常现象)
[root@localhost ~]# docker exec -it tomcat110 ping tomcat456
ping: tomcat456: Name or service not known
[root@localhost ~]#
查看各个容器的网络配置
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
e732e2bdedd8 bridge bridge local
ee31e7fae1fa host host local
4ca0c1161cc8 none null local
看一下它具体的网络信息
[root@localhost ~]# docker network inspect e732e2bdedd8
[
{
"Name": "bridge",
"Id": "e732e2bdedd88e10a6ad0502fcfa3bc2c8b2b8652e45b02d92ad188a856457a9",
"Created": "2022-06-02T10:50:41.480114705+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"0615c2c3282066a25fae64c970e947ac97346be93cca9c52f2e8b83c018a6fa9": {
"Name": "tomcat456",
"EndpointID": "05bde1d4af2644e48a784021dcdfc7816ef79a5efca240327e766589830e15e7",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
"5159e166f18b000f19e305d44ebd7633647ec927cc51ba7bc598f1ea5c30d136": {
"Name": "tomcat112",
"EndpointID": "99f22b3fabb49c13d9b90b6977b9b09528b18afca1c8a0ffbe464f81785e31b6",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"66a07f503ef467112b2c3ffa43872593b3c108119898d6eb2fcdbcded8a5f28c": {
"Name": "tomcat110",
"EndpointID": "af45153984c07b46453bb86ad2999f14fcbe8b1d9c04a77760ae8d52b0f18422",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
其实,刚才我们使用–link可以通信的本质上就是
[root@localhost ~]# docker exec -it tomcat456 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 tomcat110 66a07f503ef4
172.17.0.4 0615c2c32820
这里做了一个映射
理解上面和vim /etc/hosts 一样
好了,有关于使用–link实现容器互联就到这里了,谢谢大家