文章目录


一、开篇:为何必须掌握 Docker 网络

您好!欢迎阅读这篇 Docker 网络深度指南。本文专为希望系统性掌握 Docker 网络知识的初学者和开发者设计。容器技术的核心在于隔离与协作,而网络正是实现容器间“协作”的命脉。无论您是构建复杂的微服务应用,还是仅仅部署一个简单的 Web 服务,理解 Docker 网络都将是您不可或缺的关键技能。

读完本文,您将能够:

  • 清晰地理解 Docker 的核心网络概念。
  • 熟练地运用 Docker 网络相关的所有核心命令。
  • 准确地选择 适合您应用场景的网络模式。
  • 掌握使用 Docker Compose 在真实项目中管理应用网络的最佳实践。

让我们开始吧!

二、Docker 网络核心概念

2.1 Docker 为什么需要网络?

  • 实现容器间通信:在微服务架构中,应用被拆分成多个独立的服务(如Web前端、API、数据库),每个服务运行在各自的容器中。网络功能使得这些容器可以互相发现和通信。
  • 连接外部世界:让外部用户能够访问容器提供的服务(如网站),并允许容器从互联网获取资源(如下载软件包)。
  • 提供安全隔离:通过网络划分,可以确保只有授权的容器才能相互通信,增强应用安全性。

2.2 常见网络类型

  • Bridge(桥接网络):Docker 的默认模式,为每个容器分配独立 IP,并通过虚拟网桥和 NAT 与外界通信,提供了良好的隔离性和易用性。
  • Host(宿主机网络):容器直接共享宿主机的网络,性能最高,但牺牲了隔离性,容易产生端口冲突。
  • Container(容器网络):让一个容器共享另一个已存在容器的网络,常用于特殊场景下的网络调试。
  • None(无网络):完全隔离的网络环境,容器没有任何网络连接。
  • Overlay(叠加网络):用于 Docker 集群(如 Swarm)的高级模式,它能在多个物理主机之上构建统一的虚拟网络,实现跨主机容器通信。

2.3 各网络模式特性速查表

特性Bridge (自定义)HostContainerNone
隔离性强 (网络命名空间隔离)弱 (与主机共享)弱 (与其他容器共享)极强 (完全隔离)
性能良好 (有NAT开销)最佳 (无额外开销)类似 Host不适用
IP 分配独立 IP共享主机 IP共享另一容器 IP仅有 lo (127.0.0.1)
端口管理独立端口,需映射共享主机端口,易冲突共享另一容器端口无端口
主要场景通用开发、生产环境追求极致性能、网络复杂的应用Kubernetes Pod、网络调试离线计算、安全任务
DNS 服务支持 (推荐)不适用共享不适用

三、网络核心命令实战

3.1 docker network ls

功能:列出当前主机上所有的 Docker 网络。

root@iv-yeli2elts0wh2yplahah:~# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
d9e09aed9a51   bridge    bridge    local
6c24c23614b9   host      host      local
1396ad211fdf   none      null      local

3.2 docker network create

功能:创建一个新的自定义网络。

最佳实践:请始终为您的应用创建自定义网络,不要直接使用默认的 bridge 网络。

root@iv-yeli2elts0wh2yplahah:/home/qsy# docker network create web1
0e8193d2d418ae7e552b353716c5899a9408eb311ab4cd4269eb18d7d296a6a9

3.3 docker network inspect

功能:查看指定网络的详细配置信息。

root@iv-yeli2elts0wh2yplahah:/home/qsy# docker network inspect web1
[
    {
        "Name": "web1",
        "Id": "0e8193d2d418...",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Containers": {} // 当前没有容器连接
    }
]

3.4 docker network connect

功能:将一个正在运行的容器连接到一个网络。

# 1. 启动一个名为 mybox1 的容器
root@iv-yeli2elts0wh2yplahah:/home/qsy# docker run -itd --name=mybox1 busybox

# 2. 将 mybox1 连接到 web1 网络
root@iv-yeli2elts0wh2yplahah:/home/qsy# docker network connect web1 mybox1

# 3. 再次检查 web1 网络,可以看到 mybox1 已连接,并分配了 IP 172.18.0.2
root@iv-yeli2elts0wh2yplahah:/home/qsy# docker network inspect web1
...
        "Containers": {
            "832cbbc...": {
                "Name": "mybox1",
                "IPv4Address": "172.18.0.2/16",
            }
        },
...

3.5 docker network disconnect

功能:将容器与指定网络断开连接。

root@iv-yeli2elts0wh2yplahah:/home/qsy# docker network disconnect web1 mybox1

3.6 docker network rm

功能:删除一个或多个网络。(注意:网络被占用时无法删除)

# 1. 尝试直接删除被占用的 web2 网络,操作失败
root@iv-yeli2elts0wh2yplahah:~# docker network rm web2
Error response from daemon: network web2 has active endpoints

# 2. 先断开容器连接,再删除网络,操作成功
root@iv-yeli2elts0wh2yplahah:~# docker network disconnect web2 myweb2
root@iv-yeli2elts0wh2yplahah:~# docker network rm web2

3.7 docker network prune

功能:自动删除所有当前未被任何容器使用的自定义网络,非常适合用于清理环境。

root@iv-yeli2elts0wh2yplahah:~# docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
web1

四、网络模式详解与案例

4.1 Bridge 网络模式

[案例目标]

验证自定义 Bridge 网络相较于默认 Bridge 网络的核心优势:内置 DNS 服务

深入理解:为何自定义网络支持DNS?
当您创建一个自定义 bridge 网络时,Docker 会在该网络内部启动一个嵌入式的 DNS 服务器。这个 DNS 服务器维护着网络内所有容器的“容器名 -> 容器IP”的映射关系。因此,同一个网络内的容器可以通过容器名直接通信,这是 Docker 实现服务发现的基础,对于微服务架构至关重要。而默认的 bridge 网络为了向后兼容,并未提供此功能。

[操作步骤]
  1. 创建自定义网络 web1 和两个容器 box1, box2
    docker network create web1
    docker run -itd --name=box1 --network web1 busybox
    docker run -itd --name=box2 --network web1 busybox
    
  2. 验证 box1box2 可以通过容器名互相通信
    docker exec -it box1 ping box2
    # --- PING Succeeded ---
    
  3. 创建使用默认 bridge 网络的容器 box3
    docker run -itd --name=box3 busybox
    
  4. 验证 box3 无法通过容器名与 box1 通信
    docker exec -it box3 ping box1
    # ping: bad address 'box1'
    
[案例结论]

自定义 Bridge 网络提供了开箱即用的服务发现能力,且网络间天然隔离,是构建多容器应用的首选。

4.2 Host 网络模式

[案例目标]

验证 host 模式下,容器与宿主机共享网络。

安全警告host 模式打破了容器的网络隔离,增加了安全风险,且容易导致端口冲突。请仅在对网络性能有极致要求且清楚其风险的场景下使用。

[操作步骤]
  1. host 模式运行容器 box4
    docker run -itd --name=box4 --network host busybox
    
  2. 比较宿主机和容器的网络配置
    分别在宿主机和 box4 容器内执行 ifconfig 命令。
[案例结论]

输出结果显示,box4 容器的网络配置(IP地址、网卡信息等)与宿主机完全一样

4.3 Container 网络模式

[案例目标]

让新容器 box5 共享已存在的 box1 容器的网络。

[操作步骤]
# 假设 box1 已在 web1 网络中运行
docker run -itd --name=box5 --network container:box1 busybox
[案例结论]

box5 不会创建自己的网络栈,而是完全复用 box1 的。对 box1 的网络操作(如 connect, disconnect)会同样影响 box5。此模式在 Kubernetes Pod 模型中有广泛应用。

4.4 None 网络模式

[案例目标]

创建一个完全没有网络连接的容器。

[操作步骤]
docker run -itd --name=box6 --network none busybox
docker exec -it box6 ifconfig
[案例结论]

容器 box6 内部只有一个本地回环接口 lo,无法与外界进行任何网络通信,实现了彻底的网络隔离。

五、实战进阶:使用 Docker Compose 管理网络

5.1 为什么需要 Docker Compose?

在真实项目中,应用通常由多个服务构成。手动执行一系列 docker networkdocker run 命令不仅繁琐、容易出错,而且难以维护和版本控制。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。您可以使用一个 YAML 文件来配置应用程序的服务、网络和卷,然后使用一个命令,就可以创建并启动所有服务。

5.2 Compose 实战案例

[案例目标]
使用 Docker Compose 部署一个包含 Web 服务器(Nginx)和数据库(MySQL)的简单应用,并让它们在一个自定义网络中安全通信。

  1. 创建 docker-compose.yml 文件

    version: '3.8'
    
    services:
      webapp:
        image: nginx:latest
        ports:
          - "8080:80" # 将主机的 8080 端口映射到容器的 80 端口
        networks:
          - my-app-net
        # webapp 依赖 database 先启动
        depends_on:
          - database
    
      database:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: root
        networks:
          - my-app-net
    
    # 统一管理网络
    networks:
      my-app-net:
        driver: bridge
    
  2. 一键启动应用
    docker-compose.yml 文件所在目录执行:

    docker-compose up -d
    

    Docker Compose 会自动完成以下所有工作:

    • 创建一个名为 projectname_my-app-net 的自定义 bridge 网络。
    • 分别创建 webappdatabase 两个服务(容器)。
    • 将两个容器都连接到上述网络中。
  3. 验证通信
    现在,webapp 容器内部可以直接通过主机名 database 来访问数据库服务,因为 Docker Compose 利用了我们前面讲的自定义网络 DNS 功能。

  4. 一键销毁环境

    docker-compose down
    

    该命令会停止并移除所有相关的容器和网络。

六、总结:迈向下一步

系统地掌握了 Docker 网络的核心知识,从底层概念、手动命令操作,到现代化的 Docker Compose 编排实践。

核心要点回顾

  • 网络是实现容器化应用协作的基石。
  • 始终使用自定义 Bridge 网络,以利用其内置的 DNS 服务和优秀的隔离性。
  • 根据场景(性能 vs 隔离性)审慎选择网络模式。
  • 在多容器项目中,拥抱 Docker Compose,它能极大地简化网络管理,提升开发效率。

接下来,您可以尝试构建更复杂的应用,或者开始探索 Docker Swarm/Kubernetes 中的 Overlay 网络,迈向跨主机容器通信的星辰大海。祝您在容器化的旅途中一切顺利!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐