Docker 网络

SunnyFan大约 3 分钟约 881 字

Docker 网络

理解Docker0(使用ip addr查看网卡信息)

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理 解为一个软件交换机。它会在挂载到它的网口之间进行转发。

当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外 一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到

docker0 网桥,名称以 veth 开头(例如 vethAQI2QT )。通过这种方式,主机可以跟容器通信,容器 之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。

图

原理:

  1. 我们每启动一个docker容器,docker就会给容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0。
  2. 桥接模式,使用的技术是veth-pair技术。
  3. 这个容器带来的网卡都是一一对应的。
  4. veth-pair就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连。
  5. 正因为有这个特性,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。

不需要用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)。

一张图总结Docker的命令

图