环境准备
准备运行程序目录
在决定运行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