Docker网络
docker网络所有命令有误
理解网络

docker是如何处理容器网络访问的?
#清除所有的安装的容器docker rmi -f $(docker images -q)
[root@yuan ~]# docker run -d -P --name tomcat01 tomcat
# 查看容器的内部网络地址 ip addr,发现容器启动的是否会得到一个eth0@if85 ip地址,docker分配
[root@yuan ~]# docker exec -it tomcat01 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
84: eth0@if85: <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@yuan ~]# 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.395 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.149 ms
# Linux可以ping通docker容器内部
原理
我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是evth-pair技术
再次测试ip addr,多了一对网卡

# 我们发现这些网卡都是一对对的
# veth-pair 就是一对的虚拟设备接口,它们都是成对出现的,一段连着协议,一段彼此相连
# 正因为有这个特性veth-pair充当一个桥梁,连接各种虚拟网络设备
# OpenStack,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术

结论:tomcat01和tomcat02是共用的一个路由器,docker0
所有的容器在不指定网络的情况下,都是由docker0路由的,docker会给我们的容器分配一个默认的可用ip
Docker使用的是Linux桥接,宿主机中是一个Docker容器的网桥 docker0

Docker中所有的网络接口都是虚拟的,虚拟的转发效率比较高(内网传递文件)
只要容器删除,对应的网桥就没了
容器互联--Link
#无法直接ping通
[root@yuan ~]# docker exec -it tomcat01 ping tomcat02
OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "ping": executable file not found in $PATH: unknown
#通过link解决无法ping通的问题
[root@yuan ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
f5a0ca81fbe09fbfe68a774439a7060c7defd9052d0607fb6edd9fe52d02289b
[root@yuan ~]#docker exec -it tomcat03 ping tomcat02
[root@yuan ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
16a982e24a11 bridge bridge local
8136fc0f97dd host host local
21c46ca55896 none null local
[root@yuan ~]# docker inspect 16a982e24a11

探究原理
[root@yuan ~]# 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 798f4caab6e3
172. 17.0.4 0050dfc49003
--link就是我们在hosts配置中增加了一个172.18.0.3 tomcat02 798f4caab6e3
其实这个tomcat03就是本地配置了tomcat02的配置
本质探究:–link就是我们在hosts配置中增加了一个172.17.0.3 tomcat02 9f6a048802b9
我们现在 玩Docker已经不建议使用–link了!
自定义网络!不适用于docker0!
自定义网络
查看所有的docker网络
docker network ls

网络模式
bridge:桥接 docker(默认,自己创建的也是使用bridge模式)
none:不配置网络
host:和宿主机共享网络
container:容器内网络连通!(用的少!局限很大)
测试
清除所有安装的容器:docker rmi -f $(docker images -q)
# 我们直接启动的命令 --net bridge 而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0特点:默认,域名不能访问,--link可以打通连接
# 我么可以自定义一个网络
# 我么可以自定义一个网络
# --driver bridge
# --subnet 192.168.0.0/16 192.168.0.2 192.168.255.255
# --gateway 192.168.0.1
[root@yuan ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
02de698446c3bdb338b6333f19faca6bde36dc53718cd7fe981c70cfe125af74
[root@yuan ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
16a982e24a11 bridge bridge local
8136fc0f97dd host host local
02de698446c3 mynet bridge local
自定义的网络

[root@yuan ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
98527f2ee2cdf277eb0be601744290390663cb93b2ff7b0340b2a74c90e913c9
[root@yuan ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
e7e50b5b666d9d641a5c7ac78b034334483eaea54b6e57fc953f7cb014ce4e14

# 现在不需要使用--link也可以ping名字了!
[root@yuan ~]# 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.087 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.164 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.116 ms
64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.103 ms
**小结:**我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐使用这个网络
好处:
redis - 不同集群使用不同的网络,保证集群是健康和安全的
mysql - 不同集群使用不同的网络,保证集群是健康和安全的
网络联通
测试
[root@yuan ~]# docker run -d -P --name tomcat01 tomcat
7ec75032e914fc8bc13b91ab60d2dd15f8644b1e240233a3b07b79f690206477
[root@yuan ~]# docker run -d -P --name tomcat02 tomcat
98321d687578d7bb64fe23933c9a7a6beecd9f14c405439b131615be654130a7


# 测试打通 tomcat01 - mynet
[root@yuan ~]# docker network connect mynet tomcat01
# 连通之后将tomcat01放到了mynet网络下
# 一个容器两个ip地址 阿里云服务:公网ip 私网ip

# tomcat01 和tomcat-net-01是打通的
[root@yuan ~]# 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.099 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.139 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.165 ms
# tomcat02 和tomcat-net-01是没打通的
[root@yuan ~]# docker exec -it tomcat02 ping tomcat-net-01
ping: tomcat-net-01: Name or service not known
**结论:**如果需要跨网络操作别人,就需要使用docker network connect进行连通