网络关系

主机的网卡情况 ip a
6IM2{9%A`)AGAJMN]IDDES7.png

容器里面的网卡信息,容器中分配的ip 用的就是 主机中 docker0网卡的桥接 就是在该网段
image.png

每个启动容器后,主机的网卡中多一个跟容器互绑的网卡,【16-17 、17-16】配对出现,容器删除也随着没了
image.png

结论说明:

  • 容器内和主机的网是能够相互ping通的
  • 两个不同的容器间也是能够相互ping通的

image.png

查看网络信息, bridge 是默认桥接方式网络名称

  1. [root@localhost home]# docker network inspect bridge
  1. "Containers": {
  2. "85328438f00f7d5fb7a76bacd0c588fd9625a5e7c326a492eb24cb1faafe95bf": {
  3. "Name": "cc001",
  4. "EndpointID": "19b4cfbf38f7be11eb552942f67d642857ba90d2cd640a7033c6205e4b573b48",
  5. "MacAddress": "02:42:ac:11:00:02",
  6. "IPv4Address": "172.17.0.2/16",
  7. "IPv6Address": ""
  8. },
  9. "8b2bce6ab7983acba289495a3d9f363228ceb92c2bb5aea6ee04da1b7f31c296": {
  10. "Name": "cc002",
  11. "EndpointID": "c0a61342a0e69d3794fccaa84e9c1293f65630a4c9f611996f1c53df194ca312",
  12. "MacAddress": "02:42:ac:11:00:04",
  13. "IPv4Address": "172.17.0.3/16",
  14. "IPv6Address": ""
  15. }
  16. }

容器互连时 容器重启ip变化,使用—link

容器重启后 ip变了,导致连接不到,我们可以使用link,用容器名称[容器id] 去当做网络标识,这样就不用关心ip的变化,只有容器的名称变,类似与fengin

现在启动两个容器

  1. docker run -it --name cc001 centos # 172.17.0.2
  2. docker run -it --name cc002 centos # 172.17.0.3
  3. # ping 对方的地址 没有问题

ping 容器名称,默认是不行的

  1. [root@82f07025bf2d /]# ping cc002
  2. ping: cc002: Name or service not known

掉到cc001容器,重新run 加link, ping 容器名称 ok

  1. [root@localhost home]# docker run -it --name cc001 --link cc002 centos
  2. [root@85328438f00f /]# ping cc002
  3. PING cc002 (172.17.0.3) 56(84) bytes of data.
  4. 64 bytes from cc002 (172.17.0.3): icmp_seq=1 ttl=64 time=0.166 ms
  5. 64 bytes from cc002 (172.17.0.3): icmp_seq=2 ttl=64 time=0.077 ms

模拟cc002地址变更后 是否还能ping通

  1. docker run -it --name cc003 centos #启动以cc003 占用掉 172.17.0.3
  2. docker start cc002 #重新启动cc002 地址 172.17.0.4
  3. #cc001中 继续ping cc002, 发现0.3 变成了 0.4 没毛病
  4. [root@85328438f00f /]# ping cc002
  5. PING cc002 (172.17.0.4) 56(84) bytes of data.
  6. 64 bytes from cc002 (172.17.0.4): icmp_seq=1 ttl=64 time=0.149 ms
  7. 64 bytes from cc002 (172.17.0.4): icmp_seq=2 ttl=64 time=0.071 ms

link原理

他是在hosts文件 做了映射 cc002[8b2bce6ab798] 对应 它的地址,cc002的地址变了 hosts里的映射地址也随着变

  1. [root@85328438f00f /]# cat /etc/hosts
  2. 127.0.0.1 localhost
  3. ::1 localhost ip6-localhost ip6-loopback
  4. fe00::0 ip6-localnet
  5. ff00::0 ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters
  8. 172.17.0.4 cc002 8b2bce6ab798
  9. 172.17.0.2 85328438f00f

自定义网络

自定义网络,解决了不用 —link 也可以通过 容器名后id ping通
我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络!

查看网络

  1. [root@localhost home]# docker network ls
  2. NETWORK ID NAME DRIVER SCOPE
  3. 85028594255e bridge bridge local
  4. 7130848c292d host host local
  5. a8a172634e96 none null local
  6. 网络id 名称 连接方式

运行启动容器时, 默认网络 —net bridge

  1. docker -d --name cc001 centos #
  2. docker -d --name cc001 --net bridge centos # 默认网络bridge

创建一个网络

  1. [root@localhost home]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  2. 569fec80190f4636fefec3c14fa1ced0c21f0282c08c6470044dc805865f1702

启动两个容器, 指定网络mynet

  1. [root@localhost home]# docker run -it --name cc005 --net mynet centos # 192.168.0.2
  2. 2b3a9561a3327f7f1e0e700cf48fedee2bef87657b2a9243287cb2e7a9af8737
  3. [root@localhost home]# docker run -it --name cc006 --net mynet centos # 192.168.0.3
  4. dbfee4b090eb7bc234ee21e990d6b3878471e6123d3d7a75ce477c7f2583cdd0

直接在cc005 里ping cc006, ok

  1. [root@0116e2d76d04 /]# ping cc006
  2. PING cc006 (192.168.0.3) 56(84) bytes of data.
  3. 64 bytes from cc006.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.161 ms
  4. 64 bytes from cc006.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.074 ms

网络连通

不同网络容器之间的 通信
用 docker network connect 网络 容器,将 容器加入到 该网络

  1. docker network connect mybnet cc001

S