docker网络

Docker 网络的作用是 实现容器之间的通信、隔离与互联,它为容器化应用提供了灵活的网络连接能力。以下是 Docker 网络的核心作用和常见用法:


🌐 一、Docker 网络的主要作用

1. 端口映射与外部访问

  • Docker 允许将容器内部服务暴露给宿主机,供外部网络访问。
  • 例如:
    docker run -p 8080:80 nginx
    
    将容器内的 80 端口映射到宿主机的 8080 端口,外部可通过 http://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

此时 app1app2 可以通过容器名直接访问对方服务(如 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 中通过 curlping 访问 container1 的 IP 地址。

⚠️ 注意:

  • 默认桥接网络中的容器 不能通过容器名进行解析(即无法用 ping container1 这样的方式访问)。
  • 只能通过 IP 地址 访问其他容器。

❌ 二、不推荐:使用 Host 模式访问

你也可以使用 --network host 来让容器共享宿主机网络栈:

docker run --network host -d myapp

这样所有容器都使用宿主机的网络接口,端口不会被隔离,容器间通信等同于本地进程通信。

缺点:

  • 安全性差(无网络隔离)
  • 端口冲突风险高
  • 不适合生产环境或多个服务并行运行的场景

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网络

image-20250226210746854

docker

posted @ 2025-12-25 14:59  姬雨晨  阅读(10)  评论(0)    收藏  举报