【通信】D2D通信中基于Qlearning强化学习算法的联合资源分配与功率控制算法matlab仿真
2026/5/10 22:53:50
容器间通信是 Docker 编排的核心,理解容器如何相互通信对于构建微服务架构至关重要。Docker 提供了多种容器间通信方式,每种方式适用于不同场景。
┌─────────────────────────────────────────────────────────────┐ │ 容器间通信方式 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 方式1:自定义网络(推荐) │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 容器A ──▶ 容器名解析 ──▶ 容器B │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 方式2:端口映射 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 容器 ──▶ 宿主机端口 ──▶ 外部请求 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 方式3:容器网络共享 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 容器B (共享A的网络) ──▶ localhost ──▶ 容器A │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ │ 方式4:跨主机通信 │ │ ┌─────────────────────────────────────────────────────┐ │ │ │ 主机A容器 ──▶ Overlay ──▶ 主机B容器 │ │ │ └─────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────┘# 创建自定义网络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# 创建网络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# 映射到宿主机端口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# 映射多个端口dockerrun-d\--nameapp\-p8080:8080\-p8443:8443\-p9000-9005:9000-9005\myapp# UDP 端口dockerrun-d-p53:53/udp dns-server# 查看所有端口映射dockerinspect app|grep-A20PortBindings# 主容器(提供网络)dockerrun-d--nameweb nginx# 辅助容器(共享网络)dockerrun-d--namesidecar--networkcontainer:web fluentd# sidecar 容器可以使用 localhost 访问 web# sidecar 容器没有独立网络栈,IP 与 web 相同# 查看网络dockerexecsidecaripaddr# 与 web 相同# 适用场景:# - 日志收集# - 监控代理# - 网络调试# 主应用容器dockerrun-d--nameapp myapp# 网络调试容器(共享网络)dockerrun-it--namenet-debug--networkcontainer:app alpinesh# 在调试容器中抓包apkaddtcpdump tcpdump-ieth0-c10# 查看网络连接netstat-tulnss-tuln# docker-compose.ymlversion:'3.8'services:web:image:nginxapi:image:myapidb:image:mysqlenvironment:MYSQL_ROOT_PASSWORD:123# 服务之间自动可以通过服务名通信# web → api# api → dbversion:'3.8'services:web:image:nginxnetworks:-frontendapi:image:myapinetworks:-frontend-backenddb:image:mysqlnetworks:-backendnetworks:frontend:backend:# 初始化 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# 每台主机创建相同配置的 macvlan 网络dockernetwork create-dmacvlan\--subnet=192.168.1.0/24\--gateway=192.168.1.1\-oparent=eth0\macnet# 容器获得同网段 IP,可直接跨主机通信# 创建网络测试镜像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# Ping 测试dockerexeccontainerApingcontainerB# HTTP 测试dockerexeccontainerAcurl-vhttp://containerB:8080/health# 端口连通性dockerexeccontainerAnc-zvcontainerB3306# DNS 解析dockerexeccontainerAnslookupcontainerBdockerexeccontainerAdigcontainerB# 路由追踪dockerexeccontainerAtraceroutecontainerB# HTTP 压力测试dockerexeccontainerA ab-n1000-c10http://containerB:8080/# 为容器间通信配置 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# 创建隔离网络dockernetwork create--internalinternal-net# 敏感服务放在内部网络dockerrun-d--namedb--networkinternal-net mysql# API 网关连接内外网络dockerrun-d--nameapi-gateway--networkinternal-net--networkexternal-net myapp# 外部只能访问 API 网关# 1. 容器无法解析其他容器名# 检查网络类型(默认 bridge 不支持)dockerinspect container|grep-A10Networks# 2. 端口连接失败# 检查容器内服务是否运行dockerexeccontainernetstat-tuln# 3. 网络隔离导致无法通信# 检查网络配置dockernetwork inspect network-name# 4. iptables 规则干扰sudoiptables-L-n-v# 监控容器间流量dockerrun-it--rm--net=host nicolaka/netshoot# 使用 tcpdump 抓包# 查看连接状态dockerexeccontainer ss-tunp# 监控服务端口dockerexeccontainernetstat-an|grepLISTEN# 使用 host 网络减少 NATdockerrun-d--networkhostmyapp# 使用 --link(已过时,不推荐)# 使用自定义网络代替# 使用网络音量dockernetwork create--optcom.docker.network.bridge.enable_ip_masquerade=false mynet# 应用层配置连接池# 减少频繁建立连接的开销# 以 MySQL 为例:| 方式 | 性能 | 易用性 | 跨主机 | 适用场景 |
|---|---|---|---|---|
| 自定义网络 | 中 | 高 | 否 | 单机微服务 |
| 端口映射 | 低 | 低 | 是 | 外部访问 |
| Container模式 | 高 | 中 | 否 | Sidecar |
| Overlay | 中 | 高 | 是 | Swarm 集群 |
| Macvlan | 高 | 中 | 是 | 物理网络 |
--link--network host模式