温馨提示×

CentOS上Docker容器间如何通信

小樊
37
2025-12-25 06:22:20
栏目: 智能运维

在 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 不支持容器名解析;需使用自定义 bridgeSwarm Overlay 才能用服务名/容器名互通。
  • 网络与进程管理

    • 查看网络:docker network ls、docker network inspect
    • 连接/断开网络:docker network connect/disconnect
    • 查看容器 IP:docker inspect -f ‘{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’
    • 抓包与连通性:在容器内使用 ping、curl、nc;必要时在宿主机用 tcpdump 排查。

0