INDEX
- §1 Docker 的网络
- §1.1 初识
- §1.2 用途
- §1.3 网络模式 / 网络驱动
- §1.4 指定网络模式
- §2 网络指令
- §3 自定义网络
§1 Docker 的网络
§1.1 初识
docker 的网络和虚拟机的网络类似
- 每个 docker 容器 (类比与虚拟机) 都会配置自己的网络设置
- docker 的网络可以在容器外单独创建,但最终需要连接到容器
例如:启动 docker 服务后,会出现下面网络
docker0 就是 Docker 默认网络模式 (bridge) 的默认网络
默认启动的容器若不针对网络进行设置就会自动连接到这个 docker network 上
§1.2 用途
- 用于将不同容器加入同一网段,以保证容器间通讯、端口映射
- 容器 IP 变动时通过服务名进行网络通讯
容器 IP 变动的影响,如下图,查看当前运行的 ubuntu 容器
可见IP地址如下
删除并重新运行另一个容器,为了区分,这里干脆换了个容器,再查看容器信息
上面过程简单模拟了实际使用场景下各种容器的创灭变动,可以看到 IP 是随着这个过程在不同容器上来回飘的
在不进行相关配置的前提下,这可能会导致下面场景
容器 A 与 容器 B 通信
容器 B 挂了
容器 C 创建,Docker 将去世的 容器 B 的 IP 分给了它,且这俩容器不是同一个镜像
容器 A 因为是通过 IP 连接的,所以现在和 容器 C 通信了
容器 D 作为 容器 B 的转世复活了,但已经被 容器 C NTR了
§1.3 网络模式 / 网络驱动
bridge
- 类似虚拟机的 NAT 模式
- 默认 网络模式,同时也适用于绝大多数场景
- 每个容器都生成自己的虚拟网卡
- 具有独立的 IP
- 容器自动连接到一个 docker0
bridge 网络的模型
随便进入一个 bridge 网络的容器,通过 yum -y install net-tools
安装 ifconfig
指令并使用,可见 容器网络 eth0
退出容器,在主机上查看 ifconfig
,可见 主机网络 ens33 、默认网桥 docker0 以及两个 主机上容器虚拟网络 veth
veth 网络有两个,因为现在有两个容器在运行
主机网络 ens33、网桥 docker0 、主机上容器虚拟网络 veth 和 容器网络 eth0 之间关系如下图
- docker0 相当于一个交换机,与主机的网络 ens33 相连
- veth 与 容器内的 eth0 两两配对,可以用
ip addr
指令各网络前的序号对照二者的对应关系 - 容器 A 的网络 eth0 通过对应的 veth 再经过 docker0 与主机 ens33 实现网络通讯
- 容器 A 的网络 eth0 通过对应的 veth 再经过 docker0,经由容器 B 的 veth 在经过容器 B 的 etho0 实现容器间的网络通讯
host
- 类似虚拟机的 BRIDGE 模式
- 容器不生成自己的虚拟网卡
- 使用主机的 IP 和端口
host 网络的模型
容器不再通过 容器内的 eth0 (host 模式下就压根没有 eth0) 与主机上的 虚拟网络 veth 匹配而达成通信
host 模式下的容器会直接使用主机的 IP 和端口,假设:
主机 IP 是 192.168.3.11,容器的 Dockerfile 中 EXPOSE 8080
则容器直接通过 192.168.3.11:8080 访问,若主机 8080 端口占用,顺次 +1
需要注意:host 网络模式下 docker run
的 -p
参数是失效的,伴随如下提示,如下例
WARNING: Published ports are discarded when using host network mode
none
- 容器有独立的 Network namespace
- 不进行任何网络设置(分配 veth pair、网桥连接、IP 等)
container
- 容器不生成自己的虚拟网卡
- 容器不配置自己的 IP
- 与另一个指定的容器共享 IP 和端口
- 当被共享的容器停止或变更网络时,当前容器会丢失网络或同步变更网络
container 网络的模型
§1.4 指定网络模式
docker run
时通过下面参数指定--network bridge
连接到网桥,默认使用 docker0
--network host
--network none
--network container:容器名或 ID
§2 网络指令
查看 docker 网络命令
docker network COMMAND
docker 容器连接到网络
docker network connect
创建 docker 网络
docker network ls
docker 容器断开网络连接
docker network disconnect
查看 docker 网络细节
显示网络的详细信息 (可以显示一个或多个)docker network inspect
查看 docker 网络模式
docker network ls
docker 裁剪
删除所有不用的网络docker network prune
不用的网络是指 一次也没有被链接 的网络
删除 docker 网络
docker network rm
§3 自定义网络
解决问题
同 §1.2 用途
步骤
新建网络
通过新建的网络启动容器
docker run -d -p 8081:8080 --network net_tomcat_01 --name tom tomcat
docker run -d -p 8080:8080 --network net_tomcat_01 --name tom1 tomcat
tom ping tom1
docker exec -it tom /bin/bash
ping tom1
自定义 bridge 网络 与默认 bridge 的区别
各个网络(其实就是虚拟网卡)如下图所示
自定义的网络 net_tomcat_01 是一个 bridge 网络,使用的虚拟网卡是 br-57865823eeb8
但 docker 本身有一个默认的 bridge 网络,就叫 bridge,使用的虚拟网卡是 docker0
使两个容器都指定默认的 bridge 网络是否可以达成上例中的效果?
docker run -d -p 8080:8080 --network bridge --name tom1 tomcat
docker run -d -p 8081:8080 --network bridge --name tom2 tomcat
比较四个 tomcat 的网络,未找到明显区别
因此只能理解为 默认的 bridge 网络中没有 DNS