在 CentOS 上,Docker 容器间通信可按同宿主机与跨主机两类来实施,常用做法包括自定义 bridge 网络、Host/Container 网络模式、以及 Swarm 的 Overlay 网络。下面给出要点与可直接复用的命令示例。
同宿主机通信
-
默认 bridge 网络
- 原理:Docker 创建虚拟网桥 docker0,同一宿主机上的容器接入该网桥,通常在 172.17.0.0/16 网段,容器间可用各自的 Container-IP 互通。
- 示例:
- 启动容器:docker run -d --name c1 centos:7 sleep 3600
- 查看 IP:docker exec -it c1 ip addr(常见形如 172.17.0.x)
- 互通测试:docker exec -it c1 ping -c 4 172.17.0.y
- 说明:默认的 bridge 网络不支持容器名解析,需使用 IP;如需名称解析,请使用自定义网络。
-
自定义 bridge 网络(推荐)
- 原理:自定义 bridge 启用 Docker 内置 DNS,容器间可直接用容器名/别名互通。
- 示例:
- 创建网络:docker network create --driver bridge mynet
- 启动容器:docker run -d --name app --network mynet centos:7 sleep 3600
- 启动依赖:docker run -d --name db --network mynet centos:7 sleep 3600
- 名称访问:docker exec -it app ping -c 4 db
- 事后接入:docker network connect mynet existing_container
- 适用:微服务、多容器协作,避免硬编码 IP。
-
Host 网络模式
- 原理:容器与宿主机共享网络命名空间,直接使用宿主机 IP 与端口,性能更好但隔离性更弱。
- 示例:docker run -d --name app --network host nginx:alpine
- 适用:对网络性能敏感、端口统一管理场景。
-
Container 网络模式
- 原理:多个容器共享同一网络命名空间,相当于“同机进程”,可通过 127.0.0.1 直连。
- 示例:
- 启动主容器:docker run -d --name backend centos:7 sleep 3600
- 共享网络:docker run -d --name sidecar --network container:backend centos:7 sleep 3600
- 本机回环互通:docker exec -it sidecar ping -c 4 127.0.0.1
- 适用:调试、日志/代理与主从进程紧耦合场景。
-
不推荐的 --link(仅作了解)
- 特点:通过修改 /etc/hosts 实现别名访问,常为单向,官方已不推荐;如需名称解析,请优先使用自定义网络。
跨主机通信
-
Docker Swarm Overlay 网络
- 原理:在多主机集群中创建 Overlay 网络,结合内置 DNS 实现服务名解析与跨主机互通。
- 示例:
- 初始化 Swarm:docker swarm init(如有多网卡,需指定 --advertise-addr)
- 创建网络:docker network create --driver overlay myoverlay
- 部署服务:docker service create --name web --network myoverlay -p 8080:80 nginx:alpine
- 集群内访问:同一 overlay 网络中的任意服务可用服务名访问(如 curl http://db:3306)
- 适用:多节点生产集群、需要服务发现与负载均衡。
-
其他方案(按需)
- 第三方插件/方案:如 Weave、Flannel 等可实现跨主机容器 IP 互通(适合非 Swarm 场景)。
- 静态路由 + iptables:在明确网络拓扑时可用,但运维复杂度较高。
常见故障排查与最佳实践
-
互通性开关
- 检查是否关闭了容器间通信:docker info | grep -i icc(默认 icc=true)。如为 false,只有显式 –link 的容器才可互通(不建议关闭)。
-
端口与访问
- 容器 Container-IP 仅在同一宿主机内可达;从外部访问需通过 -p 宿主端口:容器端口 做端口映射,或采用 Host 网络模式。
-
名称解析
- 默认 bridge 不支持容器名解析;需使用自定义 bridge 或 Swarm Overlay 才能用服务名/容器名互通。
-
网络与进程管理
- 查看网络:docker network ls、docker network inspect
- 连接/断开网络:docker network connect/disconnect
- 查看容器 IP:docker inspect -f ‘{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’
- 抓包与连通性:在容器内使用 ping、curl、nc;必要时在宿主机用 tcpdump 排查。