测试
三个网络
# 问题: docker 是如何处理容器网络访问的?注:那个容器的ID(ca5d44e0a844)是我创建的centos的容器的ID
[root@iZuf61n8ywv9zx27oeoajoZ /]# docker run -it centos /bin/bash [root@ca5d44e0a844 /]# [root@iZuf61n8ywv9zx27oeoajoZ /] #这里按了 Ctrl + P + Q #查看容器的内部网络地址 ip addr , 发现容器启动的时候会得到一个 eth0@if2176 ip地址 , docker分配的 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker exec -it ca5d44e0a844 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 2175: eth0@if2176: <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 #思考:linux能不能 ping 通容器内部! [root@iZuf61n8ywv9zx27oeoajoZ /]# 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.052 ms 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.039 ms 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.042 ms 64 bytes from 172.17.0.2: icmp_seq=4 ttl=64 time=0.042 ms #linux 可以ping 通 docker 容器内部我们每安装一个docker容器, docker就会给docker容器分配一个ip, 我们只要安装了docker, 就会有一个网卡 docker0
桥接模式, 使用的技术是 evth-pair技术
再次测试 ip addr
[root@iZuf61n8ywv9zx27oeoajoZ /]# 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 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:16:93:3d brd ff:ff:ff:ff:ff:ff inet 172.19.14.174/20 brd 172.19.15.255 scope global dynamic eth0 valid_lft 315301052sec preferred_lft 315301052sec 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:64:79:d4:89 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 6: br-a8b173597bb8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:c3:7c:be:ea brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-a8b173597bb8 valid_lft forever preferred_lft forever 2176: veth9a1d701@if2175: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 16:85:4a:83:39:57 brd ff:ff:ff:ff:ff:ff link-netnsid 0 # 可以看到 启动一个容器后, 再次测试, 又多了一个地址(并且紧接着容器的序号2175)再启动一个容器测试 , 发现又多了一对网卡~
注意:我们前台没有进程,所以采用 下面第一行的方式(在上面一个小坑里有讲)
[root@iZuf61n8ywv9zx27oeoajoZ /]# docker run -dit --name centos03 centos /bin/bash b65544cf33c7be0495fe10c104ee21f8c8dfb96148bd89811aff2d0f49e58e98 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b65544cf33c7 centos "/bin/bash" 4 seconds ago Up 3 seconds centos03 ca5d44e0a844 centos "/bin/bash" 2 hours ago Up 2 hours angry_albattani [root@iZuf61n8ywv9zx27oeoajoZ /]# 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 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:16:93:3d brd ff:ff:ff:ff:ff:ff inet 172.19.14.174/20 brd 172.19.15.255 scope global dynamic eth0 valid_lft 315295582sec preferred_lft 315295582sec 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:64:79:d4:89 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 6: br-a8b173597bb8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:c3:7c:be:ea brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-a8b173597bb8 valid_lft forever preferred_lft forever 2176: veth9a1d701@if2175: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 16:85:4a:83:39:57 brd ff:ff:ff:ff:ff:ff link-netnsid 0 2184: vethba9afa3@if2183: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 52:a3:09:4b:af:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 1 # 可以发现, 当我又启动一个容器之后,发现又多了一对网卡 2184: vethba9afa3@if2183 #我们发现这个容器带来网卡, 都是一对对的 #evth-pair 就是一对的虚拟设备接口, 它们都是成对出现的, 一段接着协议, 一段彼此连接 #正因为有了这个特性, evth-pair 充当一个桥梁, 连接各种虚拟网络设备的 #OpenStac, Docker容器之间的连接, ovs的连接,都是使用 evth-pair技术我们在测试一下 centos03 和 angry_albattani(第一个创建的centos容器,忘记起名了) 是否可以 ping 通
注:172.17.0.3就是 centos03 的地址
[root@iZuf61n8ywv9zx27oeoajoZ /]# docker exec -it angry_albattani ping 172.17.0.3 PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.070 ms 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.050 ms 64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.052 ms # 结论: 容器和容器之间是可以互相 ping 通的 !结论:
tomcat01 和 tomcat02 是公用的一个路由器 , docker0所有的容器不指定网络的情况下, 都是docker0 路由的, docker 会给我们的容器分配一个默认的可用ip再来个图Docker中所有的网络接口都是虚拟的。 虚拟的转发效率高!(内网传递文件!)
(注: 由上图还可以知道bridge 是 默认的)
只要容器删除, 对应的网桥就没了
[root@iZuf61n8ywv9zx27oeoajoZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b65544cf33c7 centos "/bin/bash" 29 minutes ago Up 29 minutes centos03 ca5d44e0a844 centos "/bin/bash" 2 hours ago Up 2 hours angry_albattani [root@iZuf61n8ywv9zx27oeoajoZ /]# docker stop ca5d44e0a844 ca5d44e0a844 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b65544cf33c7 centos "/bin/bash" 29 minutes ago Up 29 minutes centos03 [root@iZuf61n8ywv9zx27oeoajoZ /]# 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 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:3e:16:93:3d brd ff:ff:ff:ff:ff:ff inet 172.19.14.174/20 brd 172.19.15.255 scope global dynamic eth0 valid_lft 315293800sec preferred_lft 315293800sec 3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:64:79:d4:89 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever 6: br-a8b173597bb8: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:c3:7c:be:ea brd ff:ff:ff:ff:ff:ff inet 172.18.0.1/16 brd 172.18.255.255 scope global br-a8b173597bb8 valid_lft forever preferred_lft forever 2184: vethba9afa3@if2183: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default link/ether 52:a3:09:4b:af:a3 brd ff:ff:ff:ff:ff:ff link-netnsid 1 # 我们可以发现, 一开始的centos镜像的那对网卡 2176: veth9a1d701@if2175: 没了思考一个场景, 我们编写了一个微服务, database url=ip:,项目不重启, 数据库ip换掉了, 我么希望可以处理这个问题,可以用名字来进行访问容器?
[root@iZuf61n8ywv9zx27oeoajoZ /]# docker run -dit --name centos04 centos /bin/bash 43d1f86349ce46b03a091761fd6ff4a97b192e7b642c6463173f3f7316616337 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 43d1f86349ce centos "/bin/bash" 6 seconds ago Up 5 seconds centos04 b65544cf33c7 centos "/bin/bash" 38 minutes ago Up 38 minutes centos03 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker exec -it centos03 ping centos04 ping: centos04: Name or service not known # 我们可以发现, 直接用容器名 ping 另一个容器是行不通的 #如何解决呢? #通过 --link 即可以解决网络连通问题 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker run -dit --name centos05 --link centos04 centos /bin/bash 1260d728cb24544185c37b0eb60bae4f4d662ffb21cbb1174a763bc518e29d92 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker exec -it centos05 ping centos04 PING centos04 (172.17.0.2) 56(84) bytes of data. 64 bytes from centos04 (172.17.0.2): icmp_seq=1 ttl=64 time=0.083 ms 64 bytes from centos04 (172.17.0.2): icmp_seq=2 ttl=64 time=0.060 ms 64 bytes from centos04 (172.17.0.2): icmp_seq=3 ttl=64 time=0.056 ms ^C --- centos04 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2ms rtt min/avg/max/mdev = 0.056/0.066/0.083/0.013 ms #反向可以ping通吗? [root@iZuf61n8ywv9zx27oeoajoZ /]# docker exec -it centos04 ping centos05 ping: centos05: Name or service not known # 显然不可以, 因为 04没有配置其实这个centos05 就是在本地配置了centos04的配置?
#查看 hosts 配置,在这里发现了! [root@iZuf61n8ywv9zx27oeoajoZ /]# docker exec -it centos05 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 centos04 43d1f86349ce #### 172.17.0.4 1260d728cb24 # 所以说, --link就是在我们在hosts配置中增加了一个172.17.0.2 centos04 43d1f86349ce但是,现在docker已经不建议使用 --link了!
我们现在用
自定义网络! 不适用docker0
docker0问题:它不支持容器名连接访问!
容器互联(–link 和 自定义网络)
#查看所有的docker网络 [root@iZuf61n8ywv9zx27oeoajoZ /]# docker network ls NETWORK ID NAME DRIVER SCOPE 7059ad9236ba bridge bridge local 96c9192b5221 host host local 8756c5d558ef none null local a8b173597bb8 test_default bridge local网络模式
bridge:桥接docker(默认,自己创建也使用这个模式)
none:不配置网络
host:和宿主机共享网络
container:容器内网络连通!(用得少!局限很大)
我们自定义的网络docker都已经帮我们维护好了相对应的关系, 推荐我们平时这样使用网络!
好处:
redis-不同的集群使用不同的网络 , 保证集群是安全和健康的
mysql-不同的集群使用不同的网络 , 保证集群是安全和健康的
结论:假设要跨网络操作别人, 就需要使用 docker network connect连通!