Docker 网络终极指南:从概念、命令到 Docker Compose 实战
文章目录
- 一、开篇:为何必须掌握 Docker 网络
- 二、Docker 网络核心概念
- 三、网络核心命令实战
- 四、网络模式详解与案例
- 五、实战进阶:使用 Docker Compose 管理网络
- 六、总结:迈向下一步
一、开篇:为何必须掌握 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 (自定义) | Host | Container | None |
|---|---|---|---|---|
| 隔离性 | 强 (网络命名空间隔离) | 弱 (与主机共享) | 弱 (与其他容器共享) | 极强 (完全隔离) |
| 性能 | 良好 (有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网络为了向后兼容,并未提供此功能。
[操作步骤]
- 创建自定义网络
web1和两个容器box1,box2docker network create web1 docker run -itd --name=box1 --network web1 busybox docker run -itd --name=box2 --network web1 busybox - 验证
box1和box2可以通过容器名互相通信docker exec -it box1 ping box2 # --- PING Succeeded --- - 创建使用默认
bridge网络的容器box3docker run -itd --name=box3 busybox - 验证
box3无法通过容器名与box1通信docker exec -it box3 ping box1 # ping: bad address 'box1'
[案例结论]
自定义 Bridge 网络提供了开箱即用的服务发现能力,且网络间天然隔离,是构建多容器应用的首选。
4.2 Host 网络模式
[案例目标]
验证 host 模式下,容器与宿主机共享网络。
安全警告:
host模式打破了容器的网络隔离,增加了安全风险,且容易导致端口冲突。请仅在对网络性能有极致要求且清楚其风险的场景下使用。
[操作步骤]
- 以
host模式运行容器box4docker run -itd --name=box4 --network host busybox - 比较宿主机和容器的网络配置
分别在宿主机和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 network 和 docker run 命令不仅繁琐、容易出错,而且难以维护和版本控制。
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。您可以使用一个 YAML 文件来配置应用程序的服务、网络和卷,然后使用一个命令,就可以创建并启动所有服务。
5.2 Compose 实战案例
[案例目标]
使用 Docker Compose 部署一个包含 Web 服务器(Nginx)和数据库(MySQL)的简单应用,并让它们在一个自定义网络中安全通信。
-
创建
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 -
一键启动应用
在docker-compose.yml文件所在目录执行:docker-compose up -dDocker Compose 会自动完成以下所有工作:
- 创建一个名为
projectname_my-app-net的自定义 bridge 网络。 - 分别创建
webapp和database两个服务(容器)。 - 将两个容器都连接到上述网络中。
- 创建一个名为
-
验证通信
现在,webapp容器内部可以直接通过主机名database来访问数据库服务,因为 Docker Compose 利用了我们前面讲的自定义网络 DNS 功能。 -
一键销毁环境
docker-compose down该命令会停止并移除所有相关的容器和网络。
六、总结:迈向下一步
系统地掌握了 Docker 网络的核心知识,从底层概念、手动命令操作,到现代化的 Docker Compose 编排实践。
核心要点回顾:
- 网络是实现容器化应用协作的基石。
- 始终使用自定义 Bridge 网络,以利用其内置的 DNS 服务和优秀的隔离性。
- 根据场景(性能 vs 隔离性)审慎选择网络模式。
- 在多容器项目中,拥抱 Docker Compose,它能极大地简化网络管理,提升开发效率。
接下来,您可以尝试构建更复杂的应用,或者开始探索 Docker Swarm/Kubernetes 中的 Overlay 网络,迈向跨主机容器通信的星辰大海。祝您在容器化的旅途中一切顺利!
更多推荐



所有评论(0)