Docker 使用 nginx-proxy + letsencrypt 实现自动签发 SSL 证书

Linux Docker
文章目录

1. 创建一个自定义网络 nginx-net

1
2
$ docker network create nginx-net
86acd4edf102a2a5f9aaa6ff2638e5372eeffd9dd39070ee97ee1ac252a29492

查看创建网络结果

2. 部署 nginx-proxy

1
2
3
4
5
$ docker run --name nginx-proxy -p "80:80" -p "443:443" \
-v "/etc/nginx/vhost.d" -v "/usr/share/nginx/html" \
-v "/etc/nginx/certs:/etc/nginx/certs:ro" \
-v "/var/run/docker.sock:/tmp/docker.sock:ro" \
--net "nginx-net" -d jwilder/nginx-proxy

上述命令创建了一个连接到上面我们创建的自定义网络 nginx-net 且开放了 80443 端口的 nginx-proxy 容器,该容器使用 /var/run/docker.sock 来检测及发现外部容器的状态以便及时修改自己的配置

3. 部署 Letsencrypt-nginx-proxy-companion

1
2
3
4
5
$ docker run --name "letsencrypt-nginx-proxy" \
--volumes-from "nginx-proxy" \
-v "/etc/nginx/certs:/etc/nginx/certs" \
-v "/var/run/docker.sock:/var/run/docker.sock:ro" \
--net "nginx-net" -d jrcs/letsencrypt-nginx-proxy-companion

上述命令创建了一个连接到自定义网络 nginx-net 的容器,该容器挂载了 /etc/nginx/certs 用来存入生成的证书文件并方便 nginx-proxy 容器读取(此数据卷两容器之间共享),挂载 /var/run/docker.sock 功能同上面 nginx-proxy 容器的功能

4. 部署 WebApp

从这里开始我们就要部署自己的 Web 应用了,在部署的时候需要注意几个环境变量:

  • VIRTUAL_HOST 需要反向代理的域名
  • LETSENCRYPT_HOST 需要使用 LetsEncrypt 签发证书的域名
  • LETSENCRYPT_EMAIL 使用 LetsEncrypt 签发证书时使用的邮箱
1
2
3
4
$ docker run --name blog -d -e VIRTUAL_HOST=blog.example.com \
-e LETSENCRYPT_HOST=blog.exaple.com \
-e LETSENCRYPT_MAIL=example@mmail.com \
--expose 2368 gold/ghost

另外在创建 Web 应用容器时一般需要向外部暴露自己的 Web 服务监听端口

至此,一个自动生成 https 证书的服务就搭建完成了

PS:若所有容器都连接到同一网络环境下,一般是不需要去暴露端口的,可以通过 容器别名:服务端口 的方式去访问各个容器的服务