Docker学习笔记(十七)— 容器互联(–link,自定义网络),网络连通

Docker Alice 5个月前 (12-21) 200次浏览 0个评论

Docker 容器互联

一、容器互联之--link

接上节【Docker 学习笔记(十六)— Docker0 网络详解】,我们知道通过 ip 测试 ping 连接,容器内部是可以 ping 通的。

那么通过容器名是否能够互相 ping 通?

# 测试:通过容器名 ping 连接
[root@cloud ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

# 发现无法 ping 通

解决方法:
通过--link就可以解决网络连通问题

# --link 命令
[root@cloud ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat:9.0
c33876c9c6c53dd5c3e722265f4a7bead9a4afa011db547fc6efe44e52a19f28

# 再次测试通过容器名 ping 连接,发现能 ping 通!
[root@cloud ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.203 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.076 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.069 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.081 ms

# 反向是否可以 ping 通?
[root@cloud ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
# 发现 --link 是单向的,tomcat02 无法 ping 通 tomcat03

查看 tomcat03 的配置文件

# 查看 tomcat03 的 hosts 文件
[root@cloud ~]# docker exec -it tomcat03 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.3	tomcat02 418b6338ca59
172.17.0.4	c33876c9c6c5

# 发现 --link 就是在 hosts 配置文件中增加了一个 172.17.0.3	tomcat02 418b6338ca59 映射
# 反之,在 tomcat02 的配置文件中并没有这样一个配置,所以反向是无法 ping 通的!
[root@cloud ~]# docker exec -it tomcat02 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.3	418b6338ca59
总结:
  现在 Docker 已经不建议使用--link
  使用自定义网络,不使用 docker0!
  docker0 是一个官方的网桥,有很多局限,它不支持容器名连接访问!

 

二、容器互联之自定义网络

查看所有的 docker 网络

[root@cloud ~]# docker network --help
[root@cloud ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
bdfb62a5d66a   bridge    bridge    local
a892ce6ea3b7   host      host      local
224773ce41ec   none      null      local
网络模式:
  bridge:桥接模式(默认,自己创建的网络也使用桥接模式),即在 docker 上搭桥
  host:和宿主机共享网络
  none:不配置网络
  container:容器内网络联通(用的少,局限很大,不建议使用)
# 我们直接启动一个容器的命令时,默认就带参数--net bridge,它就是 docker0。
docker run -d -P --name tomcat01 tomcat:9.0
docker run -d -P --name tomcat01 --net bridge tomcat:9.0 # 等同上面的命令

# docker0 特点:默认,域名不能访问,--link 可以打通连接!

自定义网络

# 删除所有容器,保证测试环境干净
[root@cloud ~]# docker rm -f $(docker ps -aq)

# 自定义一个网络 mynet
# --driver bridge 桥接
# --subnet 192.168.0.0/16  子网
# --gateway 192.168.0.1  网关,路由器地址
[root@cloud ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
8adf8a0dbc9b5f7f012eea6d355bcbde36447be6f75d3e172edb0d0e42987513

# 查看 docker 网络,多了一个 mynet
[root@cloud ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
bdfb62a5d66a   bridge    bridge    local
a892ce6ea3b7   host      host      local
8adf8a0dbc9b   mynet     bridge    local
224773ce41ec   none      null      local

查看 mynet 信息

[root@cloud ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "8adf8a0dbc9b5f7f012eea6d355bcbde36447be6f75d3e172edb0d0e42987513",
        "Created": "2021-12-18T14:47:08.679352116+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
# 到这里,网络就创建好了

用自定义的网络 mynet 启动 2 个容器

[root@cloud ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat:9.0
beb804f98f26e8ba89e5da51d7e9c72d0836d765c667bb7632438c181bc64cd8
[root@cloud ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat:9.0
c0fc4067aad37f500d4876d19fc25d6ea2715b2732da17c05d032709d08ea4e8

再次查看 mynet 信息,可以看到有两个关联的容器 tomcat-net-01,tomcat-net-02

[root@cloud ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "8adf8a0dbc9b5f7f012eea6d355bcbde36447be6f75d3e172edb0d0e42987513",
        "Created": "2021-12-18T14:47:08.679352116+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.0.0/16",
                    "Gateway": "192.168.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "beb804f98f26e8ba89e5da51d7e9c72d0836d765c667bb7632438c181bc64cd8": {
                "Name": "tomcat-net-01",
                "EndpointID": "e7e4d1e3e726d3238ad1b4d9d44b5919c935d3734eac8cf6fca3d0bd8c88015b",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "c0fc4067aad37f500d4876d19fc25d6ea2715b2732da17c05d032709d08ea4e8": {
                "Name": "tomcat-net-02",
                "EndpointID": "9f98a98fdeb39f361e3294989260a844b0aaa1af95977d3940b12b1b54245a4b",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

再次测试 ping 连接

# 通过 ip 测试 ping 连接
[root@cloud ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.103 ms
64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.099 ms
64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.110 ms

# 通过容器名测试 ping 连接,发现不使用--link 也可以连接了!
[root@cloud ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.129 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.078 ms
总结:
  自定义的网络,docker 已经维护了对应的关系。
  优点:不同的集群(redis,mysql)使用不同的网络,保证集群的健康和安全

 

三、网络连通(不在同一网段的两个容器)

测试不同网段的容器是否能 ping 通

# 使用默认网络 docker0(即 bridge)创建 2 个容器 tomcat01,tomcat02
[root@cloud ~]# docker run -d -P --name tomcat01 tomcat:9.0
7b15c071d18638e893147af8ead378a0bf7a6a3d9c2d230ef0871b80df824a47
[root@cloud ~]# docker run -d -P --name tomcat02 tomcat:9.0
c3f9671c0011726f9f1a06414e63f1dbedfc1d7493ac1856e3c42b8c2f18c885

# 测试 tomcat01 尝试 ping 连接 tomcat-net-01,发现不能 ping 通
[root@cloud ~]# docker exec -it tomcat01 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
# 测试打通 tomcat01 - mynet
[root@cloud ~]# docker network connect mynet tomcat01

# 查看 mynet 网络信息
[root@cloud ~]# docker network inspect mynet
# 发现:连通之后,就是将 tomcat01 放到了 mynet 网络下,即一个容器两个 ip 地址!

Docker 学习笔记(十七)— 容器互联(--link,自定义网络),网络连通

再次 ping 测试

# tomcat01 连通 ok
[root@cloud ~]# docker exec -it tomcat01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.162 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.083 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.082 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.082 ms

# tomcat02 依旧不通(因为 tomcat02 与 mynet 网络没有打通)
[root@cloud ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
结论:
  如果需要跨网络操作容器,则需要使用docker network connect连通

 

分享:Docker 学习视频地址:【狂神说 Java】Docker 最新超详细版教程通俗易懂


女程序员博客 , 版权所有丨本站采用BY-NC-SA协议进行授权 , 转载请注明Docker 学习笔记(十七)— 容器互联(–link,自定义网络),网络连通

【声明】:本博客仅为分享信息,不参与任何交易,也非中介,所有内容仅代表个人观点,均不作直接、间接、法定、约定的保证,读者购买风险自担。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。

【关于安全】:任何 IDC 都有倒闭和跑路的可能,备份永远是最佳选择,服务器也是机器,不勤备份是对自己极不负责的表现,请保持良好的备份习惯。

喜欢 (3)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址