
neatous/letsencrypt!Let's Encrypt Logo
基于letsencrypt基础镜像构建的Let's Encrypt证书自动获取与续期工具,通过webroot验证方式管理SSL证书。
本镜像提供了一种简单高效的方式,通过Let's Encrypt自动获取和续期SSL证书,采用webroot验证方式(即通过Web服务器的特定目录进行域名所有权验证)。适用于需要为Web服务(如Nginx、Apache等)配置HTTPS且希望自动管理证书生命周期的场景,避免手动操作证书续期的繁琐流程。
首先需配置Web服务器,确保其能正确响应/.well-known/acme-challenge路径的请求。以Nginx为例,添加如下配置:
nginxlocation '/.well-known/acme-challenge' { default_type "text/plain"; # 设置默认MIME类型为纯文本 root /tmp/letsencrypt; # 指定验证文件存放目录(需与后续挂载路径一致) }
运行Web服务器容器时,需挂载两个卷以与letsencrypt-webroot容器共享:
bash-v /data/letsencrypt:/etc/letsencrypt # 存储证书的持久化目录 -v /data/letsencrypt-www:/tmp/letsencrypt # webroot验证目录(需与Web服务器配置的root一致)
执行以下命令启动证书管理容器,替换示例中的域名和***:
bashdocker run \ --name some-letsencrypt \ -v /data/letsencrypt:/etc/letsencrypt \ # 挂载证书存储目录 -v /data/letsencrypt-www:/tmp/letsencrypt \ # 挂载webroot验证目录 -e 'DOMAINS=example.com [***] \ # 需申请证书的域名(空格分隔多个域名) -e 'EMAIL=***' \ # 用于紧急通知和密钥恢复的*** -e 'WEBROOT_PATH=/tmp/letsencrypt' \ # webroot验证目录路径(需与Web服务器配置一致) kvaps/letsencrypt-webroot
证书生成后,应用可通过以下路径访问证书文件:
/etc/letsencrypt/live/example.com/privkey.pem/etc/letsencrypt/live/example.com/cert.pem/etc/letsencrypt/live/example.com/chain.pem/etc/letsencrypt/live/example.com/fullchain.pem注意:必须完整挂载
/etc/letsencrypt目录,不可仅挂载/etc/letsencrypt/live子目录,否则该目录下证书文件的符号链接将无法正常工作!
可配置证书续期后的触发动作(如重载服务配置),实现依赖服务的自动更新。
挂载Docker Socket:需将主机的Docker Socket挂载到容器,以允许操作其他容器:
bash-v /var/run/docker.sock:/var/run/docker.sock
链接目标容器:通过--link参数链接需要操作的服务容器(如Nginx):
bash--link some-nginx # "some-nginx"为目标容器名称
设置续期钩子环境变量:通过LE_RENEW_HOOK环境变量定义触发动作,支持以下示例:
bash-e 'LE_RENEW_HOOK=docker kill -s HUP @CONTAINER_NAME@'
bash-e 'LE_RENEW_HOOK=docker restart @CONTAINER_NAME@'
注:
@CONTAINER_NAME@会自动替换为通过--link指定的容器名称。
以下是结合Nginx和letsencrypt-webroot的完整Docker Compose配置示例:
docker-compose.yml
yamlnginx: restart: always # 容器退出时自动重启 image: nginx # 使用官方Nginx镜像 hostname: example.com # 主机名(需替换为实际域名) volumes: - /etc/localtime:/etc/localtime:ro # 同步主机时间 - ./nginx:/etc/nginx:ro # 挂载本地Nginx配置(只读) - ./letsencrypt/conf:/etc/letsencrypt # 共享证书目录 - ./letsencrypt/html:/tmp/letsencrypt # 共享webroot验证目录 ports: - 80:80 # HTTP端口(用于证书验证) - 443:443 # HTTPS端口 environment: - LE_RENEW_HOOK=docker kill -s HUP @CONTAINER_NAME@ # Nginx重载钩子(示例) letsencrypt: restart: always # 容器退出时自动重启 image: kvaps/letsencrypt-webroot # 当前letsencrypt镜像 volumes: - /etc/localtime:/etc/localtime:ro # 同步主机时间 - /var/run/docker.sock:/var/run/docker.sock # 挂载Docker Socket以操作其他容器 - ./letsencrypt/conf:/etc/letsencrypt # 证书存储目录(与Nginx共享) - ./letsencrypt/html:/tmp/letsencrypt # webroot验证目录(与Nginx共享) links: - nginx # 链接Nginx容器,用于续期钩子 environment: - DOMAINS=example.com [***] # 需申请证书的域名(空格分隔,替换为实际域名) - EMAIL=*** # 联系***(替换为实际***) - WEBROOT_PATH=/tmp/letsencrypt # webroot验证目录(需与Nginx配置一致) - EXP_LIMIT=30 # 证书到期前30天开始尝试续期(默认值) - CHECK_FREQ=30 # 每30天检查一次证书状态(默认值)
支持单次运行模式,即执行一次证书更新后立即退出容器,适用于通过外部定时任务(如Cron)触发的场景。只需在docker run命令末尾添加once参数:
bashdocker run \ --name some-letsencrypt \ -v /data/letsencrypt:/etc/letsencrypt \ -v /data/letsencrypt-www:/tmp/letsencrypt \ -e 'DOMAINS=example.com [***] \ -e 'EMAIL=***' \ -e 'WEBROOT_PATH=/tmp/letsencrypt' \ kvaps/letsencrypt-webroot \ once # 单次运行模式
| 环境变量 | 说明 | 示例值 | 默认值 |
|---|---|---|---|
DOMAINS | 需申请证书的域名列表(空格分隔多个域名) | example.com [***] | 无(必填) |
EMAIL | 联系***,用于接收证书到期通知及密钥恢复 | *** | 无(必填) |
WEBROOT_PATH | webroot验证目录路径(需与Web服务器配置的root一致) | /tmp/letsencrypt | /tmp/letsencrypt |
CHOWN | 证书文件的所有者(用户:组) | www-data:www-data | root:root |
CHMOD | 证书文件的权限(八进制格式) | 600 | 644 |
EXP_LIMIT | 证书到期前多少天开始尝试续期(整数) | 30 | 30 |
CHECK_FREQ | 证书续期检查频率(天数,整数) | 30 | 30 |
LE_RENEW_HOOK | 证书续期后的触发动作(需配合Docker Socket和--link使用) | docker restart @CONTAINER_NAME@ | 无 |




manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务