![Docker 主机目录结构](https://linux22.com/image/1570378/Docker%20%E4%B8%BB%E6%9C%BA%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84.png)
官方certbot
(https://certbot.eff.org) 工具用于颁发和更新证书,将Let's Encrypt
当前有效的证书保存到${prefix}/archive/${domain}/certN.pem
,其中N
是任意数字。应用于访问当前有效证书和密钥的路径是中的相对符号链接${prefix}/live/${domain}/cert.pem
:
root@skprov2:${prefix}/live/${domain}# ls
total 12K
4.0K drwxr-xr-x 2 root root 4.0K Jul 24 16:08 ./
4.0K drwx------ 9 root root 4.0K Aug 24 10:57 ../
0 lrwxrwxrwx 1 root root 39 Jul 24 16:08 cert.pem -> ../../archive/${domain}/cert2.pem
0 lrwxrwxrwx 1 root root 40 Jul 24 16:08 chain.pem -> ../../archive/${domain}/chain2.pem
0 lrwxrwxrwx 1 root root 44 Jul 24 16:08 fullchain.pem -> ../../archive/${domain}/fullchain2.pem
0 lrwxrwxrwx 1 root root 42 Jul 24 16:08 privkey.pem -> ../../archive/${domain}/privkey2.pem
4.0K -rw-r--r-- 1 root root 682 Jul 23 09:40 README
仅挂载live
目录时,由于相对符号链接,docker 容器内运行的程序将无法加载所需的证书数据。
如何certbot
在 Docker 容器中使用最新(有效)的证书数据?
答案1
相对符号链接被映射到上层 2 层(从domain
文件夹到live
文件夹,从live
文件夹到root
文件夹),然后进入archive
文件夹,最后进入其中domain
的子文件夹。
为避免安装全部域子目录,可以访问所有证书数据,我们必须使用 2 个挂载。
Docker 主机目录结构
我们假设 certbot 在 Docker 主机上创建以下目录结构:
/certbot/
|-live/
| |-domain.com
| | |-cert.pem
| | |-privkey.pem
| |-domain2.com
| |-cert.pem
| |-privkey.pem
|
|-archive/
|-domain.com
| |-cert.pem
| |-privkey.pem
|-domain2.com
|-cert.pem
|-privkey.pem
挂载子目录
在Docker中,我们只希望将目标域的子目录挂载到容器内。
docker run \
-v /certbot/live/domain.com:/cert/live/domain.com:ro \
-v /certbot/archive/domain.com:/cert/archive/domain.com:ro \
myimage:tag
这样,容器内的程序可以成功解析archive
文件夹的相对路径,同时其配置指向live
文件夹内的符号链接(/cert/live/domain.com/cert.pem
)。