ssl - docker-machine + docker-compose + ssl(让我们通过 nginx 和 certbot 加密)
问题描述
我正在尝试将自动 TLS/SSL 终止添加到通过docker-machine (DigitalOcean)部署的docker-compose中的 Nginx。
我找到了一些很好的资源 [ humankode/how-to-set-up... , medium/nginx-and-lets-encrypt... ] 关于如何通过 docker-compose 进行操作,但他们都是从在服务器上的观点。我真的很想避免这种情况。我很想在本地进行,在我的笔记本电脑上,将它们捆绑在一起,然后发送出去。或者,甚至在不执行任何 ssh 的情况下远程执行。
几次尝试都失败了,但感觉他们已经很接近了。主要障碍似乎是文件/卷。按照medium/nginx-and-lets-encrytp...指南,我在保存 OpenSSL privkey.pem 时遇到问题。据我所知,另一个教程(humankode)在服务器上完成所有操作,这就是卷所在的位置。
我最近的尝试是通过DigitalOcean 教程在机器上设置证书,并尝试将这些证书包含在我的 docker-compose 构建中。没运气。
有很多修改,但我的设置类似于:
码头工人-compose.yml
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;'"
nginx/Dockerfile
FROM nginx:1.15.9-alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY prod.conf /etc/nginx/conf.d/
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;
解决方案
我需要有关您收到的错误的更多详细信息,但基本上您的配置中的一切都或多或少没问题。我在卷部分看到可能的错误。但是一步一步,因为你问了几个有趣的问题:
您可以在本地测试所有内容,但我担心(或者我找不到方法)您无法使用 Let's encrypt 自动执行此操作,因为 certbot 在 Internet 中找到了合适的可用域(因此本地无法访问)。我所做的是生成证书(我已经验证了证书),然后使用指向 localhost(或 Windows 的 Docker 工具箱 IP)的域修改您机器上的主机,并使用有效证书进行选择。这是一种解决方法,但它可以工作。
在 Medium 示例中,为两个容器
volumes
创建:host volumes
volumes: - ./data/certbot/conf:/etc/letsencrypt - ./data/certbot/www:/var/www/certbot
这意味着证书必须放在文件夹
./data/certbot/conf
或/path/to/host
docker 主机的文件/etc/letsencrypt
夹中,并且它们被映射到容器中的文件夹。您正在使用匿名卷(过去我在使用它们时遇到过问题)。检查此stackoverflow 问题以获取有关卷类型的进一步说明。
最后,如果您更喜欢另一个自动包含的更动态的解决方案,https
您可以查看有关如何使用 nginx 作为反向代理的 stackoverflow 答案,以简化您的部署。还有一个docker compose ELK 部署示例
推荐阅读
- php - Laravel 忽略特定路线。改为打开另一个代码库
- java - 具有不同日期的 Spring Boot 应用程序
- three.js - 带有 alphaMap 的 SpriteMaterial
- sparql - RDF4j ParsedQuery 或 TupleExpr 到字符串表示
- python - Python 3.7 - Moviepy 将音频修剪为视频的长度
- android - 在空对象引用上调用的虚拟方法 kotlin
- javascript - d3.js 对象没有完全显示卡片
- android - Flutter - Appbundle - Android 应用程序在启动时冻结
- flutter - 在文本前面放置图标
- node.js - Type-GraphQL 的参数错误 - 没有参数类型?