Docker 网络 ¶
理解 Docker 网络 ¶
有三个网络地址
网卡名称 | ip 地址 | 作用 |
---|---|---|
lo | 127.0.0.1 | 本机回环地址 |
enp34s0 | 192.168.1.99 | 服务器内网 ip |
docker0 | 172.17.0.1 | docker 0 地址 |
docker 是如何处理容器网络的? ¶
1、启动一个容器 ¶
docker run -it -d --name test01 -e ROOT_PASSWORD=test01 -e USER_NAME=test01 -e USER_PASSWORD=test01 -e USER_FOLDER='opt/test01' -it hacklab/docker-nettools:latest bash
2、查看容器内 ip 信息 ¶
发现
容器启动的时候会得到一个 eth0@if26492 的ip地址,docker 分配的
docker exec -it test01 ip -c a
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
26491: eth0@if26492: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:06 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.6/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
原理
1、我们每启动一个 docker 容器, docker 就会给 docker 容器分配一个 ip ,我们只要安装了 docker ,就会有一个网卡 docker0 桥接模式,使用的技术是 evth-pair 技术!
2、桥接模式使用的 evth-pair 技术!
3、对比宿主机与容器内ip ¶
结论
- 我们发现这个容器带来网卡,都是一对对的
- evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段话在着协议,一段彼此相连
- 正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的
4. 启动一个新容器、看容器间是否能通信 ¶
docker run -it -d --name test02 -e ROOT_PASSWORD=test01 -e USER_NAME=test01 -e USER_PASSWORD=test01 -e USER_FOLDER='opt/test01' -it hacklab/docker-nettools:latest bash
结论
新容器 test02 可以 ping test01
5、 结论 ¶
结论
- test01 和 test02 是公用的一个路由器 docker0
- 所有的容器不指定网络的情况下,都是 docker0 路由的, docker 会给我们的容器分配一个默认的可用 IP
- 每启动一个 docker 容器, docker 就会给 docker 容器分配一个 ip ,我们只要安装了 docker ,就会有一个网卡 docker0 桥接模式,使用的技术是 evth-pair 技术!
- Docker 中的所有的网络接口都是虚拟的。虚拟的转发效率高! 内网传递文件!
--link ¶
本质探究: --link 就是我们在 hosts 配置中增加了一个 172.18.0.3 可以使用服务名访问、单向的、想要双向通信 两个容器都需要 link、后续可用 compose 配置。 docker 0 不支持容器访问。后续使用 自定义网络。
自定义网络 ¶
网络模式 ¶
- bridge: 桥接 docker 0.2 0.3 0.4
- host: 和宿主机共享网络
- none:不配置网络
Docker0特点
默认服务名不能访问,--link 可以打通连接、较为麻烦 默认自带了 --net bridge
使用一个自定义网络 ¶
1、创建一个自定义网络 mynet ¶
docker network create --driver bridge --subnet 10.10.200.0/16 --gateway 10.10.0.0 mynet
2、在 mynet 网络中启动两个容器 ¶
docker run -it -d --name test03 -e ROOT_PASSWORD=test01 -e USER_NAME=test01 -e USER_PASSWORD=test01 -e USER_FOLDER='opt/test01' -it --net mynet hacklab/docker-nettools:latest bash
3、查看相关信息 ¶
docker network inspect mynet|grep -A 20 "Containers"

注意
--link 不需要指定、自定义的网络 docker 都已经帮我们维护好了对应的关系,推荐我们平时这样使用网络
4、测试 docker 0 与自定义网络 mynet 间的连通性 ¶
mynet 中的 test03 访问 docker0 中的 test02 失败
5、尝试将 docker 0 与自定义网络 mynet 间连通 ¶
docker network connect mynet test02

此时 test02 拥有了两个IP
- docker0 网络中的 172.17.0.7
- mynet 网络中的 10.10.0.4
将 docker0 中的 test02 放置到了 mynet 网络中
- 使 mynet 中的 test03 访问 docker0 中的 test02 成功。
- 没有连接的 test01 依旧旨在 docker0 网络中。只能与处在 docker 0 网络中的 test02 通信。