docker网络
Docker 网络的作用是 实现容器之间的通信、隔离与互联,它为容器化应用提供了灵活的网络连接能力。以下是 Docker 网络的核心作用和常见用法:
🌐 一、Docker 网络的主要作用
1. 端口映射与外部访问
- Docker 允许将容器内部服务暴露给宿主机,供外部网络访问。
- 例如:
将容器内的 80 端口映射到宿主机的 8080 端口,外部可通过docker run -p 8080:80 nginxhttp://localhost:8080访问。
2. 容器间通信
- 默认情况下,每个容器都有自己的独立网络命名空间(Network Namespace)。
- Docker 网络允许你将多个容器加入同一个虚拟网络中,使它们可以像在局域网一样互相通信。
✅ 示例:
docker network create mynet
docker run --name app1 --network mynet -d app-image
docker run --name app2 --network mynet -d app-image
此时 app1 和 app2 可以通过容器名直接访问对方服务(如 ping app1)。
3. 服务发现
- 使用自定义桥接网络时,Docker 提供内置 DNS 解析功能,容器可以通过容器名或别名相互解析 IP 地址。
- 这使得微服务架构中的容器能够方便地进行服务注册与发现。
4. 网络隔离
- 不同的网络之间默认是隔离的,除非显式连接。
- 可用于构建开发、测试、生产等不同环境的网络隔离模型。
5. 支持多种网络驱动
Docker 支持多种网络模式,适用于不同的使用场景:
| 网络模式 | 描述 | 适用场景 |
|---|---|---|
bridge |
默认模式,为每个容器分配独立 IP,并提供 NAT 能力 | 单机部署、开发测试 |
host |
容器共享宿主机网络栈,无网络隔离 | 高性能、低延迟场景 |
none |
容器无网络接口,完全隔离 | 安全性要求高的场景 |
overlay |
跨主机容器通信,支持多节点集群(如 Swarm) | 分布式系统、跨主机容器编排 |
macvlan |
为容器分配 MAC 地址,使其在网络中表现为物理设备 | 直接接入物理网络的场景 |
🧩 二、Docker 网络的典型应用场景
1. 微服务架构
- 多个服务(如 MySQL、Redis、Web 应用)部署在同一个自定义网络中,通过服务名互相访问。
- 示例:
docker run --name mysql --network appnet -e MYSQL_ROOT_PASSWORD=pass -d mysql docker run --name webapp --network appnet -d mywebapp
2. 数据库连接
- Web 容器通过网络连接到数据库容器,无需使用 IP 地址,而是使用容器名称作为主机名。
3. 负载均衡与反向代理
- 使用 Nginx 或 Traefik 容器作为反向代理,代理多个后端服务容器,这些服务部署在同一网络中即可被访问。
4. 跨主机通信(Swarm 模式下)
- 在 Docker Swarm 中,使用
overlay网络可实现跨主机容器之间的通信。
🛠️ 三、常用命令示例
创建自定义网络:
docker network create my_network
查看所有网络:
docker network ls
查看某个网络详情:
docker network inspect my_network
容器加入指定网络:
docker run --network my_network -d some-container
容器运行时动态加入网络:
docker network connect my_network container_name
删除网络:
docker network rm my_network
查看容器 IP
docker inspect <container_name> | grep IPAddress
或者进入容器内查看:
ip addr show
📌 四、Zabbix Docker 部署中的网络配置建议
在 Zabbix 的 Docker 部署中,推荐使用如下方式组织网络:
# 创建一个专用网络 zabbix-net
docker network create zabbix-net
# 启动 MySQL 数据库
docker run --name mysql-server --network zabbix-net -e MYSQL_ROOT_PASSWORD=zabbix -d mysql:8.0
# 启动 Zabbix Server
docker run --name zabbix-server --network zabbix-net \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix" \
-d zabbix/zabbix-server-mysql:latest
# 启动 Zabbix Web 前端
docker run --name zabbix-web --network zabbix-net \
-e ZBX_SERVER_HOST="zabbix-server" \
-e DB_SERVER_HOST="mysql-server" \
-p 8080:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
# 启动 Zabbix Agent(可选)
docker run --name zabbix-agent --network zabbix-net \
-e ZBX_HOSTNAME="my-host" \
-e ZBX_SERVER_HOST="zabbix-server" \
-d zabbix/zabbix-agent:latest
这样:
- 所有组件都在同一网络中,可通过容器名互相访问;
- 不需要手动维护 IP 地址;
- 更容易扩展和管理多个服务容器。
✅ 总结
| 功能 | 是否依赖网络 |
|---|---|
| 容器间通信 | ✅ 是 |
| 容器访问外网 | ✅ 是 |
| 外部访问容器 | ✅ 是 |
| 容器名解析 | ✅ 自定义网络支持 |
| 高可用集群通信 | ✅ overlay 网络支持 |
📚 推荐阅读
几种场景
即使不使用自定义 Docker 网络(如 docker network create 创建的网络),Docker 容器之间在默认情况下也是可以相互访问的,但有以下几种情况和限制。
✅ 一、默认桥接网络(Default Bridge Network)
当你启动一个容器时,如果 没有指定 --network 参数,它会自动加入到 Docker 的默认桥接网络(名为 bridge)中。在这个网络中,容器之间可以通过 IP 地址互相访问。
示例:
# 启动两个容器
docker run --name container1 -d some-image
docker run --name container2 -d another-image
# 查看它们的 IP 地址
docker inspect container1 | grep IPAddress
docker inspect container2 | grep IPAddress
你可以从 container2 中通过 curl 或 ping 访问 container1 的 IP 地址。
⚠️ 注意:
- 默认桥接网络中的容器 不能通过容器名进行解析(即无法用
ping container1这样的方式访问)。 - 只能通过 IP 地址 访问其他容器。
❌ 二、不推荐:使用 Host 模式访问
你也可以使用 --network host 来让容器共享宿主机网络栈:
docker run --network host -d myapp
这样所有容器都使用宿主机的网络接口,端口不会被隔离,容器间通信等同于本地进程通信。
缺点:
- 安全性差(无网络隔离)
- 端口冲突风险高
- 不适合生产环境或多个服务并行运行的场景
✅ 三、使用 --link 实现容器名解析(旧方法)
Docker 提供了 --link 参数来实现容器之间的名称解析(已逐渐被淘汰):
docker run --name db -d mysql
docker run --name webapp --link db -d mywebapp
在 webapp 容器内部就可以通过 [db](file://e:\mySpace\mySpace\web\前端\css3\media\Thumbs.db) 这个名字访问数据库容器。
原理:
- Docker 修改了
/etc/hosts文件,将 [db](file://e:\mySpace\mySpace\web\前端\css3\media\Thumbs.db) 映射为对应的容器 IP。 - 属于默认桥接网络下的模拟 DNS 解析。
缺点:
- 仅适用于默认桥接网络。
- 动态 IP 变化后需要重新链接。
- 不支持多对多连接。
✅ 四、跨容器访问的方式总结
| 方式 | 是否可用 | 说明 |
|---|---|---|
| 默认 bridge 网络 + IP 访问 | ✅ 是 | 容器可互通,但无法通过容器名解析 |
使用 --link |
✅ 是(有限制) | 支持容器名解析,但需手动配置且不灵活 |
| 自定义 bridge 网络 | ✅ 推荐 | 支持容器名解析,更安全、易管理 |
| host 模式 | ✅ 是 | 共享主机网络,适合调试,不适合生产 |
| none 模式 | ❌ 否 | 容器无网络,无法通信 |
📌 五、Zabbix 容器部署建议(使用默认网络的局限性)
如果你不使用自定义网络部署 Zabbix 相关组件(如 Server、Web、MySQL、Agent),可能会遇到以下问题:
| 组件 | 问题描述 |
|---|---|
| Zabbix Web → Zabbix Server | Web 容器不知道 Server 的 IP,必须手动配置 $ZBX_SERVER |
| Zabbix Server → MySQL | 必须手动指定 MySQL 容器的 IP |
| Agent → Server | 需要静态 IP,否则每次重启 IP 变化导致失败 |
所以建议:
使用自定义网络提升稳定性和可维护性:
docker network create zabbix-net
docker run --name mysql-server --network zabbix-net -e MYSQL_ROOT_PASSWORD=zabbix -d mysql
docker run --name zabbix-server --network zabbix-net -e DB_SERVER_HOST=mysql-server -d zabbix/zabbix-server-mysql
docker run --name zabbix-web --network zabbix-net -p 80:80 -e ZBX_SERVER_HOST=zabbix-server -d zabbix/zabbix-web-nginx-mysql
✅ 六、结论
| 场景 | 是否可以访问 | 建议 |
|---|---|---|
| 同默认 bridge 网络,通过 IP | ✅ 是 | 可用,但不易维护 |
| 同默认 bridge 网络,通过容器名 | ❌ 否 | 需要 --link 或改用自定义网络 |
使用 --link |
✅ 是(有限) | 已不推荐 |
| 使用自定义网络 | ✅ 强烈推荐 | 最佳实践,支持服务发现、DNS 解析 |
| 使用 host 网络 | ✅ 是 | 无隔离,适合测试 |
| 使用 none 网络 | ❌ 否 | 容器无网络,完全隔离 |
docker网络


浙公网安备 33010602011771号