Docker通过Nginx,ACME快速部署证书

4,087 阅读2分钟

环境准备

准备运行程序目录

在决定运行docker-compose的任意路径创建好目录,以后我们程序运行相关的文件都保存在该路径下,如/nginx-acme。

下面以在 /opt 目录创建程序运行目录:

# 进入 opt 目录
cd /opt
# 创建根目录
mkdir nginx-acme
# 进入根目录,分别创建 nginx、acme 目录
cd nginx-acme
# 创建子目录
mkdir nginx
mkdir acme

nginx default.conf

# 进入 nginx 目录
cd /opt/nginx-acme/nginx
# 创建配置文件目录
mkdir conf.d
# 创建配置基础配置文件
vi default.conf

default.conf

server {
    listen 443 ssl;
    server_name             xxx.example.com;
    ssl_certificate         /etc/nginx/certs/${server_name}/fullchain.cer;
    ssl_certificate_key     /etc/nginx/certs/${server_name}/${server_name}.key;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

部署 acme.sh

创建docker-compose.yml

/opt/nginx-acme/acme 程序运行路径下创建docker-compose.yml,通过docker-compose启动docker镜像的所有参数信息都会写入到该文件中

/acme.sh 映射到 /nginx/certs/ 这样 nginx 可以直接使用证书!

version: "3"
services:
  acme.sh:
    image: neilpang/acme.sh
    container_name: acme.sh
    restart: always
    command: daemon
    environment:
      - CF_Key="xxx"
      - CF_Email="xxx@xx.com"
    volumes:
      - ../nginx/certs/:/acme.sh
    network_mode: host

保存后在 docker-compose.yml 同目录下运行如下命令启动。如果更改了 docker-compose.yml 文件,只要在此运行如下命令,就能够更新到最新状态。

docker-compose up -d

申请证书

运行acme生成证书

docker exec acme.sh --register-account -m xxx@xx.com --issue --dns dns_cf -d xxx.example.com -d *.example.com --force --dnssleep

域名和dns服务商参数根据实际情况自行修改。要使用cloudflare创建证书,需要把域名的ns指向到cloudflare并在cloudflare网站上申请管理员的key。运行完成后证书会保存在./ssl/xxx.example.com/文件夹下。查看是否有如下文件即可:

ca.cer  fullchain.cer  example.com.cer  example.com.conf  example.com.csr  example.com.csr.conf  example.com.key

自动更新证书

运行 crontab -e 来编辑 crontab 文件,添加如下内容,保存即可。

# 可以运行 crontab -e 来查看已经添加的 crontab 任务
0 0 * * * docker exec acme.sh --cron

部署 nginx

创建docker-compose.yml

网络模式选择 host,宿主机需要开放 443 TCP 端口;

./certs 最好也不要改动,acme.sh 生成的证书映射在该目录下;

./conf.d 目录提前创建好并放入配置文件,不知道创建什么仔细阅读 准备运行程序目录 章节;

version: '3'
services:
  nginx:
    image: nginx
    restart: always
    network_mode: host
    volumes:
      - ./certs:/etc/nginx/certs
      - ./conf.d:/etc/nginx/conf.d
      - ./log:/var/log/nginx
      - ./www:/var/www

启动nginx

docker-compose up -d

宿主机开放端口

# 开放端口
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload

# 查看端口
firewall-cmd --zone=public --list-ports

测试一下

访问: xxx.example.com

image-20211223105219832