Docker网络篇(二)

     上篇 Docker网络篇_dotaer-df的博客-CSDN博客 讲到了Docker0的作用,它其实有局限性,因为容器会经常重启,重启后ip地址会变化,那么再用原来的ip进行通信,肯定是行不通了,有没有一种方法通过名字来进行通信了。有两种方案一种是容器启动时候制定--link,一种是自定义网络,下面详细的介绍一下这两种方案。


一、--link

--link list                      Add link to another container

 (1) 容器run时,不指定--link,可以看到01无法ping通02

(2)容器run时,指定--link

 可以看到启动mycentos02的时候指定了 --link 与01进行了绑定,然后我们通过02 ping 01是可以ping通的。但是反过来01 ping 02就是不行的


那原理是什么呢?其实很简单,我们可以进入02容器里,查看 /etc/hosts这个文件

可以发现它把 01 与 172.17.0.2作了一个绑定 ,同时加了容器的id,也就是我们ping容器id也是可以ping通的。

二、通过自定义网络(常用)

我们先通过docker network命令查看当前的一个网络

[root@iZbp1csuqi4s80m3g73awpZ home]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
37f5939b2d4f   bridge    bridge    local
7aafef127881   host      host      local
40ef83445d70   none      null      local

其中:

  • bridge:桥接,即docker0(默认)
  • none:不配置网络
  • host:和宿主机共享网络

然后我们通过 docker network create来创建一个网络

[root@iZbp1csuqi4s80m3g73awpZ home]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
929ad745cafb8e53974e57b059374cf2b77b9454e629c54644b1a198947469fe
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
37f5939b2d4f   bridge    bridge    local
7aafef127881   host      host      local
929ad745cafb   mynet     bridge    local
40ef83445d70   none      null      local

--driver #指定网络模式使用桥接模式(同时也是默认值) 

--subnet #指定可以互相访问的网段 192.168.0.0/16(192.168.0.1 ~ 192.168.255.254)

--gateway #指定网关,所有容器互相访问都要通过这个网关

mynet #自定义网络的名字

看一下我们自定义网络的详细信息

[root@iZbp1csuqi4s80m3g73awpZ home]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "929ad745cafb8e53974e57b059374cf2b77b9454e629c54644b1a198947469fe",
        "Created": "2022-05-19T15:30:00.140680599+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": {}
    }
]

可以看到上面这一部分的containers中有正在运行的所有容器和他们的ip。当运行容器不指定ip的时候,它就会随机分配一个ip,而随机分配的数量也是有限制的,通过上文指定的--subnet。

然后启动的时候通过--net指定我们自定义的网络就ok了

docker run -dit --name mycentos03 --net mynet mycentos:1.0 /bin/bash

docker run -dit --name mycentos04 --net mynet mycentos:1.0 /bin/bash

[root@iZbp1csuqi4s80m3g73awpZ home]# docker run -dit --name mycentos03 --net mynet mycentos:1.0 /bin/bash
4493f89702bbfb9142cac33a6ca5e5218025cf35d674214b77728cf8a034917b
[root@iZbp1csuqi4s80m3g73awpZ home]# docker run -dit --name mycentos04 --net mynet mycentos:1.0 /bin/bash
374fe4415d538389bf41dbffa7e1b94d6b4f1729830b9aba23ec11178d210f7a
d[root@iZbp1csuqi4s80m3g73awpZ home]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED             STATUS             PORTS     NAMES
374fe4415d53   mycentos:1.0   "/bin/bash"   3 seconds ago       Up 1 second                  mycentos04
4493f89702bb   mycentos:1.0   "/bin/bash"   10 seconds ago      Up 9 seconds                 mycentos03
8ee919784d2c   mycentos:1.0   "/bin/bash"   About an hour ago   Up About an hour             mycentos02
ba6330c7064d   mycentos:1.0   "/bin/bash"   About an hour ago   Up About an hour             mycentos01
[root@iZbp1csuqi4s80m3g73awpZ home]# docker exec -it 374fe4415d53 ping mycentos03
PING mycentos03 (192.168.0.2) 56(84) bytes of data.
64 bytes from mycentos03.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.127 ms
64 bytes from mycentos03.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.078 ms
[root@iZbp1csuqi4s80m3g73awpZ home]# docker exec -it 4493f89702bb ping mycentos04
PING mycentos04 (192.168.0.3) 56(84) bytes of data.
64 bytes from mycentos04.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from mycentos04.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.101 ms
64 bytes from mycentos04.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.094 ms

三、connect

我们都知道不同网段是通常是不能访问的,01是在Docker0这个网络下,03是在mynet这个网络下,处在不同网段,如下图

 那如何实现01访问03呢,答案是通过connect

 先看一下这个命令如何使用

[root@iZbp1csuqi4s80m3g73awpZ home]# docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network connect mynet mycentos01
[root@iZbp1csuqi4s80m3g73awpZ home]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "929ad745cafb8e53974e57b059374cf2b77b9454e629c54644b1a198947469fe",
        "Created": "2022-05-19T15:30:00.140680599+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": {
            "374fe4415d538389bf41dbffa7e1b94d6b4f1729830b9aba23ec11178d210f7a": {
                "Name": "mycentos04",
                "EndpointID": "9d7763fc71a2a99e81d3e47ad33e72b024b24d0823a0a62948c4f45bbeba8e53",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "4493f89702bbfb9142cac33a6ca5e5218025cf35d674214b77728cf8a034917b": {
                "Name": "mycentos03",
                "EndpointID": "06b457fd1d66e1244a36d59e71de570499c0cc8cb628568da10cedbd7f225324",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            },
            "ba6330c7064d9db63bcbe7e31937e4c77f126299c146de405cf70b74e459b139": {
                "Name": "mycentos01",
                "EndpointID": "aacc3a21391798ceaf96981a056e5cf89ceed9870ec4b38925f7b7e368057cac",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

# 连通之后就是mycentos01 放到了mynet网路下,可以看到ip也变了,这样一个容器就有了两个ip地址,01和03,04就可以互通了

参考链接:

【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值