docker容器 nginx + acme.sh 实现自动续签证书
在docker中使用nginx,并在nginx容器中使用acme.sh自动续签证书,本文中使用CloudFlare的dns验证进行自动续签。
因为默认docker nginx镜像中没有cron,但acme的自动续签功能又依赖于cron,所以只能在此之上构建一个带cron的docker镜像。
编写dockerfile
nano ./dockerfile
1 | # 以nginx镜像为基础镜像 |
构建镜像
注意:过程需要连接到get.acme.sh和apt-get源,docker源,请保持网络通畅。
docker build -t nginx-acme -f dockerfile .
配置docker compose
使用刚才构建好的镜像nginx-acme
mkdir nginx-acme && cd nginx-acme
nano ./docker-compose.yaml
1 | services: |
创建nginx.conf文件,用于映射进容器来配置nginx,证书路径填/file/ssl/cert.pem,私钥路径填/file/ssl/key.pem
nano ./nginx.conf
1 | …… |
创建account.conf文件,用于映射进容器来配置acme.sh
nano ./account.conf
1 | #LOG_FILE="/root/.acme.sh/acme.sh.log" |
配置好之后,直接启动docker compose服务手动申请证书一次,否则nginx会报错找不到证书文件。
docker compose up -d
申请测试证书
进入容器测试申请证书是否正常(使用docker ps查看nginx-acme容器id)
docker exec -it [nginx-acme容器id] /bin/bash
申请测试证书(仅临时测试用,不受浏览器信任)命令:
/root/.acme.sh/acme.sh --issue --staging -d "域名" --dns dns_cf --key-file /file/ssl/key.pem --fullchain-file /file/ssl/cert.pem --reloadcmd "nginx -s reload"
申请测试证书成功后就可以退出并关掉docker compose服务。
exit
docker compose down
启动服务
这里说明一下,如果刚才测试证书没有申请成功的话到这里是无法正常启动容器的,因为nginx会报错找不到证书。
然后改一下 docker-compose.yaml,让其正常启动nginx和cron( 也就是删掉最后一行,也就是command: [“tail”, “-f”, “/dev/null”] )
1 | services: |
启动docker compose服务
docker compose up -d
进入容器申请证书
docker exec -it [nginx-acme容器id] /bin/bash
申请普通证书命令:
/root/.acme.sh/acme.sh --issue -d "域名" --dns dns_cf --key-file /file/ssl/key.pem --fullchain-file /file/ssl/cert.pem --reloadcmd "nginx -s reload"
成功申请后即可exit退出,证书到期时cron会自动运行acme.sh实现续签,并执行nginx -s reload 重载nginx配置文件更新证书。
最终文件目录
.
|-- docker-compose.yaml
|-- account.conf
|-- nginx.conf
`-- ssl
|-- *.domain_ecc
| |-- *.domain.cer
| |-- *.domain.conf
| |-- *.domain.csr
| |-- *.domain.csr.conf
| |-- *.domain.key
| |-- backup
| |-- ca.cer
| `-- fullchain.cer
|-- cert.pem
`-- key.pem
不需要担心容器被还原后自动续期失效,因为已经把acme.sh的配置文件account.conf映射到容器内,而且证书安装路径、nginx重载指令等配置都保存在./ssl/domain/domain.conf文件下。









