当前位置: 首页 > news >正文

第四部分-Docker网络与存储——19. 容器间通信

19. 容器间通信

1. 容器间通信概述

容器间通信是 Docker 编排的核心,理解容器如何相互通信对于构建微服务架构至关重要。Docker 提供了多种容器间通信方式,每种方式适用于不同场景。

┌─────────────────────────────────────────────────────────────┐ │ 容器间通信方式 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 方式1:自定义网络(推荐) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 容器A ──▶ 容器名解析 ──▶ 容器B │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 方式2:端口映射 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 容器 ──▶ 宿主机端口 ──▶ 外部请求 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 方式3:容器网络共享 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 容器B (共享A的网络) ──▶ localhost ──▶ 容器A │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 方式4:跨主机通信 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 主机A容器 ──▶ Overlay ──▶ 主机B容器 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘

2. 自定义网络通信

2.1 同一网络通信

# 创建自定义网络dockernetwork create app-net# 在同一网络中运行容器dockerrun-d--nameweb--networkapp-net nginxdockerrun-d--nameapi--networkapp-net myapidockerrun-d--namedb--networkapp-net mysql# 通过容器名通信(自动 DNS 解析)dockerexecwebpingapidockerexecwebpingdb# 测试 HTTP 通信dockerexecapicurlhttp://web:80dockerexecapicurlhttp://db:3306# 查看 DNS 解析dockerexecwebcat/etc/resolv.confdockerexecwebnslookupapi

2.2 网络别名通信

# 创建网络dockernetwork create app-net# 为容器设置多个别名dockerrun-d--namedb\--networkapp-net\--network-alias mysql\--network-alias database\mysql# 其他容器通过别名访问dockerrun--rm--networkapp-net alpinepingmysqldockerrun--rm--networkapp-net alpinepingdatabase# 查看网络别名dockernetwork inspect app-net

3. 端口映射通信

3.1 基础端口映射

# 映射到宿主机端口dockerrun-d--nameweb-p8080:80 nginx# 其他容器通过宿主机访问dockerrun--rmalpinecurlhttp://host.docker.internal:8080# 映射到特定 IPdockerrun-d-p127.0.0.1:8080:80 nginx# 随机端口dockerrun-d-Pnginx# 查看看口映射dockerport web

3.2 多端口映射

# 映射多个端口dockerrun-d\--nameapp\-p8080:8080\-p8443:8443\-p9000-9005:9000-9005\myapp# UDP 端口dockerrun-d-p53:53/udp dns-server# 查看所有端口映射dockerinspect app|grep-A20PortBindings

4. 容器网络共享

4.1 Container 模式

# 主容器(提供网络)dockerrun-d--nameweb nginx# 辅助容器(共享网络)dockerrun-d--namesidecar--networkcontainer:web fluentd# sidecar 容器可以使用 localhost 访问 web# sidecar 容器没有独立网络栈,IP 与 web 相同# 查看网络dockerexecsidecaripaddr# 与 web 相同# 适用场景:# - 日志收集# - 监控代理# - 网络调试

4.2 网络工具侧车

# 主应用容器dockerrun-d--nameapp myapp# 网络调试容器(共享网络)dockerrun-it--namenet-debug--networkcontainer:app alpinesh# 在调试容器中抓包apkaddtcpdump tcpdump-ieth0-c10# 查看网络连接netstat-tulnss-tuln

5. Docker Compose 通信

5.1 Compose 默认网络

# docker-compose.ymlversion:'3.8'services:web:image:nginxapi:image:myapidb:image:mysqlenvironment:MYSQL_ROOT_PASSWORD:123# 服务之间自动可以通过服务名通信# web → api# api → db

5.2 自定义 Compose 网络

version:'3.8'services:web:image:nginxnetworks:-frontendapi:image:myapinetworks:-frontend-backenddb:image:mysqlnetworks:-backendnetworks:frontend:backend:

6. 跨主机通信

6.1 Overlay 网络

# 初始化 Swarm 集群dockerswarm init --advertise-addr192.168.1.10# 创建 Overlay 网络dockernetwork create-doverlay--attachablemy-overlay# 在其他节点加入集群dockerswarmjoin--tokenSWMTKN-1-xxx192.168.1.10:2377# 使用 Overlay 网络运行服务dockerservicecreate--nameweb--networkmy-overlay nginx# 查看 Overlay 网络状态dockernetwork inspect my-overlay

6.2 Macvlan 跨主机

# 每台主机创建相同配置的 macvlan 网络dockernetwork create-dmacvlan\--subnet=192.168.1.0/24\--gateway=192.168.1.1\-oparent=eth0\macnet# 容器获得同网段 IP,可直接跨主机通信

7. 通信测试工具

7.1 网络测试容器

# 创建网络测试镜像cat>Dockerfile.test<<EOF FROM alpine RUN apk add --no-cache curl wget netcat-openbsd bind-tools iputils nmap CMD ["sleep", "infinity"] EOFdockerbuild-fDockerfile.test-tnet-tool.# 运行测试容器dockerrun-d--nametester--networkapp-net net-tool# 测试连接dockerexectesterpingwebdockerexectesternslookupapidockerexectestercurlhttp://db:3306

7.2 常用测试命令

# Ping 测试dockerexeccontainerApingcontainerB# HTTP 测试dockerexeccontainerAcurl-vhttp://containerB:8080/health# 端口连通性dockerexeccontainerAnc-zvcontainerB3306# DNS 解析dockerexeccontainerAnslookupcontainerBdockerexeccontainerAdigcontainerB# 路由追踪dockerexeccontainerAtraceroutecontainerB# HTTP 压力测试dockerexeccontainerA ab-n1000-c10http://containerB:8080/

8. 安全通信

8.1 TLS/SSL 加密

# 为容器间通信配置 TLS# 生成证书openssl req-x509-newkeyrsa:4096-keyoutkey.pem-outcert.pem-days365-nodes# 挂载证书到容器dockerrun-d--nameapp\-v$(pwd)/cert.pem:/app/cert.pem\-v$(pwd)/key.pem:/app/key.pem\myapp# 配置 HTTPSdockerrun-d--namenginx\-v$(pwd)/cert.pem:/etc/nginx/cert.pem\-v$(pwd)/key.pem:/etc/nginx/key.pem\nginx

8.2 网络隔离策略

# 创建隔离网络dockernetwork create--internalinternal-net# 敏感服务放在内部网络dockerrun-d--namedb--networkinternal-net mysql# API 网关连接内外网络dockerrun-d--nameapi-gateway--networkinternal-net--networkexternal-net myapp# 外部只能访问 API 网关

9. 故障排查

9.1 常见通信问题

# 1. 容器无法解析其他容器名# 检查网络类型(默认 bridge 不支持)dockerinspect container|grep-A10Networks# 2. 端口连接失败# 检查容器内服务是否运行dockerexeccontainernetstat-tuln# 3. 网络隔离导致无法通信# 检查网络配置dockernetwork inspect network-name# 4. iptables 规则干扰sudoiptables-L-n-v

9.2 通信监控

# 监控容器间流量dockerrun-it--rm--net=host nicolaka/netshoot# 使用 tcpdump 抓包# 查看连接状态dockerexeccontainer ss-tunp# 监控服务端口dockerexeccontainernetstat-an|grepLISTEN

10. 性能优化

10.1 减少网络开销

# 使用 host 网络减少 NATdockerrun-d--networkhostmyapp# 使用 --link(已过时,不推荐)# 使用自定义网络代替# 使用网络音量dockernetwork create--optcom.docker.network.bridge.enable_ip_masquerade=false mynet

10.2 连接池

# 应用层配置连接池# 减少频繁建立连接的开销# 以 MySQL 为例:

11. 通信模式对比

方式性能易用性跨主机适用场景
自定义网络单机微服务
端口映射外部访问
Container模式Sidecar
OverlaySwarm 集群
Macvlan物理网络

12. 最佳实践

✅ 推荐做法

  1. 使用自定义网络统一管理
  2. 服务间使用容器名通信
  3. 合理规划网络架构(前端/后端/数据层)
  4. 敏感服务放在内部网络
  5. 使用健康检查确保服务可用
  6. 添加网络连接超时和重试

❌ 避免事项

  • 使用已废弃的--link
  • 跨服务传递容器 IP(IP 会变化)
  • 忽略网络隔离导致安全漏洞
  • 生产环境使用默认 bridge

13. 常见问题

Q1: 容器间通信延迟高怎么办?

  • 使用--network host模式
  • 检查网络驱动配置
  • 使用 Macvlan 绕过 NAT

Q2: 容器重启后 IP 变化怎么办?

  • 使用容器名而不是 IP
  • 自定义网络提供 DNS 解析

Q3: 如何限制容器间通信?

  • 使用网络隔离
  • 配置 iptables 规则
  • 使用网络策略(Kubernetes)

14. 小结

  • 自定义网络是最推荐的容器间通信方式
  • 容器名解析简化服务发现
  • 端口映射用于外部访问
  • Container 模式适合 Sidecar
  • Overlay/Macvlan支持跨主机通信
  • 合理设计网络架构提高安全性
  • 选择适当的通信方式平衡性能和易用性

http://www.jsqmd.com/news/791969/

相关文章:

  • ImageGlass架构深度剖析:Windows平台高性能图像浏览引擎的技术实现与优化
  • 概率-dp
  • AXI4-Lite协议实战:从接口信号到SoC集成
  • S32K144 Lin组件实战:告别官方LinStack,手把手教你用底层驱动搞定超声波雷达
  • LinkSwift:如何让网盘下载从龟速到光速?这款工具给出了答案
  • 观察不同时段调用Taotoken多模型API的延迟波动情况
  • 如何入门代码调试
  • 终极指南:3分钟快速找回Navicat数据库连接密码的免费工具
  • 终极指南:3步解锁碧蓝航线全皮肤功能的Perseus补丁配置
  • 我还是要坚持住
  • “社恐”技术大牛周志明的写作哲学:如何像他一样,用开源文档和博客打造个人技术品牌
  • 别再只配防火墙了!华为USG+交换机联动配置实战:让内网用户顺利上网的完整闭环
  • 捷报频传!奋飞咨询刘老师辅导山东某化工企业荣获EcoVadis铜牌! - 奋飞咨询ecovadis
  • 从理论到实践:利用MATLAB UDP实现跨进程实时数据交换
  • 编程应届生面试,HR最常问的20个问题,高分答案都在这里
  • 第四部分-Docker网络与存储——20. 数据持久化
  • 对比直接使用厂商API,通过Taotoken调用大模型的延迟体感差异
  • Umi-OCR终极指南:免费开源离线文字识别工具全解析
  • 跨平台流媒体下载技术解析:如何用现代架构解决DRM内容获取难题
  • Vivado里用OSERDESE2+OBUFDS实现LVDS输出,一个完整可复用的Verilog模块(含XDC约束)
  • 如何快速提取Unity游戏素材:AssetStudio完整使用指南
  • 面试官与谢飞机的三轮灵魂拷问:从Spring Boot启动到分布式事务
  • 第四部分-Docker网络与存储——21. 高级存储
  • 3分钟搞定Jable视频下载:终极免费解决方案完整指南
  • 品牌打造的低成本高回报之路
  • Unity UGUI点击事件避坑指南:为什么你的Image点了没反应?
  • 为什么92%的企业LLMOps平台在Q3失效?SITS 2026披露4个被忽略的合规性断点与2小时热修复路径
  • Windows和Office终极激活指南:告别烦恼的智能解决方案
  • 2025届学术党必备的五大AI辅助论文平台推荐
  • ECharts地图可视化踩坑实录:从GeoJSON数据获取到本地开发跨域问题的全链路解决