我正在尝试通过docker-machine(DigitalOcean)部署的docker-compose中的Nginx添加自动TLS / SSL终止。
[我发现了一些很好的资源[humankode/how-to-set-up...,medium/nginx-and-lets-encrypt...]关于如何通过docker-compose做到这一点,但他们都是从在服务器上的角度出发。我真的很想避免这种情况。我很想在笔记本电脑上本地完成此操作,将其捆绑在一起,然后发送出去。或者,甚至无需任何ssh即可远程执行。
几次尝试都失败了,但感觉好像已经接近了。主要障碍似乎在于文件/卷。遵循medium / nginx-and-lets-encrytp ...指南,我在保存OpenSSL privkey.pem时遇到问题。据我所知,另一个教程(humankode)在服务器上完成所有操作,而这就是卷所在的位置。
我最近的尝试是通过DigitalOcean tutorial在计算机上设置证书,并尝试将这些证书包含在我的docker-compose构建中。没运气。
进行了很多修改,但我的设置类似于:
version: '3.7'
services:
nginx:
image: nginx:1.15.9-alpine
container_name: nginx
build:
context: ./nginx
dockerfile: Dockerfile
restart: always
volumes:
- /etc/letsencrypt
- /var/www/certbot
ports:
- "80:80"
- "443:443"
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
image: certbot/certbot
restart: unless-stopped
volumes:
- "/etc/letsencrypt"
- "/var/www/certbot"
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
FROM nginx:1.15.9-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY prod.conf /etc/nginx/conf.d/
# PRODUCTION
server {
listen 80;
listen [::]:80;
server_name example.site;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.site;
ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
我将需要更多有关收到的错误的详细信息,但是基本上在您的配置中,一切都差不多。我在卷部分中看到了可能的错误。但是请分步进行,因为您要问几个有趣的问题:
您可以在本地测试所有内容,但我担心(或者我找不到方法)您无法使用“让我们自动加密”来完成它,因为certbot在Internet上找到了合适的可用域(因此本地无法访问)。我要做的是生成证书(我已经验证了证书),然后使用指向您使用有效证书选择的本地主机(如果是Windows,则为Docker工具箱IP)来修改计算机上的主机。这是一种解决方法,但可以使用。
在中等示例中,两个容器的volumes
创建为host volumes
:
卷:-./data/certbot/conf:/etc/letsencrypt-./data/certbot/www:/var/www/certbot这意味着证书必须放置在Docker主机的文件夹./data/certbot/conf
或/path/to/host
中,并且它们映射到容器中的/etc/letsencrypt
文件夹中。您正在使用匿名卷(过去使用匿名卷时遇到了问题)。检查此stackoverflow question以获取有关卷类型的进一步说明。
最后,如果您喜欢另一个自动包含https
的动态解决方案,则可以选中an stackoverflow answer on how to use nginx as reverse proxy以简化部署。也有docker compose ELK deployment example