Skip to content

Docker 命令之 --network 参数

在 Docker 中实现容器间互访的常见解决方案如下,根据实际需求选择合适的方式。

推荐装有 docker 的主机上,不管任何情况,先创建一个自定义网络,后面的容器一律使用 --network 加入进来。

使用自定义桥接网络(推荐)

适用场景:单主机内多容器通信

核心优势:

  • DNS 自动解析:容器间通过服务名(如 container1)直接访问,无需维护 IP 地址。
  • 网络隔离:避免与默认 bridge 网络冲突,提升安全性。

原理:通过创建 Docker 自定义桥接网络,容器间可通过容器名称直接通信,无需依赖易变的 IP 地址。

步骤:

shell
# 创建自定义网络
docker network create network_default

# 列出所有网络
docker network ls

# 查看网络详情(包括连接的容器)
docker network inspect network_default

# 启动容器时加入同一网络:
docker run --name container1 --network network_default -d image1
docker run --name container2 --network network_default -d image2

# 在容器内部通过名称访问:
ping container1

# 在 container2 中直接使用容器名
# 直接使用容器名访问
String url = "http://container1:8080/api";

优点:支持双向通信,IP 变化无影响,网络隔离性强。

删除自定义网络

Docker 删除自定义网络需先确保无容器连接,再执行 docker network rm <网络名> 命令。

关键步骤与操作

shell
# 检查网络列表。查看所有网络,确认目标网络名称(如 my-net)
docker network ls

# 断开容器连接。若网络仍有容器连接,需先断开或删除容器
docker container disconnect <网络> <容器>

# 删除(强制删除运行中容器)
docker rm -f <容器>

# 删除自定义网络
docker network rm <网络>

Docker Compose 自动管理

原理:通过 docker-compose.yml 定义服务,所有服务默认加入同一网络,自动实现容器名解析。

示例配置:

shell
version: "3"
services:
  app:
    image: your-app-image
    depends_on:
      - mysql
      - redis
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: root
  redis:
    image: redis:alpine

启动后,app 容器可直接通过服务名 mysql 或 redis 访问对应容器。

诊断与监控

连通性测试:

shell
# 测试 DNS 解析与连通性(从 container1 容器中 ping container2 容器)
docker exec -it container1 ping container2

# 验证应用层访问
docker exec -it container1 curl -v http://container2:8080

网络监控:使用 docker network inspect network_default 查看网络详情。

避免的常见陷阱

  1. 禁用默认桥接网络:
    • 默认 bridge 缺乏 DNS,需手动 --link(已弃用),改用自定义网络。
  2. 慎用 host 模式:
    • 虽性能高,但牺牲网络隔离性,仅适合特定场景(如 Nginx 网关)。
  3. 端口映射非万能:
    • 仅用于外部访问,容器间通信优先走内部网络。

为已存在的 Docker 容器添加自定义网络

为已存在的Docker容器添加自定义网络是一个常见的需求,这能让容器与其他特定容器通信,或接入一个已预设好IP地址段等的网络。你可以很方便地通过 docker network connect 命令实现这一点。

核心命令与基本步骤

为现有容器添加网络的核心命令是 docker network connect。基本操作步骤如下:

查看现有网络和容器

首先确认你要加入的网络和容器的名称或ID。

shell
# 查看所有Docker网络
docker network ls
# 查看特定容器的详细信息(包括其当前连接的所有网络)
docker inspect <容器名称或ID>

连接网络

使用 docker network connect 命令。

shell
docker network connect <网络名> <容器名>

# 例如,将一个名为 `container1` 的容器连接到一个名为 `network_default` 的网络:

docker network connect network_default container1

验证连接

执行 docker network connect 命令后,你可以再次使用 docker inspect <容器名称> 来验证容器是否已成功连接到新的网络。在输出的 Networks 部分,你应该能看到新添加的网络信息。

从网络中断开容器

如果需要将容器从某个网络中移除,可以使用 docker network disconnect 命令。

bash
docker network disconnect <网络名> <容器名>

docker network disconnect network_default container1

容器多网络接入与隔离:一个容器可以同时接入多个网络。

这种机制常用于实现复杂的网络拓扑,例如,让一个Web服务器容器同时接入前端网络和后台数据库网络,而数据库网络对其他前端容器是隔离的。

重要提示与最佳实践

  • 网络驱动:以上操作主要适用于Docker的 bridge(桥接) 网络驱动,这也是最常见的单机网络模式。
  • DNS解析:在用户自定义的 bridge 网络中,Docker 内置了 DNS 服务器,容器之间不仅可以通过IP地址通信,还可以直接通过容器名称进行解析和通信
  • 删除网络:在删除一个自定义网络之前,请确保没有容器再连接着它。

总结建议

生产环境首选:使用自定义网络或 Docker Compose,避免依赖 IP 和过时方法。

调试技巧:进入容器后通过 ping 或 nmap 验证网络连通性。

安全提示:避免直接暴露数据库等敏感服务端口到宿主机。