Dokcer下四种网络模式[包懂篇]

简介

本篇文章将为你详细介绍 docker 下四种网络模式的区别是什么:

  1. host 模式的容器和宿主机共用一个“Network Namespace”;
  2. Container 模式创建的容器会与指定的容器共享 IP 和端口范围;
  3. None 模式关闭了容器的网络功能;
  4. Bridge 默认模式为每个容器分配设置 IP。

1. Bridge 模式

当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连接到这个虚拟网桥上。
虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

从 docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。【这个 docker0 理解为一个交换机】

在主机上创建一对虚拟网卡 veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中,以 vethxxx 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以通过brctl show命令查看。【相当于虚拟光缆】

bridge 模式是 docker 的默认网络模式,不写–net 参数,就是 bridge 模式。

使用 docker run -p 时,docker 实际是在iptables做了 DNAT 规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。bridge 模式如下图所示:
桥接模式

演示代码:

docker run -tid --net=bridge --name docker_bri1 \
             ubuntu-base:v3
docker run -tid --net=bridge --name docker_bri2 \
             ubuntu-base:v3

brctl show
docker exec -ti docker_bri1 /bin/bash
docker exec -ti docker_bri2 /bin/bash

ifconfig –a
route –n

网络内网段:

专用 IP 地址: 就是我们在 3 类地址中常见到内网的 IP 段。

A 类:10.0.0.0–10.255.255.255
B 类:172.16.0.0--172.31.255.255
C 类:192.168.0.0--192.168.255.255

例如: 下面方式创建网桥:

  1. 创建网桥

查看当前网桥 docker network ls

查看某个网桥具体信息 docker inspect bragename

docker 创建网桥
docker network create --gateway 172.16.1.1 --subnet 172.16.1.0/24 app_subnet

查看网桥的具体信息将会看到

"Config": [
  {
    "Subnet": "172.16.0.0/16",
    "Gateway": "172.16.0.1"
  }
]

2.创建对外服务 nginx,例如使用如下的方式:

docker run -p 0.0.0.0:80:80 -p 0.0.0.0:443:443 --name nginx  \
--restart=always --network app_subnet --ip 172.16.1.2 \
-v /data/srv/code/duojoy_push/UniPush:/www \
-v /data/srv/code/duojoy_push/docs/bj6-c-zzyf-douhua-admin01/nginx/conf/:/etc/nginx/ \
-v /data/srv/code/http_logs/:/data/logs/ -d nginx

2. Host 模式

如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network Namespace。容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

Host 模式如下图所示:
host模式

演示:

docker run -tid --net=host --name docker_host1 ubuntu-base:v3
docker run -tid --net=host --name docker_host2 ubuntu-base:v3
docker exec -ti docker_host1 /bin/bash
docker exec -ti docker_host2 /bin/bash

ifconfig –a
route –n

3. Container 模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。

Container 模式示意图:
Container模式

演示:

docker run -tid --net=container:docker_bri1 \
              --name docker_con1 ubuntu-base:v3
docker exec -ti docker_con1 /bin/bash
docker exec -ti docker_bri1 /bin/bash
ifconfig –a
route -n

4. None 模式

使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置 IP 等。

Node 模式示意图:
None模式

演示:

docker run -tid --net=none --name \
                docker_non1 ubuntu-base:v3
docker exec -ti docker_non1 /bin/bash
ifconfig –a
route -n
关于我
loading