1. Docker0网络
先清理之前的所有镜像和容器:
# 清理所有容器
docker rm -f $(docker ps -aq)
# 清理所有镜像
docker rmi -f $(docker images -qa)
查看网络环境
ip addr
三个网络。
Docker 是如何处理容器访问的?
# 跑起一个tomcat容器
docker run -d -P --name tomcat01 tomcat
# 查看容器内部的网络地址
[root@LYX ~]# 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
440: eth0@if441: <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
# 发现容器启动的时候会得到一个 eth0@if441 ip地址,这是docker分配的。
Linux可以ping通 docker 容器内部
原理:
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡dockerO桥接模式,使用的技术是
veth-pair
技术!(Veth pair 是一对虚拟网卡,从一张veth网卡发出的数据包可以直接到达它的peer veth,两者之间存在着虚拟链路。)
再查看网络:
-
可以发现容器带来的网卡都是一对一对的
-
veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟络设备的
-
openstack,Docker容器之间的连接,oVs的连接,都是使用evth-pair 技术
如果这个时候再启动一个tomcat02容器。tomcat01和tomcat02之间也是可以ping通的!
结论:tomcat01和tomcat02是公用的一个路由器,docker0。所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP
小结:
Docker使用的是Linux的桥接,宿主机中是一个Dokcer容器的网桥docker0。Docker中所有的网络接口都是虚拟的,因为虚拟的转发效率高。
只要容器删除,对应的veth-pair对也就没了。
2. 容器互联 --link
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat02 tomcat
docker exec -it tomcat02 ping tomcat01
直接两容器间直接ping。
这时候可以通过--link
将容器联通就可以了。
# 新建一个tomcat03容器,并联通tomcat02
docker run -d -P --name tomcat03 --link tomcat02 tomcat
# 用tomcat03 ping tomcat02
docker exec -it tomcat03 ping tomcat02
发现可以ping通了
这个链接是双向的吗?
# 用tomcat02 ping tomcat03
docker exec -it tomcat02 ping tomcat03
发现并不可以!
查看tomcat03的host文件,看看他的网络映射详细情况:
总结:
--link
就是在hosts配置中增加相连容器的映射(DNSj解析)现在大多数情况下已经不再使用
--link
,大多都是使用自定义网络,不使用docker0。docker0问题:他不支持容器名连接访问。
3. 自定义网络
# 查看docker的network
docker network ls
网络模式:
bridge
:桥接。docker默认。(比如02节点和03节点之间通过01桥接)none
:不配置网络。host
:和宿主机共享网络。container
:容器内网络连通(用的少,局限大)
测试:
测试前删除所有容器,清理环境:
docker rm -f $(docker ps -aq)
# 我们之前直接启动的容器默认会带一个桥接网卡,即:
docker run -d -P --name tomcat01 tomcat = docker run -d -P --name tomcat01 --net bridge tomcat
docker0特点
:默认的,域名不能访问,–link可以打通
自定义网络:
# 创建一个网络
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
使用自定义网络启动容器:
docker run -d -P --name tomcat-net-01 --net mynet tomcat
docker run -d -P --name tomcat-net-02 --net mynet tomcat
再查看我们的mynet信息:

# 再用 01 直接 ping 02
docker exec -it tomcat-net-01 ping tomcat-net-02
可以ping通。
**总结:**我们自定义的网络docker都已经帮我们维护好了对应的关系,推荐这样使用网络!
好处:如果要搭多集群(redis集群、mysql集群…),不同的集群使用不同的网络,保证集群是安全健康的。
4. 网络连通
使用命令:
联通:
# 创建tomcat-01 tomcat-02
docker run -d -P --name tomcat-01 tomcat
docker run -d -P --name tomcat-02 tomcat
# tomcat-01 连接到mynet
docker network connect mynet tomcat-01
# 再查看mynet网络详细信息
docker network inspect mynet
可以看到tomcat-01已经连接上mynet。
相当于一个容器两个ip地址
tomcat-01也能ping通mynet网络内的容器!