Skip to content

Docker 网络是容器之间以及容器与外部世界通信的核心组件,理解 Docker 网络的不同模式、配置方法和实际应用场景非常重要。以下是详细的解释和示例:


一、Docker 网络基础

1. 默认网络模式

安装 Docker 后,默认会创建以下三种网络:

bash
docker network ls

输出示例:

NETWORK ID     NAME      DRIVER    SCOPE
abc123...      bridge    bridge    local
def456...      host      host      local
ghi789...      none      null      local
  • bridge:默认桥接网络,容器默认连接到此网络。
  • host:容器直接使用宿主机的网络栈。
  • none:禁用所有网络(只有 lo 回环接口)。

二、Docker 网络模式详解

1. 桥接网络(Bridge)

  • 特点
    • 容器通过虚拟网桥 docker0 通信。
    • 每个容器分配独立的内部 IP(如 172.17.0.2)。
    • 容器间可以相互通信(通过 IP),但需手动配置端口映射才能与宿主机或外部通信。
  • 适用场景:单机环境下的容器隔离和通信。
示例 1:使用默认桥接网络
bash
# 运行一个 Nginx 容器,映射宿主机端口 8080 到容器的 80 端口
docker run -d --name web -p 8080:80 nginx

# 访问宿主机 IP:8080 即可访问容器内的 Nginx 服务
curl http://localhost:8080
示例 2:容器间通过 IP 通信
bash
# 运行两个容器(使用默认桥接网络)
docker run -d --name container1 alpine sleep 3600
docker run -d --name container2 alpine sleep 3600

# 进入 container1,ping container2 的 IP
docker exec -it container1 sh
ping 172.17.0.3  # 假设 container2 的 IP 是 172.17.0.3

2. Host 网络模式

  • 特点
    • 容器共享宿主机的网络命名空间,直接使用宿主机的 IP 和端口。
    • 无需端口映射(如容器运行在 80 端口,宿主机 80 端口直接被占用)。
  • 适用场景:需要高性能网络(如负载均衡、实时流媒体)。
示例:使用 Host 模式
bash
# 运行一个 Nginx 容器,直接使用宿主机的网络
docker run -d --name web-host --network=host nginx

# 访问宿主机 IP:80 即可(无需端口映射)
curl http://localhost:80

3. None 网络模式

  • 特点
    • 容器只有 lo 回环接口,无法与外部通信。
    • 适用于完全隔离或自定义网络配置的场景。
  • 适用场景:安全测试、手动配置网络栈。
示例:使用 None 模式
bash
docker run -it --network=none --name isolated-container alpine sh
# 进入容器后执行 `ifconfig`,只能看到 `lo` 接口

4. 容器共享网络(Container)

  • 特点
    • 新容器共享指定容器的网络命名空间(共用 IP 和端口)。
    • 类似“网络双胞胎”,适合日志收集或监控容器。
  • 示例
bash
# 运行一个主容器
docker run -d --name main-container nginx

# 新容器共享 main-container 的网络
docker run -it --network=container:main-container alpine sh
# 此时,两个容器的网络完全相同

三、自定义网络

Docker 允许创建自定义桥接网络,提供更好的容器间通信(支持 DNS 自动解析容器名称)。

1. 创建自定义桥接网络

bash
docker network create my-network

2. 将容器连接到自定义网络

bash
# 运行两个容器并连接到自定义网络
docker run -d --name web-app --network=my-network nginx
docker run -it --name debug-tool --network=my-network alpine sh

3. 容器间通过名称通信

debug-tool 容器内:

bash
ping web-app  # 直接通过容器名 ping 通(无需 IP)
curl http://web-app:80  # 通过容器名访问服务

4. 自定义网络的优点

  • DNS 自动解析:容器可通过名称互相通信。
  • 隔离性:不同自定义网络中的容器默认无法通信。
  • 灵活性:支持配置子网、网关和 IP 地址范围。

四、Docker 网络常用命令

1. 查看网络列表

bash
docker network ls

2. 检查网络详情

bash
docker network inspect bridge  # 查看默认桥接网络的详细信息

3. 连接/断开容器与网络

bash
docker network connect my-network existing-container
docker network disconnect my-network existing-container

4. 删除网络

bash
docker network rm my-network

五、端口映射详解

通过 -p 参数将容器端口映射到宿主机:

bash
# 格式:-p <宿主机端口>:<容器端口>
docker run -d -p 8080:80 --name web nginx

# 绑定特定 IP
docker run -d -p 192.168.1.100:8080:80 nginx

# 映射 UDP 端口
docker run -d -p 53:53/udp dns-server

六、常见问题与排查

1. 容器无法访问外部网络

  • 检查宿主机的防火墙或 iptables 规则。
  • 确保 Docker 服务正常运行:systemctl status docker

2. 容器间无法通信

  • 确认容器在同一网络中。
  • 检查自定义网络的 DNS 解析是否正常。

3. 端口冲突

  • 使用 docker ps 查看已占用的端口。
  • 更换宿主机端口或停止冲突的容器。

七、总结

网络模式特点适用场景
bridge默认隔离,需端口映射大多数单机应用
host直接使用宿主机网络高性能需求(如负载均衡)
none完全无网络安全测试/手动配置网络
container共享其他容器的网络监控/日志收集容器
自定义网络DNS 自动解析,隔离性强多容器协作(如微服务)

通过合理选择网络模式,您可以优化容器的通信效率和安全性。实际使用中,推荐优先使用自定义网络以简化服务发现。

/src/technology/docker/docker%E7%BD%91%E7%BB%9C%E8%AF%A6%E8%A7%A3.html