docker network 命令学习

docker network 是 Docker 中用于管理容器网络的核心命令套件。它允许你创建、检查、连接和断开容器与网络的连接,以及清理未使用的网络资源。

以下是 docker network 命令的详细指南:


一、 核心子命令概览

命令 描述
docker network ls 列出所有网络
docker network create 创建一个新的自定义网络
docker network inspect 查看网络的详细配置信息(JSON格式)
docker network connect 将正在运行的容器连接到指定网络
docker network disconnect 将容器从指定网络断开
docker network rm 删除一个或多个网络
docker network prune 删除所有未被容器使用的网络

二、 Docker 的默认网络驱动

在创建网络之前,了解 Docker 提供的三种主要网络驱动非常重要:

2.1、 bridge (桥接)默认驱动
  • 适用于单机上的多个容器通信。
  • 每个容器获得一个内部 IP,通过 NAT 与宿主机通信。
  • 自定义 bridge 网络 比默认 bridge 更好,因为它支持自动 DNS 解析(容器可以通过名称互相访问)。
2.2. host (主机)
  • 容器直接使用宿主机的网络栈,没有独立的 IP。
  • 性能最高,但端口冲突风险大,隔离性最差。
2.3. none (无网络)
  • 容器没有网络接口,完全隔离。
  • 适用于不需要网络的高安全需求场景。

三、 常用命令详解

3.1、 查看网络 (ls)
bash 复制代码
# 列出所有网络
docker network ls

#输出示例:
NETWORK ID     NAME      DRIVER    SCOPE
a1b2c3d4e5f6   bridge    bridge    local
g7h8i9j0k1l2   host      host      local
m3n4o5p6q7r8   none      null      local
3.2、 创建自定义网络 (create)

强烈建议 为应用创建自定义 bridge 网络,而不是使用默认的 bridge

bash 复制代码
# 创建一个名为 my-app-net 的 bridge 网络
docker network create my-app-net

# 查看创建的网络 my-app-net
docker network ls | grep my-app-net 
3226df05ac88        my-app-net          bridge              local

指定子网和网关(高级用法,避免IP冲突)

bash 复制代码
docker network create \
  --driver bridge \
  --subnet 192.168.10.0/24 \
  --gateway 192.168.10.1 \
  my-custom-net

创建指定网络模式的:https://blog.csdn.net/yuelai_217/article/details/160119439

3.3、 查看网络详情 (inspect)

这是调试网络问题的最强工具。它可以显示连接到该网络的所有容器及其 IP 地址。

bash 复制代码
docker network inspect d4645d4390be
[
    {
        "Name": "bridge",
        "Id": "d4645d4390be0309cc54c02e8f3a0227ae967beec67b6a6ecf2dc9c942ce5f30",
        "Created": "2026-03-20T15:45:07.281158334+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "61472937d1b6f0823150d55cf02e6d659d055e92c415a8972e7ffa60b9605e61": {
                "Name": "priceless_hertz",
                "EndpointID": "f876cc38b23cd9936ce09b20228423e5d884e45d403a0990be577455c04d2903",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "b372f3ca0beff5c7a51d7c7d2140b523f1038f6b74287386b92b824602997832": {
                "Name": "mychart",
                "EndpointID": "34bd3a25f8cada4b05500754465c86c56079d1d9655c62d672b652755497033a",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

参数解读:

  • Name: "bridge": 这是 Docker 安装后自动创建的默认网络。如果你启动容器时不指定 --network,容器就会连到这个网络。
  • Driver: "bridge": 使用 Linux 网桥驱动。这意味着容器之间通过虚拟交换机通信。
  • Scope: "local": 表示这个网络只在当前这台宿主机上有效,不能跨机器通信(不同于 Swarm 的 overlay 网络
  • IPAM 指的是地址管理的核心配置
  • Subnet: "172.17.0.0/16":
    • 这是整个网络的"地盘"。
    • /16 意味着有 216 = 65,536个可用 IP 地址。
    • 范围是从 172.17.0.1 到 172.17.255.254。
  • Gateway: "172.17.0.1":
    • 这是容器的"大门"。
    • 在宿主机上,这通常对应虚拟网卡 docker0 的 IP 地址。
    • 容器如果要访问外网(互联网)或宿主机其他非 Docker 网络,数据包都会发给这个网关。
  • Containers: 列出所有连接到此网络的容器 ID、名称、IPv4Address 和 MAC 地址。
  • EnableIPv6: false: 未启用 IPv6。
  • Internal: false: 不是内部网络。如果是 true,容器将无法访问外网(只能内网互访)。
  • Attachable: false: 默认桥接网络不支持手动将正在运行的容器动态 attach 进去(虽然 connect 命令在某些版本可用,但自定义网络更灵活)。
  • default_bridge: "true": 确认这是默认网络。
  • enable_icc: "true" (Inter-Container Communication): 允许容器间通信。如果设为 false,即使在同一网络,容器也无法互相访问(除了通过端口映射)。
  • enable_ip_masquerade: "true":
    • 开启 IP 伪装(NAT)。这是容器能上网的关键。
    • 当容器 172.17.0.2 访问百度时,数据包到达宿主机网关 172.17.0.1,网关会把源 IP 改成宿主机的真实 IP(如 192.168.1.100)再发出去。百度回包给宿主机,宿主机再转交给容器。
  • name: "docker0": 这是在宿主机 Linux 系统中看到的虚拟网桥接口的名字。你可以运行 ifconfig docker0 或 ip addr show docker0 看到它。
  • "com.docker.network.driver.mtu": "1500" 指的是 最大传输单元(Maximum Transmission Unit),其值为 1500 字节。简单来说,它规定了单个网络数据包(Packet)最大能装多少数据。
3.4、 连接容器到网络 (connect)

你可以将一个正在运行已停止的容器连接到额外的网络。

bash 复制代码
# 语法: docker network connect [OPTIONS] NETWORK CONTAINER
docker network connect my-app-net my-web-container
# 如下:
docker network connect ebfb0510e037 9cf7436181a1

docker inspect 9cf7436181a1 | jq '.[0].NetworkSettings.Networks[].NetworkID'| awk 'NR==2'
"ebfb0510e03741142c9dadaa806bdb1bc1805bcedc4e16c22b1a69d406e45faf"
  • 作用 :连接后,my-web-container 可以通过容器名 my-db-container(如果也在同一网络)直接访问数据库,无需知道 IP。
3.5、 断开网络连接 (disconnect)
bash 复制代码
# 语法: docker network disconnect [OPTIONS] NETWORK CONTAINER
docker network disconnect my-app-net my-web-container
3.6、 删除网络 (rm)
bash 复制代码
# 删除指定网络
docker network rm my-app-net

# 强制删除(即使有容器连接,也会先断开再删除 - 慎用)
docker network rm -f my-app-net
3.7、 清理未使用网络 (prune)

定期清理可以释放资源。

bash 复制代码
# 删除所有未被任何容器使用的网络
docker network prune

# 系统提示确认时输入 y

四、 实战场景:Web 应用 + 数据库

假设你要部署一个 Nginx 前端和一个 Redis 后端。

步骤 1: 创建专用网络
bash 复制代码
docker network create my-backend-net
步骤 2: 启动 Redis 并加入网络
bash 复制代码
docker run -d \
  --name redis-server \
  --network my-backend-net \
  redis:alpine
步骤 3: 启动 Nginx 并加入同一网络
bash 复制代码
docker run -d \
  --name nginx-web \
  --network my-backend-net \
  -p 80:80 \
  nginx:alpine
步骤 4: 验证通信

进入 Nginx 容器,尝试 ping Redis 容器名:

bash 复制代码
docker exec -it nginx-web sh
# 在容器内执行:
ping redis-server

结果 :应该能通!这就是自定义 Bridge 网络的魔力------DNS 自动解析 。如果你使用默认 bridge 网络,这一步通常会失败,除非使用 --link(已废弃)。

步骤 5: 动态添加另一个容器

假设你后来启动了一个 Python 应用,也想访问 Redis:

bash 复制代码
docker run -d \
  --name python-app \
  --network my-backend-net \
  python:3.9-slim sleep infinity

# 现在 python-app 也可以通过 "redis-server" 这个名字访问 Redis

五、 常见误区与最佳实践

5.1、 不要过度依赖默认 bridge 网络
  • 默认 bridge 网络不支持通过容器名进行 DNS 解析。你必须使用 --link(不推荐)或硬编码 IP(极不推荐)。
  • 最佳实践 :始终使用 docker network create 创建自定义网络。
5.2、 一个容器可以连接多个网络
  • 例如,一个容器可以连接 frontend-net(暴露给公网)和 backend-net(仅内部通信),实现网络隔离和安全分层。
5.3、 端口映射 (-p) 与网络的关系
  • -p 8080:80 是将宿主机的端口映射到容器。这与容器所在的网络类型无关,但在 host 模式下不能使用 -p,因为容器直接使用宿主机端口。
5.4、 排查网络问题
  • 如果容器间无法通信,首先运行 docker network inspect <network_name> 确认两个容器是否都在同一个网络的 Containers 列表中。
  • 检查防火墙规则(如 ufwiptables)是否阻止了 Docker 网桥的流量。

总结

  • 开发/单机多容器 :使用 自定义 Bridge 网络 (docker network create)。
  • 高性能/无需隔离 :使用 Host 网络 (--network host)。
  • 完全隔离 :使用 None 网络 (--network none)。
  • 调试神器docker network inspect

参考文档

1、https://blog.csdn.net/yuelai_217/article/details/160119439

2、https://blog.csdn.net/yuelai_217/article/details/160119516

相关推荐
老王熬夜敲代码4 小时前
接入Docker隔离测试
docker·容器·langchain
MGS浪疯6 小时前
让 QClaw 将复杂的 Docker 项目转为 exe!
运维·docker·容器
.柒宇.8 小时前
docker容器技术实战
运维·docker·容器
倔强的胖蚂蚁8 小时前
信创企业级 openEuler 24 部署 docker-ce 全指南
运维·docker·云原生·容器
Mark White9 小时前
深入理解 Linux 打印体系:CUPS、驱动、ULD 与 Docker 容器化
linux·运维·docker
岳来9 小时前
docker network 创建 host 和 none 网络模式
网络·docker·容器·docker network
Strugglingler10 小时前
Docker入门
docker·容器
舒一笑10 小时前
Docker Compose 挂载 Nginx 配置的正确姿势(90%的人都踩过这个坑)
运维·docker·容器
手揽回忆怎么睡10 小时前
win11使用Docker隔离comfyui,避免每次python地狱依赖
docker