Docker入门之网络基础

admin 2026-04-10 02:28:13 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统介绍Docker网络基础架构,重点解析网络命名空间、vethpair虚拟网卡对和网络驱动三大核心技术。通过实验演示none、host、container和bridge四种网络模式的原理、适用场景及配置方法,详细说明自定义bridge网络的创建步骤与IP分配技巧。文章提供完整的Docker命令操作示例,帮助读者掌握容器网络隔离与通信机制。 综合评分: 75 文章分类: 安全建设,技术标准,应用安全,云安全,解决方案


cover_image

Docker 入门之网络基础

原创

一只岸上的鱼 一只岸上的鱼

一只岸上的鱼

2026年4月7日 16:32 江苏

Docker 入门之网络基础

缘起

本想写“docker 入门之网络”,但是越写越多,算了,还是拆开把,先写基础。

建议先看这篇:

Docker 入门之基本概念

网络基础

首先理解一下docker网络的三个核心概念,或者说核心技术支柱:

先看图,以实践来理解概念,比较容易一点:

# 启动一个容器docker run -it --rm --name debian debian:trixie /bin/bash
  1. 网络命名空间(Network Namespace)

每个容器拥有独立的网络命名空间,这意味着它有自己独立的:

  • IP 地址
  • 路由表
  • 防火墙规则
  • 网络接口(如 eth0

使用以下命令查看docker容器信息:

docker inspect debian
# debian是启动容器的名字,上一步命令中设定的

  1. 虚拟网卡对(veth pair)

可以理解为网络设备(Network Device),就是硬件设备了,一个网口,在容器内,叫eth0,一根网线,然后一个网络设备,宿主机默认的一个叫docker0(根据支持网络的不同,可能是交换机、路由器啥的)

先看宿主机的设备和ip:

ip link show
ip addr show dev docker0

如图:

再看容器内部:

# 注意默认的debian镜像内没有ip工具,以下安装命令apt update -y && apt install -y iproute2
ip link show
ip addr show dev docker0

如图:

  1. 网络驱动(Network Driver)

Docker 采用插件化架构,不同驱动决定网络的实现方式:

  • bridge:默认桥接
  • host:共享宿主机网络
  • overlay:跨主机通信
  • macvlan:直连物理网络
  • none:无网络

其实还有另外俩类:

  • container:就是共享另外一个容器的网络
  • 第三方插件:一个Calico为代表的

后面越写越多,感觉写不完,只写基础网络吧,overlay、macvlan、calico留待高级部分

先看看当前主机上的docker网络

docker network ls

这里刚好就有3中的类型的网络:bridge、host、none

docker网络的实验

none

原理:  容器仅保留 lo 回环接口,完全隔离适用场景:   安全沙箱、纯计算任务优点:  最高安全性,无网络暴露缺点:  无法通信,仅限内部计算

前置实验步骤:

none就是不给网卡的意思,也就无法安装ip工具,所以得提前安装,弄一个还有ip工具的镜像:

这里不讨论Dockerfile,纯手工制作一个,方便简单:

# 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

这样就能看到一个自己创建的镜像:

docker images

继续实验吧:

docker run -it --rm --name debian_none --network none debian:trixie-ip /bin/bash

容器内部看一下:

容器外看一下配置:

docker inspect debian_none

补充一下:

通过docker inspect 直接查看网络名字,也可以看当前链接到这个网络的容器:

docker network inspect none

host

原理:  共享宿主机网络命名空间,无独立IP适用场景:   高性能需求、广播/组播应用优点:  无NAT,延迟极低,性能最优缺点:  端口冲突风险高,隔离性差

简单说,就是放弃使用docker的网络功能,直接挂在主机上,优点就是结构接单,所以没有任何网络性能损失,缺点就是网络隔离性差,端口冲突风险高。但是实际使用中也不常见:使用这种情况的,大部分都是实验场景或者追求极致性能的场景,一台主机上也不会部署多个容器。这种只是利用利docker的环境隔离功能,方便程序升级和回退而已。

启动一个看看:

docker run -it --rm --name debian_host --network host debian:trixie /bin/bash

容器内部看一下:

乍一看,还以为看错了,这不就是宿主机的ip和网卡吗?是的,这就是host的意义

container

原理:  与指定容器共享网络命名空间适用场景:   容器间高速通信、特殊拓扑优点:  通信效率高,无额外网络开销缺点:  依赖目标容器,灵活性低

有没有遇到这种场景:我想搭建一个redis,只给这个程序用,但是不想捆绑在这个程序的镜像里面,因为太大了,频繁升级的时候不方便,还容易丢数据?

还有没有这种场景:对于测试服务器,我想随时监控器性能和日志,但是又不想把监控程序和日志数据放在程序包里面?

这种就非常使用使用共享网络了,就是container模式:

来试试:

# 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的默认网络,就是如下俩个命令是等效的:

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网络:

docker run -it --rm --name debian1 debian:trixie /bin/bash
docker run -it --rm --name debian2 debian:trixie /bin/bash

先分别看一下各自的容器的网络信息:

ip addr show

容器1:

容器2:

再看一下bridge网络信息:

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,需要自己 安装:

apt install iputils-ping

自定义bridge网络

默认的bridge网络大部分时候是够用的,但是基于很多原因,需要自定义网络:

1、比如我想让几个网络不互通:当连接一个bridge网络的时候就做不到

2、例如我有大量的容器镜像需要创建的时候,需要对ip地址就行分配管理:例如教学环境、考试环境等等

实验步骤:

# 创建一个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个容器:

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 入门之网络基础》

评论:0   参与:  0