Loading...

文章背景图

docker-nginx-certbot:Nginx 容器自动申请续期 Let's Encrypt 证书部署指南

2026-10-27
0
- 字
- 分钟
|

docker-nginx-certbot 是一个基于官方 Nginx Docker 镜像(Debian 与 Alpine 均有)构建的容器,它使用 Let's Encrypt 免费证书机构及其客户端 certbot,自动创建并续期网站 SSL 证书,同时自动生成 Diffie-Hellman 参数用于初始握手加密套件。

一、项目官方信息

项目 信息
GitHub 仓库 https://github.com/JonasAlfredsson/docker-nginx-certbot
Docker Hub 镜像 https://hub.docker.com/r/jonasal/nginx-certbot
开源协议 MIT
主要语言 Shell(约 90.1%)
Star 数 约 1.2k
证书来源 Let's Encrypt(certbot 客户端)

该容器的亮点:一次请求可处理多个服务器名(如同时包含 example.com 与 www.example.com);配合 DNS 认证可签发泛域名证书;可同时签发 RSA 与 ECDSA 证书;自动创建 DH 参数;沿用 Nginx 官方镜像的 /docker-entrypoint.d/ 目录;停止/被杀/失败时返回正确退出码;发送 SIGHUP 即可热重载配置而无需重启容器;支持借助本地 CA 离线使用;Debian 与 Alpine 镜像支持多架构。

二、官方图片

下图是该项目仓库在 GitHub 上的官方预览图:

docker-nginx-certbot 仓库预览

三、环境要求

  • 已安装 Docker(https://docs.docker.com/engine/install/ )。
  • 拥有一个已正确解析到服务器 IP 的域名;若在 NAT 后面,需正确转发 80 与 443 端口(可使用 DuckDNS 等动态 DNS)。
  • 首次启动较慢,因为容器会自动生成 Diffie-Hellman 参数(默认 2048 位),请耐心等待。
  • 建议先阅读项目 docs 中前两节,了解基础 server 配置写法与如何使用 Let's Encrypt 预发环境(staging)避免触发速率限制。

四、完整部署步骤

1. 准备自定义 Nginx 配置目录

在宿主机新建 user_conf.d/ 目录,把你自己的 server 配置文件放进去(参考仓库 examples 目录里的 example_server.conf)。该目录会以只读方式挂载进容器的 /etc/nginx/user_conf.d。

同时准备一个持久化目录 nginx_secrets,用于保存已签发的证书与 DH 参数(挂载到容器的 /etc/letsencrypt)。

2. 用 docker run 启动

docker run -it -p 80:80 -p 443:443 \
           --env CERTBOT_EMAIL=your@email.org \
           -v $(pwd)/nginx_secrets:/etc/letsencrypt \
           -v $(pwd)/user_conf.d:/etc/nginx/user_conf.d:ro \
           --name nginx-certbot jonasal/nginx-certbot:latest
  • -p 80:80 -p 443:443:暴露 HTTP/HTTPS 端口;
  • CERTBOT_EMAIL:必填,Let's Encrypt 用于在安全问题发生时联系你;
  • 两个 -v:分别持久化证书目录、只读挂载你的 Nginx 配置目录;
  • 镜像建议使用具体 tag(jonasal/nginx-certbot:latest 不保证 100% 稳定),可用 Ctrl+P 再按 Ctrl+Q 脱离容器。

3. 用 docker-compose 启动

仓库 examples/ 目录提供了 docker-compose.yml 与 nginx-certbot.env 示例。把自定义 server 配置放进 user_conf.d/ 后执行:

docker-compose up

nginx-certbot.env 里的默认参数可被 yaml 中 environment: 覆盖;environment: 与 env_file: 可单独或组合使用,唯一要求是必须在某处定义 CERTBOT_EMAIL。

4. 修改配置后热重载

容器就绪后,改动配置文件无需重启容器,向容器发送 SIGHUP 即可让脚本和 Nginx 全部重载:

docker kill --signal=HUP <container_name>

5. 自定义 Dockerfile 自建镜像

如果你想把配置直接打进镜像,可跳过 user_conf.d/,把文件复制到 Nginx 的 conf.d/:

FROM jonasal/nginx-certbot:latest
COPY conf.d/* /etc/nginx/conf.d/

注意自建前请先理解镜像内已有配置如何与 certbot 协同工作。

五、使用方法

环境变量

必填:

变量 说明
CERTBOT_EMAIL 你的邮箱,Let's Encrypt 安全通知用

可选:

变量 默认值 说明
DHPARAM_SIZE 2048 Diffie-Hellman 参数位数
ELLIPTIC_CURVE secp256r1 ECDSA 密钥曲线
RENEWAL_INTERVAL 8d certbot 续期检查间隔
RSA_KEY_SIZE 2048 RSA 密钥位数
STAGING 0 设为 1 使用 Let's Encrypt 预发环境
USE_ECDSA 1 设为 0 改用 RSA 证书

高级:

变量 默认值 说明
CERTBOT_AUTHENTICATOR webroot 响应挑战用的认证插件
CERTBOT_DNS_PROPAGATION_SECONDS certbot 默认 DNS 挑战等待传播秒数
CERTBOT_DNS_CREDENTIALS_DIR /etc/letsencrypt DNS 认证凭据目录
DEBUG 0 设为 1 开启调试并使用 nginx-debug
USE_LOCAL_CA 0 设为 1 启用本地 CA(离线使用)

卷说明

  • /etc/letsencrypt:存放已获取的证书与 Diffie-Hellman 参数,务必持久化挂载。

测试

在仓库根目录用 BATS 运行测试:

docker run -it --rm -v "$(pwd):/workdir" ffurrer/bats:latest ./tests

六、常见问题 FAQ

1. 为什么容器第一次启动要等很久? 首次启动时容器会自动生成 Diffie-Hellman 参数(默认 2048 位),这一步比较耗时,属正常现象。之后重启会快很多。

2. 调试阶段如何避免触发 Let's Encrypt 速率限制? 把环境变量 STAGING=1 打开,使用 Let's Encrypt 的预发环境签发测试证书,确认流程无误后再切回正式环境。

3. 如何签发泛域名证书? 泛域名证书需要用 DNS 认证(CERTBOT_AUTHENTICATOR 配置为对应的 DNS 插件),并准备好 DNS 凭据目录,详见仓库 docs 中 certbot_authenticators 文档。

4. 想同时用 RSA 和 ECDSA 证书怎么办? 镜像支持多证书配置,可同时请求 RSA 与 ECDSA 两张证书,参考 docs 中 advanced_usage 的 multi-certificate 章节;USE_ECDSA=0 则只签发 RSA。

5. 改了 Nginx 配置要重启容器吗? 不用。向容器发送 SIGHUP 即可热重载:docker kill --signal=HUP nginx-certbot。

6. 为什么不推荐直接用 :latest? README 明确建议 docker pull 时使用具体 tag,因为 :latest 可能并非 100% 稳定。所有可用 tag 见 docs/dockerhub_tags.md 或 Docker Hub 页面。

七、跳转链接

  • GitHub 仓库:https://github.com/JonasAlfredsson/docker-nginx-certbot
  • Docker Hub 镜像:https://hub.docker.com/r/jonasal/nginx-certbot
  • 官方文档(Good to Know / Advanced Usage / Certbot Authenticators):https://github.com/JonasAlfredsson/docker-nginx-certbot/tree/master/docs
评论交流

文章目录