使用 certbot 配置 docker nginx https

环境:Docker-1.13.1 ,nginx-1.15.12,certbot

由于现在没有https会被标识不安全网站,我就打算配置一下,去申请免费的Let's Encrypt证书,毕竟也不是很麻烦,但万万没想到给 docker nginx 容器中配置 ssl 证书竟然暗藏玄机。由于我是白手起家,docker文档从未看过,在此处被坑了一波,以后有机会还是有必要慢慢的看一下官方文档。

先说明一下我的情况,利用cartbot申请了免费的域名ssl证书之后,得到的

fullchain.pem,privkey.pem文件是个软链接文件。

再用docker volumes 把ssl配置文件夹挂载到 nginx 容器内部,顺便配置nginx.conf(注意nginx容器的nginx.conf配置文件有点差异 nginx.conf会引入/etc/nginx/conf.d/下的*.conf文件,这个小细节需要注意,还有别忘记映射容器443端口)

这里就有个坑了。由于证书文件是个软链接文件,挂载进入容器之后是无法使用的。

nginx就会报错,错误信息为 无法找到该证书文件。但你进入容器又会发现证书文件确实在容器中,但是!此证书文件是无法读取的,跟权限无关,完全是因为docker volumes 本身只能映射硬链接信息。而软链接是无法映射的,留在容器中的只是一个软链接的空壳。

其实也不难理解 因为软链接只是一个快捷方式,如果volumes 中有宿主机的快捷方式还可以访问宿主机硬链接那才有问题了。因为软链接可以在/home卷下,而软链接对应的硬链接文件其实在/usr卷下。但我配置的volumes 只映射了/home卷 是不能去访问/usr卷的数据的,这里必须要准确映射到对应的软文件,不能是软文件的目录。也不能是直接挂载软文件。

挂载路径指向完整的证书软文件路径,才可以生效 。docker中的nginx启动时才能根据软文件对应的文件地址获取到证书文件。