Docker 网络
Docker 网络
理解Docker0(使用ip addr查看网卡信息)
当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理 解为一个软件交换机。它会在挂载到它的网口之间进行转发。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外 一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到
docker0 网桥,名称以 veth 开头(例如 vethAQI2QT )。通过这种方式,主机可以跟容器通信,容器 之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
原理:
- 我们每启动一个docker容器,docker就会给容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0。
- 桥接模式,使用的技术是veth-pair技术。
- 这个容器带来的网卡都是一一对应的。
- veth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连。
- 正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备的。
如图,tomcat01和tomcat02是公用的一个路由器,docker0所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用IP。
Docker中的所有网络接口都是虚拟的。虚拟的转发效率高!只要删除容器,对应的一对网桥就没了。
容器访问外网
容器要想访问外部网络,需要本地系统的转发支持。
在Linux 系统中,检查转发是否打开。
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
如果为 0,说明没有开启转发,则需要手动打开。
sysctl -w net.ipv4.ip_forward=1
如果在启动 Docker 服务的时候设定 --ip-forward=true, Docker 就会自动设定系统的 ip_forward 参数 为 1。
–link
不需要用ip直接用容器名(服务名)ping
docker exec -it tomcat02 ping tomcat01
上面的无法ping通!
docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping tomcat02
此时就可以ping同通
原理:
docker exec -it tomcat03 cat /etc/hosts
总结:
–link就是在hosts配置中增加一个映射
查看网络信息
docker network ls
docker network inspect 网络ID
网络模式
bridge:桥接模式(默认)
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用得少,局限大)
docker run -d -P --name tomcat01 --net bridge tomcat
docker0特点:默认,域名不能访问,–link可以打通
docker network create --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
解释:docker network create 桥接的网络模式 子网 网关 名称
docker run -d -P --name tomcat01 --net mynet tomcat
可以直接互相ping通
docker exec -it tomcat01 ping tomcat02
网络连通
docker network connect mynet tomcat00
不同网络下的容器也能互相连通,tomcat00是其他网络下的容器
Docker底层实现和网络实现
Docker 底层的核心技术包括 Linux 上的名字空间(Namespaces)、控制组(Control groups)、Union 文
件系统(Union file systems)和容器格式(Container format)。
Docker 的网络实现其实就是利用了 Linux 上的网络名字空间和虚拟网络设备(特别是 veth pair)。