Docker 入门之网络基础
缘起
本想写"docker 入门之网络",但是越写越多,算了,还是拆开把,先写基础。
建议先看这篇:
网络基础
首先理解一下docker网络的三个核心概念,或者说核心技术支柱:
先看图,以实践来理解概念,比较容易一点:
bash
# 启动一个容器
docker run -it --rm --name debian debian:trixie /bin/bash
- 网络命名空间(Network Namespace)
每个容器拥有独立的网络命名空间,这意味着它有自己独立的:
- IP 地址
- 路由表
- 防火墙规则
- 网络接口(如
eth0)
使用以下命令查看docker容器信息:
bash
docker inspect debian
# debian是启动容器的名字,上一步命令中设定的

- 虚拟网卡对(veth pair)
可以理解为网络设备(Network Device),就是硬件设备了,一个网口,在容器内,叫eth0,一根网线,然后一个网络设备,宿主机默认的一个叫docker0(根据支持网络的不同,可能是交换机、路由器啥的)
先看宿主机的设备和ip:
bash
ip link show
ip addr show dev docker0
如图:

再看容器内部:
bash
# 注意默认的debian镜像内没有ip工具,以下安装命令
apt update -y && apt install -y iproute2
ip link show
ip addr show dev docker0
如图:

- 网络驱动(Network Driver)
Docker 采用插件化架构,不同驱动决定网络的实现方式:
bridge:默认桥接host:共享宿主机网络overlay:跨主机通信macvlan:直连物理网络none:无网络
其实还有另外俩类:
-
container:就是共享另外一个容器的网络
-
第三方插件:一个Calico为代表的
后面越写越多,感觉写不完,只写基础网络吧,overlay、macvlan、calico留待高级部分
先看看当前主机上的docker网络
bash
docker network ls

这里刚好就有3中的类型的网络:bridge、host、none
docker网络的实验
none
原理: 容器仅保留 lo 回环接口,完全隔离
适用场景: 安全沙箱、纯计算任务
优点: 最高安全性,无网络暴露
缺点: 无法通信,仅限内部计算
前置实验步骤:
none就是不给网卡的意思,也就无法安装ip工具,所以得提前安装,弄一个还有ip工具的镜像:
这里不讨论Dockerfile,纯手工制作一个,方便简单:
bash
# 1. 启动一个容器
docker run -it --rm --name debian debian:trixie /bin/bash
# 2. 安装ip工具
apt update -y && apt install -y iproute2
# 3. 另外开一个shell,在主机执行
docker commit debian debian:trixie-ip
这样就能看到一个自己创建的镜像:
bash
docker images

继续实验吧:
bash
docker run -it --rm --name debian_none --network none debian:trixie-ip /bin/bash
容器内部看一下:

容器外看一下配置:
bash
docker inspect debian_none

补充一下:
通过docker inspect 直接查看网络名字,也可以看当前链接到这个网络的容器:
bash
docker network inspect none

host
原理: 共享宿主机网络命名空间,无独立IP
适用场景: 高性能需求、广播/组播应用
优点: 无NAT,延迟极低,性能最优
缺点: 端口冲突风险高,隔离性差
简单说,就是放弃使用docker的网络功能,直接挂在主机上,优点就是结构接单,所以没有任何网络性能损失,缺点就是网络隔离性差,端口冲突风险高。但是实际使用中也不常见:使用这种情况的,大部分都是实验场景或者追求极致性能的场景,一台主机上也不会部署多个容器。这种只是利用利docker的环境隔离功能,方便程序升级和回退而已。
启动一个看看:
bash
docker run -it --rm --name debian_host --network host debian:trixie /bin/bash
容器内部看一下:

乍一看,还以为看错了,这不就是宿主机的ip和网卡吗?是的,这就是host的意义
container
原理: 与指定容器共享网络命名空间
适用场景: 容器间高速通信、特殊拓扑
优点: 通信效率高,无额外网络开销
缺点: 依赖目标容器,灵活性低
有没有遇到这种场景:我想搭建一个redis,只给这个程序用,但是不想捆绑在这个程序的镜像里面,因为太大了,频繁升级的时候不方便,还容易丢数据?
还有没有这种场景:对于测试服务器,我想随时监控器性能和日志,但是又不想把监控程序和日志数据放在程序包里面?
这种就非常使用使用共享网络了,就是container模式:
来试试:
bash
# 1. 先启动一个容器,作为共享网络的目标容器
docker run -it --rm --name debian_container debian:trixie /bin/bash
# 2. 再启动一个容器,指定共享网络为目标容器
docker run -it --rm --name debian_container_2 --network container:debian_container debian:trixie /bin/bash
先看看确实是启动了2个容器:

然后发现网络信息完全一样:

看起来好像进入了一个容器,怀疑的,可以测试一下:在一个容器中touch一个文件,然后在另外一个里面看看有没有。
bridge
bridge为什么放在最后一个说?因为他是docker最常见、最常用、默认的网络驱动模式(上一个实验中,没指定网络,其实就是bridge网络)
原理: 基于Linux Bridge的虚拟网桥,提供隔离的网络环境
适用场景: 单机多容器互联
优点: 隔离性高,安全性强
缺点: 性能略低,需要额外网络开销
补充一下:他也能多主机通信,但是利用主机网络,端口映射的,这个后面再说
首先,他是docker的默认网络,就是如下俩个命令是等效的:
bash
docker run -it --rm --name debian debian:trixie /bin/bash
docker run -it --rm --name debian --network bridge debian:trixie /bin/bash
注意: 这里的bridge,是docker的默认网络,就是docker安装完自动创建的,所以他是一个名字为bridge,驱动为bridge类型的网络,可以直接使用。如果需要自定义名称,就必须自己创建了。后文会详细介绍。
先创建俩个镜像,连接到brighe网络:
bash
docker run -it --rm --name debian1 debian:trixie /bin/bash
docker run -it --rm --name debian2 debian:trixie /bin/bash
先分别看一下各自的容器的网络信息:
bash
ip addr show
容器1:

容器2:

再看一下bridge网络信息:
bash
docker network inspect bridge

总结一下网络信息:
容器1: ip地址是172.17.0.2
容器2: ip地址是172.17.0.3
bridge网络:网桥名称是docker0,网卡名称是docker0,ip地址是172.17.0.1
然后可以ping一下,看看网络通不通:

注意:默认debian镜像没有ping,需要自己 安装:
bash
apt install iputils-ping
自定义bridge网络
默认的bridge网络大部分时候是够用的,但是基于很多原因,需要自定义网络:
1、比如我想让几个网络不互通:当连接一个bridge网络的时候就做不到
2、例如我有大量的容器镜像需要创建的时候,需要对ip地址就行分配管理:例如教学环境、考试环境等等
实验步骤:
bash
# 创建一个bridge网络
docker network create \
--driver bridge \
--subnet=10.10.0.0/24 \
--gateway=10.10.0.1 \
--ip-range=10.10.0.128/25 \
mynet
简单解释一下:
创建一个名字叫mynet的网络,驱动是bridge,子网是10.10.0.0/24,网关是10.10.0.1,ip范围是10.10.0.128/25,就是虽然分了一个C的子网,但是限制ip分配范围。
启动2个容器:
bash
docker run -it --rm --name debian1 --network mynet debian:trixie /bin/bash
docker run -it --rm --name debian2 --network mynet debian:trixie /bin/bash
分别看一下俩个容器的ip,并ping一下彼此:
容器1:

容器2:

小结
单机(宿主机)下的网络,主要应用就差不多了,高级的网络,大部分都是用于集群,下篇准备
欢迎关注:
Docker 入门之网络基础