Docker Compose本身不提供容器间mTLS一键配置,需手动为各服务注入CA证书、服务端/客户端证书及私钥,并在应用或Sidecar中实现TLS握手与双向校验。

直接在 Docker Compose 中为容器间通信配置 TLS 双向认证,不是靠 docker-compose.yml 本身内置字段实现的,而是需要你主动为每个服务容器注入证书、配置运行时参数,并确保它们使用 TLS 协议通信。Docker Compose 不提供“一键开启容器间 mTLS”的抽象层,它只负责编排网络与启动容器——真正的加密和校验由应用自身或代理层完成。
明确 TLS 双向认证的责任边界
Docker Compose 管网络、启容器、设环境变量,但不处理证书交换或握手逻辑。是否启用双向 TLS(mTLS),取决于:
- 你的应用是否支持加载证书并强制验证对端身份(如 Go 的
tls.Config、Java 的SSLContext、Nginx 的ssl_client_certificate) - 是否在容器内挂载了 CA 根证书、服务端证书/私钥、客户端证书/私钥
- 服务之间调用时是否使用
https://或grpcs://等 TLS 协议地址,而非http://
准备并分发证书到各服务容器
所有参与 mTLS 的服务必须使用同一套 CA 签发的证书体系:
- 生成一个私有 CA(
ca.pem+ca-key.pem),4096 位密钥 - 为每个服务生成独立证书:例如
web.pem/web-key.pem、api.pem/api-key.pem,均用该 CA 签发 - 将
ca.pem挂载进所有容器的可信根目录(如/etc/ssl/certs/ca-bundle.crt或应用指定路径) - 将对应服务的证书+私钥以只读方式挂载(如
/certs/tls.crt和/certs/tls.key),并设权限为600
示例片段(在 docker-compose.yml 中):
image: my-web-app
volumes:
- ./certs/ca.pem:/etc/ssl/certs/ca-bundle.crt:ro
- ./certs/web.pem:/certs/tls.crt:ro
- ./certs/web-key.pem:/certs/tls.key:ro
environment:
- TLS_CERT_PATH=/certs/tls.crt
- TLS_KEY_PATH=/certs/tls.key
通过自定义网络 + DNS 实现安全通信基础
即使启用 mTLS,也需先确保容器能可靠发现并连接彼此:
- 禁用默认网络,全部使用显式定义的自定义 bridge 网络(如
internal) - 让需要互通的服务加入同一网络,利用 Docker 内置 DNS 按服务名解析(如
https://api:8443/health) - 避免使用
host.docker.internal或硬编码 IP,防止证书 SAN 不匹配 - 若服务部署跨网络(如 web 在 frontend、db 在 backend),则需让中间服务(如 api)同时接入两个网络,再由它代理或转发请求
在应用层或反向代理中启用 mTLS
常见落地方式有两类:
-
应用直连模式:每个服务内置 TLS 客户端,调用前加载对方域名对应的 CA 证书,并校验服务端证书中的 SAN 或 CN。例如 Go 应用中设置
tls.Config{VerifyPeerCertificate: ...} -
Sidecar 代理模式:用 Envoy、Linkerd 或 Nginx 作为边车,统一处理 TLS 终止与发起。例如用 Nginx 做 client-side mTLS:
– 配置proxy_ssl_certificate和proxy_ssl_certificate_key
– 设置proxy_ssl_trusted_certificate指向 CA 根
– 开启proxy_ssl_verify on
此时 docker-compose.yml 需额外定义 sidecar 容器,并通过 depends_on 和共享网络确保顺序与可达性。


















