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

黑裙docker网心云设置硬盘大小 docker 网心云_黑裙docker网心云设置硬盘大小


退出容器,在主机上查看 ifconfig,可见 主机网络 ens33默认网桥 docker0 以及两个 主机上容器虚拟网络 veth

黑裙docker网心云设置硬盘大小 docker 网心云_容器_02


veth 网络有两个,因为现在有两个容器在运行

黑裙docker网心云设置硬盘大小 docker 网心云_IP_03


主机网络 ens33、网桥 docker0 、主机上容器虚拟网络 veth 和 容器网络 eth0 之间关系如下图

黑裙docker网心云设置硬盘大小 docker 网心云_黑裙docker网心云设置硬盘大小_04

  • 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

黑裙docker网心云设置硬盘大小 docker 网心云_黑裙docker网心云设置硬盘大小_05


需要注意:host 网络模式下 docker run-p 参数是失效的,伴随如下提示,如下例

WARNING: Published ports are discarded when using host network mode

黑裙docker网心云设置硬盘大小 docker 网心云_容器_06

none

  • 容器有独立的 Network namespace
  • 不进行任何网络设置(分配 veth pair、网桥连接、IP 等)

container

  • 容器不生成自己的虚拟网卡
  • 容器不配置自己的 IP
  • 与另一个指定的容器共享 IP 和端口
  • 当被共享的容器停止或变更网络时,当前容器会丢失网络或同步变更网络

container 网络的模型

黑裙docker网心云设置硬盘大小 docker 网心云_云原生_07

§1.4 指定网络模式

docker run 时通过下面参数指定
--network bridge 连接到网桥,默认使用 docker0--network host--network none--network container:容器名或 ID

§2 网络指令

查看 docker 网络命令

docker network COMMAND

黑裙docker网心云设置硬盘大小 docker 网心云_IP_08


docker 容器连接到网络

docker network connect

创建 docker 网络

docker network ls

docker 容器断开网络连接

docker network disconnect

查看 docker 网络细节

显示网络的详细信息 (可以显示一个或多个)
docker network inspect

查看 docker 网络模式

docker network ls

黑裙docker网心云设置硬盘大小 docker 网心云_云原生_09


docker 裁剪

删除所有不用的网络
docker network prune 不用的网络是指 一次也没有被链接 的网络

删除 docker 网络

docker network rm

§3 自定义网络

解决问题

同 §1.2 用途

步骤

新建网络

黑裙docker网心云设置硬盘大小 docker 网心云_黑裙docker网心云设置硬盘大小_10


通过新建的网络启动容器

docker run -d -p 8081:8080 --network net_tomcat_01 --name tom tomcatdocker run -d -p 8080:8080 --network net_tomcat_01 --name tom1 tomcat

黑裙docker网心云设置硬盘大小 docker 网心云_云原生_11


tom ping tom1

docker exec -it tom /bin/bash

ping tom1

黑裙docker网心云设置硬盘大小 docker 网心云_黑裙docker网心云设置硬盘大小_12

自定义 bridge 网络 与默认 bridge 的区别

各个网络(其实就是虚拟网卡)如下图所示

黑裙docker网心云设置硬盘大小 docker 网心云_容器_13

自定义的网络 net_tomcat_01 是一个 bridge 网络,使用的虚拟网卡是 br-57865823eeb8
但 docker 本身有一个默认的 bridge 网络,就叫 bridge,使用的虚拟网卡是 docker0
使两个容器都指定默认的 bridge 网络是否可以达成上例中的效果?

docker run -d -p 8080:8080 --network bridge --name tom1 tomcatdocker run -d -p 8081:8080 --network bridge --name tom2 tomcat

黑裙docker网心云设置硬盘大小 docker 网心云_docker_14


黑裙docker网心云设置硬盘大小 docker 网心云_IP_15

比较四个 tomcat 的网络,未找到明显区别
因此只能理解为 默认的 bridge 网络中没有 DNS