Docker 命令之 --network 参数
在 Docker 中实现容器间互访的常见解决方案如下,根据实际需求选择合适的方式。
推荐装有 docker 的主机上,不管任何情况,先创建一个自定义网络,后面的容器一律使用 --network 加入进来。
使用自定义桥接网络(推荐)
适用场景:单主机内多容器通信
核心优势:
- DNS 自动解析:容器间通过服务名(如
container1)直接访问,无需维护 IP 地址。 - 网络隔离:避免与默认
bridge网络冲突,提升安全性。
原理:通过创建 Docker 自定义桥接网络,容器间可通过容器名称直接通信,无需依赖易变的 IP 地址。
步骤:
# 创建自定义网络
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 <网络名> 命令。
关键步骤与操作
# 检查网络列表。查看所有网络,确认目标网络名称(如 my-net)
docker network ls
# 断开容器连接。若网络仍有容器连接,需先断开或删除容器
docker container disconnect <网络名> <容器名>
# 删除(强制删除运行中容器)
docker rm -f <容器名>
# 删除自定义网络
docker network rm <网络名>Docker Compose 自动管理
原理:通过 docker-compose.yml 定义服务,所有服务默认加入同一网络,自动实现容器名解析。
示例配置:
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 访问对应容器。
诊断与监控
连通性测试:
# 测试 DNS 解析与连通性(从 container1 容器中 ping container2 容器)
docker exec -it container1 ping container2
# 验证应用层访问
docker exec -it container1 curl -v http://container2:8080网络监控:使用 docker network inspect network_default 查看网络详情。
避免的常见陷阱
- 禁用默认桥接网络:
- 默认
bridge缺乏 DNS,需手动--link(已弃用),改用自定义网络。
- 默认
- 慎用
host模式:- 虽性能高,但牺牲网络隔离性,仅适合特定场景(如 Nginx 网关)。
- 端口映射非万能:
- 仅用于外部访问,容器间通信优先走内部网络。
为已存在的 Docker 容器添加自定义网络
为已存在的Docker容器添加自定义网络是一个常见的需求,这能让容器与其他特定容器通信,或接入一个已预设好IP地址段等的网络。你可以很方便地通过 docker network connect 命令实现这一点。
核心命令与基本步骤
为现有容器添加网络的核心命令是 docker network connect。基本操作步骤如下:
查看现有网络和容器
首先确认你要加入的网络和容器的名称或ID。
# 查看所有Docker网络
docker network ls
# 查看特定容器的详细信息(包括其当前连接的所有网络)
docker inspect <容器名称或ID>连接网络
使用 docker network connect 命令。
docker network connect <网络名称> <容器名称>
# 例如,将一个名为 `container1` 的容器连接到一个名为 `network_default` 的网络:
docker network connect network_default container1验证连接
执行 docker network connect 命令后,你可以再次使用 docker inspect <容器名称> 来验证容器是否已成功连接到新的网络。在输出的 Networks 部分,你应该能看到新添加的网络信息。
从网络中断开容器
如果需要将容器从某个网络中移除,可以使用 docker network disconnect 命令。
docker network disconnect <网络名称> <容器名称>
docker network disconnect network_default container1容器多网络接入与隔离:一个容器可以同时接入多个网络。
这种机制常用于实现复杂的网络拓扑,例如,让一个Web服务器容器同时接入前端网络和后台数据库网络,而数据库网络对其他前端容器是隔离的。
重要提示与最佳实践
- 网络驱动:以上操作主要适用于Docker的 bridge(桥接) 网络驱动,这也是最常见的单机网络模式。
- DNS解析:在用户自定义的 bridge 网络中,Docker 内置了 DNS 服务器,容器之间不仅可以通过IP地址通信,还可以直接通过容器名称进行解析和通信。
- 删除网络:在删除一个自定义网络之前,请确保没有容器再连接着它。
总结建议
生产环境首选:使用自定义网络或 Docker Compose,避免依赖 IP 和过时方法。
调试技巧:进入容器后通过 ping 或 nmap 验证网络连通性。
安全提示:避免直接暴露数据库等敏感服务端口到宿主机。
