Docker网络
理解Docker0
# 新建容器
[root@ecss6 /]# docker run -d -P --name tomcat01 tomcat
# 查看容器内部网络地址
[root@ecss6 /]# 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
78: eth0@if79: <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 docker内的网络地址可以成功。
[root@ecss6 /]# 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.062 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.052 ms
# 我们查看服务器的网络地址
[root@ecss6 /]# 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:0e:96:be brd ff:ff:ff:ff:ff:ff
inet 172.27.218.212/20 brd 172.27.223.255 scope global dynamic eth0
valid_lft 315099279sec preferred_lft 315099279sec
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:fb:a6:4b:f0 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
79: veth1a75958@if78: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether e2:60:2d:5c:65:2a brd ff:ff:ff:ff:ff:ff link-netnsid 0
# 发现容器内和服务器都多了一个网络地址,成对增加
# evth-pair技术就是一对虚拟设备接口,一段连接协议,一段彼此相连。
小结
Docker使用的是Linux的桥接,宿主机中是一个docker容器的网桥 docker0。
Docker中的网络接口都是虚拟的,转发效率高。
容器被删除对应的一对网桥也随之删除!
–link
# 我们启动一个容器tomcat02
[root@ecss6 /]# docker run -d -P --name tomcat02 tomcat
9b47d16918d5ae0e049076425884a5960c3f085589728ba5b6b7e4d5ab6d7430
[root@ecss6 /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b47d16918d5 tomcat "catalina.sh run" 3 seconds ago Up 2 seconds 0.0.0.0:49154->8080/tcp tomcat02
c0c72fc50e3d tomcat "catalina.sh run" About an hour ago Up About an hour 0.0.0.0:49153->8080/tcp tomcat01
# 执行tomcat02 ping tomcat01的命令
[root@ecss6 /]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known
# 发现无法成功
# 再新建一个容器tomcat03
[root@ecss6 /]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
c209e639bbdc33e93d52cfe5ae8d20bf0946d8d2211236924655b93c61aedee5
# 再次尝试Ping
[root@ecss6 /]# 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.083 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.093 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.073 ms
# 发现ping成功了!
# 但是反向,让tomcat02 ping tomcat03发现ping失败:
[root@ecss6 /]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
–link其实就是在hosts文件中增加了绑定的地址,但目前已不推荐使用此命令!
自定义网络
查看所有的docker网络
我们可以自定义一个网络:
# 使用如下命令
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
我们在这个网络中新建两个容器
docker run -d -P --name tomcat-net01 --net mynet tomcat
docker run -d -P --name tomcat-net02 --net mynet tomcat
# 然后使用docker network inspect命令查看网络内部信息
docker network inspect mynet
我们使用ping命令去测试与tomcat-net02容器的连接,ping成功!这里使用ip地址。
再使用容器名尝试
同样ping成功!
网络连通
# 测试连通tomcat01和tomcat-net01
docker network connect mynet tomcat01
docker network inspect mynet
可以发现connect命令就是把tomcat01的信息放到了mynet网络下。
结论:如果要跨网络操作,就需要使用docker network connect连通!
结论:如果要跨网络操作,就需要使用docker network connect连通!