使用--link实现容器互联,很简单

2023-11-15

大家好,今天分享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实现容器互联就到这里了,谢谢大家

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用--link实现容器互联,很简单 的相关文章

随机推荐