Docker 命令 之 网络(Network)
摘要
-
本文介绍 Docker 命令 中 网络管理 相关命令
什么是Network(网络)?
-
在 Docker 中,网络(Network) 是容器之间通信、容器与外部通信的重要机制。Docker 提供了一套灵活的网络模型,使得你可以自由配置容器的网络环境以适配不同场景。
-
安装docker时,会自动在宿主机上安装一个
docker0
网络设备,它是一个网桥设备,用于 Docker 各容器及宿主机的网络通信。
1 | # 查看宿主机网卡信息,可以找到docker0 |
-
既然docker0是一个网桥设备,我们可以通过如下命令来查看网桥的详细信息:
1 | $ brctl show |
-
启动docker服务后,docker就为我们自动创建了三个网络,可以通过如下命令查看
1 | $ docker network ls |
-
这里
NAME
为bridge
的网络就是与docker0
设备相对应的网络,其也是docker默认
的网络,如果创建的容器没有指定网络,那么容器就会加入这个bridge
网络。
1 | # 启动一个容器,没有指定网络 |
如果没有安装 brctl,可以通过如下方式安装
1 | # centos7: |
-
Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字。
-
docker0负责给连接其上的容器分配ip地址,并且是每个容器的默认网关。当容器需要访问外网时,会通过docker0转到宿主机的eth0上,所以只要宿主机可以访问外网,那么容器也可以访问外网。
1 | # 查看宿主机的路由表 |
-
Docker Container 的 bridge 桥接模式可以参考下图
docker network
相关命令
命令 | 功能说明 | 示例 | 示例输出(简略) |
---|---|---|---|
docker network ls |
列出所有 Docker 网络 | docker network ls |
bridge , host , none 等网络名称 |
docker network inspect <网络名> |
查看指定网络的详细信息(如 IP 范围、连接容器等) | docker network inspect bridge |
显示 JSON,含子网、网关、容器等信息 |
docker network create <网络名> |
创建自定义网络(默认桥接) | docker network create my-net |
my-net 网络 ID |
docker network rm <网络名> |
删除网络(不能有容器连接) | docker network rm my-net |
成功删除无提示,失败会有错误信息 |
docker network connect <网络名> <容器名> |
将一个容器连接到指定网络 | docker network connect my-net my-container |
无输出,容器连接成功 |
docker network disconnect <网络名> <容器名> |
将容器从网络中断开连接 | docker network disconnect my-net my-container |
无输出,断开成功 |
docker network prune |
删除所有未使用的网络(慎用) | docker network prune |
会提示是否确认,清理未使用网络 |
docker network create
: 创建网络
-
语法
1 | docker network create [OPTIONS] NETWORK_NAME |
-
常用参数说明表
参数 | 说明 | 示例 |
---|---|---|
--driver 或 -d |
指定网络驱动类型,如 bridge , overlay , macvlan , host , none |
--driver bridge |
--subnet |
指定子网地址范围(CIDR) | --subnet 192.168.100.0/24 |
--gateway |
指定网关 IP 地址 | --gateway 192.168.100.1 |
--ip-range |
指定可分配的 IP 范围 | --ip-range 192.168.100.0/25 |
--aux-address |
保留某些 IP 地址不被分配 | --aux-address="reserved=192.168.100.254" |
--internal |
创建一个内部网络(不能访问外部) | --internal |
--attachable |
创建可供单独容器连接的网络(Swarm 中) | --attachable |
--label |
添加标签 | --label env=dev |
--opt |
提供自定义驱动选项 | --opt encrypted=true |
-
--driver
或-d
: 常见的 Docker 网络驱动类型
类型 | 含义 | 是否支持端口映射 | 特点与应用场景 |
---|---|---|---|
bridge (默认) |
默认的桥接网络,容器通过虚拟网桥连接,共享宿主机的网络接口。 | ✅ 是 | 默认模式,适用于单主机部署、多个容器需要互通的场景。可映射端口对外访问。 |
host |
容器与宿主机共用网络命名空间,容器直接使用宿主机的 IP 和端口。 | ❌ 否 | 无网络隔离,性能高,适用于高性能、低延迟场景(如游戏服务器)。 |
none |
容器没有网络接口,完全隔离。 | ❌ 否 | 用于安全性或测试网络不可达场景。 |
macvlan |
为容器分配独立 MAC 和 IP,容器像物理主机一样出现在局域网中。 | ✅ 是(少见) | 适用于容器必须直接暴露在物理网络中的场景(如 DHCP 服务、ARP 广播)。 |
ipvlan (高级) |
类似 macvlan,但不使用虚拟 MAC 地址。 | ✅ 是(少见) | 高级网络方案,适用于对网络拓扑精细控制的场景。 |
overlay |
用于多主机之间容器通信,需要 Docker Swarm 支持。 | ✅ 是(Swarm) | 跨主机部署服务的必要手段,适合容器编排平台(如 Swarm、Kubernetes)。 |
前面我们说过,Docker会自动创建三个网络,即:bridge、host、none。对于单台宿主机的场景,绝大多数情况下我们都只会使用bridge网络。
-
示例
1 | # 创建一个名为my-network的网络 |
-
如果创建网络时没有指定子网,则从
docker0
的172.17.0.0/16
往后排,比如我们上面创建的my-network
,其子网就是172.18.0.0/16
,如下命令创建一个bridge网络,并指定子网、网关等信息
1 | $ docker network create \ |
bridge
总结
-
默认创建的
docker0
网络,是一个桥接网络,在 docker network 中的名称为bridge
,该网络下的容器可以通过IP地址相互访问,但不能通过容器名称访问 -
通过
docker network create <网络名称>
创建的网络也是一个桥接网络,在这个网络下,容器可以通过IP地址相互访问,也能通过容器名称访问。
docker network ls
: 列出所有网络
1 | # 列出所有网络 |
docker network inspect
: 查看网络详情
1 | # 查看名称为bridge网络详情 |
docker network prune
: 清理没用的网络
1 | # 删除所有未使用的网络 |
docker network rm
: 删除网络
1 | # 删除指定的网络 |
docker network connect
: 将容器连接到网络
1 | # 将容器连接到网络,如果容器启动时忘记连接网络,这里可以手动添加 |
docker network disconnect
: 将容器从网络断开
1 | $ docker network disconnect <network-name> <container-name> |
本文总结
-
容器与网络是多对多的关系,即一个网络可以有多个容器,一个容器也可以连接到多个网络。
-
docker0 是 docker 默认创建的网络,不指定网络的情况下所有容器都连接到 docker0 网络。
-
docker0 是 bridge 网络,该网络中的容器之间可以通过 IP 互相访问,但不能通过容器名称访问。
-
自建的 bridge 网络中的容器可以通过容器名称(或容器ID,但不常用)访问。
-
不同的 bridge 网络中的容器不能互相访问。
--link
vs --network
项目 | --link |
--network |
---|---|---|
功能 | 将一个容器链接到另一个容器,并设置环境变量和主机名映射 | 将容器加入到一个自定义网络中,实现灵活、隔离的网络通信 |
是否推荐 | ❌ 不推荐(已废弃) | ✅ 推荐使用 |
网络隔离 | 基于默认 bridge 网络,隔离性差 |
可以创建自定义网络(bridge、overlay 等),隔离性强 |
可扩展性 | 只适用于已运行的容器,连接固定 | 支持多个容器,灵活组合和动态扩展 |
DNS 支持 | 仅设置环境变量,不支持自动 DNS | 自定义网络中支持容器名称作为 DNS 名称 |
生命周期 | 一方容器关闭,另一方仍保存过时链接 | 网络存在即可,容器生命周期不互相影响 |
安全性 | 所有容器共享 bridge,容易相互访问 | 自定义网络间默认隔离,安全性更好 |