我正在使用 Docker 构建一个 nginx 环境。我想知道是否可以在构建期间公开发布端口(80、443),以便 letencrypt 可以在构建时运行(它需要对(中间)容器中的服务器进行网络访问)。
这可能吗?
最佳答案
我从未见过,我认为这是不可能的设计。
通常,这是使用配套的 Letencrypt docker 镜像完成的,有时称为 sidekick。您基本上拥有您的应用程序(及其容器)和一个letsencrypt 容器,公开一个卷,然后 nginx 使用
volume_from
挂载该卷。这个卷是 letencrypt 容器放置获取的证书。这发生在镜像启动期间,而不是镜像创建期间。您可以使用 docker-compose 文件来配置所需的任何内容。例如。你可以看看这里
a) https://github.com/rancher/community-catalog/blob/master/templates/letsencrypt/2/docker-compose.yml
b) 或 http://letsencrypt.readthedocs.io/en/latest/using.html#running-with-docker
a) 允许您使用 ENV 变量定义您将需要的域,这将非常适合 docker-compose 方式,而不提供任何文件,如主机上的配置(保持可移植性)。
您仍然可以将所有这些放在 nginx-server 上,但出于多种原因(例如需要配置 nginx ),这不是最佳实践。
如果你想坚持“构建时间”,另一种方法是使用 DNS 验证模式,所以不是在端口上使用连接回验证,而是使用 DNS 条目验证,一些链接
- https://github.com/lukas2511/letsencrypt.sh/wiki/Examples-for-DNS-01-hooks
- a) 容器执行此操作
对于这种情况,您可能希望选择 http://cloudflare.com - AFAIK 它是唯一一个可以免费访问无限域的 API 的 DNS 服务,其他任何东西要么花钱要么有限制。
关于Docker 在构建期间发布端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981826/