Dokcer下四种网络模式[包懂篇]
简介
本篇文章将为你详细介绍 docker 下四种网络模式的区别是什么:
- host 模式的容器和宿主机共用一个“Network Namespace”;
- Container 模式创建的容器会与指定的容器共享 IP 和端口范围;
- None 模式关闭了容器的网络功能;
- 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
例如: 下面方式创建网桥:
- 创建网桥
查看当前网桥 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 模式如下图所示:
演示:
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 模式示意图:
演示:
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 模式示意图:
演示:
docker run -tid --net=none --name \
docker_non1 ubuntu-base:v3
docker exec -ti docker_non1 /bin/bash
ifconfig –a
route -n