Docker 使用私有 CA(例如 step-ca)签发的 HTTPS 证书时,需要区分 Docker Engine 拉取镜像 和 容器内应用访问 HTTPS 两种场景。它们的证书信任库不一定相同。
一、Docker Engine 信任私有 CA
适用于 docker login、docker pull、docker push 访问私有镜像仓库。
仅信任指定 Registry(推荐)
假设 Registry 地址为 registry.example.com:5000:
sudo mkdir -p /etc/docker/certs.d/registry.example.com:5000
sudo cp root_ca.crt /etc/docker/certs.d/registry.example.com:5000/ca.crt
目录名称应与实际访问的 Registry 主机名及端口一致;默认 HTTPS 443 端口通常可省略。ca.crt 应为 PEM 格式的 CA 证书,而不是私钥。
验证:
docker login registry.example.com:5000
Ubuntu / Debian 宿主机全局信任
sudo cp root_ca.crt /usr/local/share/ca-certificates/my-root-ca.crt
sudo update-ca-certificates
Linux 上 Docker 通常会使用宿主机的系统 CA 信任库。通常不必重启 Docker;如果仍未生效,可检查 Docker 日志及证书配置,再决定是否重启(重启可能影响运行中的容器)。
二、容器内部信任私有 CA
宿主机已经信任 CA,不代表容器内的 curl、程序或运行时自动信任。
对于 Debian / Ubuntu 基础镜像,推荐在 Dockerfile 中安装:
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y ca-certificates \
&& rm -rf /var/lib/apt/lists/*
COPY root_ca.crt /usr/local/share/ca-certificates/root_ca.crt
RUN update-ca-certificates
如果使用第三方镜像,也可以通过 Compose 挂载证书:
services:
app:
image: your-image:latest
volumes:
- ./root_ca.crt:/usr/local/share/ca-certificates/root_ca.crt:ro
但只挂载不会自动生效:容器还需运行 update-ca-certificates,并且镜像必须具备该命令、写入信任库的权限。对精简镜像或无 root 权限的应用,优先制作自定义镜像或使用应用自身支持的 CA 配置。
三、验证
在需要发起 HTTPS 请求的环境中执行:
curl -v https://service.example.com
如需排查信任库问题,可指定 CA 进行对照:
curl --cacert root_ca.crt https://service.example.com
如果指定 CA 成功而普通访问失败,优先检查默认 CA 信任库。证书的域名、有效期和证书链也必须正确;Java 等部分运行时可能有独立信任库。
不要将 CA 私钥复制进 Docker 或容器,也不建议使用
insecure-registries、curl -k跳过 TLS 验证。