概念
什么是 Container ?
- https://www.docker.com/resources/what-container
- https://www.docker.com/why-docker
什么是 Let's Encrypt ?
Let's Encrypt is a free, automated, and open Certificate Authority.
安装
安装 Docker
https://docs.docker.com/install/linux/docker-ce/ubuntu/
获取 images
docker pull linuxserver/letsencrypt
主角
详细介绍及使用方法:
- https://hub.docker.com/r/linuxserver/letsencrypt/
- https://github.com/linuxserver/docker-letsencrypt
简要中文阐述
此镜像包含了 Nginx 服务器, 反向代理, PHP 和用于生成或续签证书的 letsencrypt client, 也包含了用于防御入侵的 fail2ban.
本文使用的是 http 的方式请求的证书, 故使用 tls-sni 或 dns 方式的读者, 请参考[详细介绍及使用方法] 链接里的原文
使用方法
在 <> 中加入合适的值即可.
- docker run \
- --cap-add=NET_ADMIN \
- --name=letsencrypt \
- -v <path to data>:/config \
- -e PGID=<gid> -e PUID=<uid> \
- -e EMAIL=<email> \
- -e URL=<url> \
- -e SUBDOMAINS=<subdomains> \
- -e VALIDATION=http \
- -p 80:80 -p 443:443 \
- -e TZ=Asia/Shanghai \
- linuxserver/letsencrypt
参数介绍
参考来自 https://github.com/linuxserver/docker-letsencrypt , 有修改.
-p 80 -p 443 - 端口号
-v /config - 所有的配置文件及网站根目录路径(笔者: 只需指定可读写路径即可, 容器生成时会在此路径生成一堆文件), 下文 < your-path > 指的就是这个.
-e URL - 顶级域名, 比如 test.com
-e SUBDOMAINS - 二级域名 比如 www,ftp,cloud 多个二级域名用 "," 隔开, http 方式不支持泛域名, 如想使用, 请使用 dns 方式, 本文不做介绍.
-e VALIDATION - letsencrypt 验证所使用的方法
-e PGID for GroupID - 详情见下面说明,
不可使用 root 的 GID
-e PUID for UserID - 详情见下面说明,
不可使用 root 的 UID
-e TZ - timezone ie. Asia/Shanghai
User / Group 标识
有时在使用数据卷 ( -v 标志) 时, 主机操作系统和容器之间可能会出现权限问题. 我们通过允许您指定用户 PUID 和组 PGID 来避免此问题. 确保主机上的数据卷目录由您指定的同一用户拥有并且它能 "正常工作".
在这种情况下, PUID=1001 并且 PGID=1001 . 要找到你的 id user , 请使用 id user , 如下所示:
id <dockeruser>
运行
敲入上面的命令 (docker run ....) 后, 首次使用需要生成 DH 参数, 需要耐心等待啦.
查看状态
docker logs -f letsencrypt
如果看到如下所示就大功告成啦.
- ......
- ......
- ......
- Server ready
那么, 申请的证书在哪?
在输出的状态中可知: 证书存在于 < your-path>/config/etc/letsencrypt/live/<domain> 中, 至于里面的证书都是用来干嘛的, 请参考该目录下的 README. 本文不做描述
反向代理
该镜像默认的设置已经对反向代理做了优化(感谢大佬), 最简单的方式就是找到 < your-path>/config/nginx/proxy-confs 下适合自己的配置文件, 去掉. sample 即可. 但是笔者发现, 好像这里面的配置不适合所有情况, 故还要自己写配置文件.......
注意: 反向代理分为两种方式, 第一种是通过同一域名不同路径作为反向代理, 第二种是不同域名指向不同虚拟主机作为反向代理. 本文使用的第二种, 详情可以看 < your-path>/config/nginx/proxy-confs/_readme
切换路径
cd <your-path>/config/nginx/site-confs
不要理会 default , 当然, 直接修改里面的文件也行, 笔者为了简洁, 直接新建文件
创建文件 <your-domain> 比如
touch test.com
修改文件
vi test.com
文件内容如下
- server {
- listen 443 ssl;
- server_name <your-domain>;
- charset utf-8;
- include /config/nginx/ssl.conf;
- client_max_body_size 0;
- location / {
- include /config/nginx/proxy.conf;
- proxy_pass <web-OR-ContainerName>;
- }
- }
注意 < your-domain > 中填写域名,
<Web-OR-ContainerName>
中要填写反向代理的网址或者是容器名称, 比如说
proxy_pass http://gogsWeb:3000/;
, 至于容器之间如何互联, 请看下节. 如果需要创建多个反向代理, 就如法炮制, 再创建文件, 再新建个虚拟主机, 以 server_name 区分即可.
容器互联
参考 https://docs.docker.com/engine/reference/commandline/network/
- docker network create cert_network
- docker network connect cert_network <other-container>
- docker network connect cert_network letsencrypt
注意, 需要互联的容器建立时不需要指定'-P'即端口与主机端口绑定!!! 只需要确保容器内端口开放即可.
是时候结束一切了
docker restart letsencrypt
来源: https://www.cnblogs.com/chasingdreams2017/p/9534469.html