Email:Service@dogssl.com
CNY
Let's Encrypt在Docker容器中的部署
更新时间:2026-02-05 作者:Let's Encrypt 证书

在 Docker 环境中部署 Let's Encrypt 可以实现容器的 HTTPS 安全访问,尤其适合微服务架构、Web 应用或反向代理场景。Docker 的容器化特性使得证书管理更具可移植性和隔离性,但也引入了卷挂载、端口映射和自动续期等挑战。

本文基于 Let's Encrypt 官方文档和社区最佳实践,详细介绍在 Docker 中部署 Certbot 的步骤、配置示例以及常见问题解决。无论你是初次尝试还是优化现有 setup,这篇文章都能提供全面指导。我们将重点使用 Certbot 的官方 Docker 镜像,并结合 Nginx 等 Web 服务器示例。

一、为什么在 Docker 中使用 Let's Encrypt?

Docker 容器化了应用,但默认不处理 TLS 终止。Let's Encrypt 通过ACME协议自动化证书颁发,有效期 90 天,支持自动续期。在 Docker 中的优势包括:

  • 隔离性:证书存储在持久卷中,不受容器重启影响。
  • 可扩展性:易于集成到 Docker Compose 或 Kubernetes 中。
  • 免费与自动化:无需手动 CSR 生成,支持 HTTP-01 或 DNS-01 验证。

常见场景:为 Nginx 容器提供证书,或为自定义 Node.js/Go 应用启用 HTTPS。注意:Docker 主机需暴露 80/443 端口(HTTP-01 验证需 80 端口),域名需解析到主机 IP。

二、先决条件

部署前,确保满足以下要求:

  • Docker 与 Docker Compose:安装最新版本(Docker 20+,Compose 2+)。
  • 域名:已注册并指向服务器的公网 IP(A 记录)。
  • 端口开放:防火墙允许 80(验证)和 443(HTTPS)端口。
  • Certbot 镜像:官方镜像 certbot/certbot ,支持插件如 certbot/dns-cloudflare (DNS-01 用)。
  • Web 服务器:如 Nginx,用于托管挑战文件或提供 HTTPS。
  • 权限:主机有 sudo 权限,Docker 运行非 root 用户推荐。

如果使用云服务器(如 AWS EC2),确保安全组允许入站流量。

三、基本部署步骤:使用 Certbot Docker 镜像

Certbot 提供官方 Docker 镜像,便于在容器中运行,而无需在主机安装。核心是通过卷挂载共享证书和挑战文件。

步骤 1:拉取 Certbot 镜像

docker pull certbot/certbot

这会下载最新版本的 Certbot。

步骤 2:创建持久卷

证书需持久存储。创建目录:

mkdir -p /path/to/letsencrypt/etc /path/to/letsencrypt/www
  • /etc :存储证书和账户信息。
  • /www :HTTP-01 挑战文件路径。

步骤 3:获取证书

使用 docker run 执行 Certbot。示例(HTTP-01 验证):

docker run --rm -it \
  -v "/path/to/letsencrypt/etc:/etc/letsencrypt" \
  -v "/path/to/letsencrypt/www:/var/www/certbot" \
  -p 80:80 \
  certbot/certbot certonly --standalone \
  --email your@email.com -d yourdomain.com --agree-tos
  • --standalone :Certbot 内置 Web 服务器处理挑战(适合无现有 Web 服务器)。
  • 如果有现有 Web 服务器,用 --webroot -w /var/www/certbot
  • 对于多个域名: -d domain1.com -d domain2.com

成功后,证书位于  /path/to/letsencrypt/etc/live/yourdomain.com/ (fullchain.pem 和 privkey.pem)。

如果使用 DNS-01(无需 80 端口),拉取插件镜像如 certbot/dns-route53 ,并提供 API 凭证。

步骤 4:集成到应用容器

将证书卷挂载到你的应用容器。例如,在 Node.js 应用中:

docker run -d \
  -v "/path/to/letsencrypt/etc/live/yourdomain.com:/app/certs" \
  your-node-app

在代码中加载证书启用 HTTPS 服务器。

四、使用 Docker Compose 的高级部署

对于生产环境,推荐 Docker Compose 管理多容器。以下是 Nginx + Certbot 的完整示例,Nginx 作为反向代理。

1. 示例 docker-compose.yml

version: '3.8'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d:ro
      - ./letsencrypt/www:/var/www/certbot:ro
      - ./letsencrypt/etc/live/yourdomain.com:/etc/nginx/ssl:ro
    restart: always
    depends_on:
      - certbot   # 可选,如果初始获取后移除依赖

  certbot:
    image: certbot/certbot:latest
    volumes:
      - ./letsencrypt/www:/var/www/certbot:rw
      - ./letsencrypt/etc:/etc/letsencrypt:rw
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

(1)Nginx 配置:在 conf/default.conf 中配置 SSL:

  server {
      listen 80;
      server_name yourdomain.com;
      location /.well-known/acme-challenge/ {
          root /var/www/certbot;
      }
      location / {
          return 301 https://$host$request_uri;
      }
  }

  server {
      listen 443 ssl;
      server_name yourdomain.com;
      ssl_certificate /etc/nginx/ssl/fullchain.pem;
      ssl_certificate_key /etc/nginx/ssl/privkey.pem;
      location / {
          proxy_pass http://your-app:port;   # 代理到后端应用
      }
  }

(2)初始获取证书:先运行 docker-compose up -d nginx ,然后单独运行 Certbot:

  docker-compose run --rm certbot certonly --webroot --webroot-path=/var/www/certbot -d yourdomain.com --email your@email.com --agree-tos

这使用 Nginx 的 80 端口处理挑战。

2. 自动续期

Certbot 的 renew 命令检查并续期证书。Compose 中的 entrypoint 实现循环检查(每 12 小时)。续期后,重载 Nginx:

  • 添加 post-hook:在 Certbot 命令后加 --renew-hook "docker-compose exec nginx nginx -s reload"
  • 或挂载 Docker sock 到 Certbot 容器:
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock

然后在 hook 中用 docker exec 重启 Nginx。

五、使用 Traefik 作为替代方案

Traefik 是一个现代反向代理,支持内置 Let's Encrypt,无需单独 Certbot 容器。示例 Compose:

version: '3.8'

services:
  traefik:
    image: traefik:v2.10
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command:
      - --providers.docker
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.myresolver.acme.email=your@email.com
      - --certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web

  your-app:
    image: your-app-image
    labels:
      - "traefik.http.routers.app.rule=Host(`yourdomain.com`)"
      - "traefik.http.routers.app.tls.certresolver=myresolver"

Traefik 自动处理验证和续期,简化配置。

六、常见问题与排查

1. 端口冲突:如果 80/443 已占用,检查 docker ps 并停止冲突容器。使用 --standalone 时,确保无其他服务监听 80。

2. 卷权限问题:证书文件属 root,确保应用容器有读权限(chmod 644)。

3. 率限错误:测试时用 Staging 环境 --server https://acme-staging-v02.api.letsencrypt.org/directory

4. 验证失败:确认域名解析正确,检查日志 docker logs certbot 。IPv6 支持需完整。

5. 续期失败:Cron 任务需容器运行中;测试 certbot renew --dry-run

6. 自定义应用:如 Node.js,挂载证书并用 https.createServer

如果使用云 DNS,提供商插件需 API 密钥作为环境变量。

通过 Docker 部署 Let's Encrypt,你可以轻松实现零停机 HTTPS。实际部署时,从 Staging 测试开始,避免率限。参考官方文档和社区论坛获取最新更新。


Dogssl.com拥有20年网络安全服务经验,提供构涵盖国际CA机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书