1、拉去镜像

1
docker pull certbot/certbot

2、创建docker-compose.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '1.0'

services:
certbot:
image: certbot/certbot # 镜像
container_name: certbot # 容器名称
volumes:
- /data/docker/nginx/certs:/etc/letsencrypt #映射nginx的证书目录
- /data/docker/nginx/html:/var/www/html #映射nginx的html目录
networks:
- certbot_network
restart: always

networks:
certbot_network:
driver: bridge

3、创建nginx配置

1
2
3
4
5
6
7
8
9
10
# server模块
server {
listen 80; # 端口
server_name xxx.com; # 域名

location ^~ /.well-known/acme-challenge/ {
root /usr/share/nginx/html; #域名验证目录
default_type text/plain;
}
}

4、启动容器

1
docker-compose up -d

6、测试域名是否发放成功

certonly:只获取证书,不配置web服务器
–webroot:使用webroot验证方式
–dry-run:测试模式,不实际申请证书
-d:指定要申请证书的域名(可以多个,最多100个)
–non-interactive:非交互模式运行
–agree-tos:同意服务条款
–email:提供联系邮箱

1
2
3
4
docker run --rm \
-v /data/docker/nginx/certs:/etc/letsencrypt \
-v /data/docker/nginx/html:/var/www/html \
certbot/certbot certonly --webroot -w /var/www/html --dry-run -d web.moonhalo.fun -d img.moonhalo.fun --non-interactive --agree-tos --email xx@qq.com

如果输出 The dry run was successful.,说明测试成功。

7、正式获取证书

去掉 --dry-run 运行

1
2
3
4
docker run --rm \
-v /data/docker/nginx/certs:/etc/letsencrypt \
-v /data/docker/nginx/html:/var/www/html \
certbot/certbot certonly --webroot -w /var/www/html -d web.moonhalo.fun -d img.moonhalo.fun --non-interactive --agree-tos --email xx@qq.com

8、生成结果文件

Certbot 会在 ./certs/live/xxx.com/ 目录下生成证书文件,包括:
fullchain.pem:完整的证书链
privkey.pem:私钥

9、修改nginx配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
# 监听 443 https 端口 , 启用 HTTP/2 协议
listen 443 ssl http2;
# 域名,修改成你自己的
server_name xxx.com;
client_max_body_size 100M;

# ssl 证书
ssl_certificate /etc/nginx/certs/live/web.moonhalo.fun/fullchain.pem; # 完整的证书链
ssl_certificate_key /etc/nginx/certs/live/web.moonhalo.fun/privkey.pem; # 私钥
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;

# 代理请求
location / {
# 你的配置
}
}

10、重启nginx

1
docker restart nginx

11、配置定时任务

配置定时任务,在每月1号和15号执行一次,检查检查和更新域名证书

1
2
3
4
5
# 进入定时任务配置
sudo crontab -e

# 添加定时任务(第一个路径是docker-compose.yml文件路径,可在dockers compose后面加 -f xxx.yml指定文件)
0 0 1,15 * * cd /root/docker/nginx && /usr/bin/docker compose run --rm certbot renew && /usr/bin/docker compose restart nginx

12、更换域名

重新运行第七步,修改nginx配置为对应证书,重启nginx即可