docker-machine + docker-compose + ssl(让我们通过 nginx 和 certbot 加密)

Daw*_*zuk 5 ssl nginx docker-compose docker-machine lets-encrypt

我正在尝试将自动 TLS/SSL 终止添加到通过docker-machine部署的docker-compose 中的 Nginx (DigitalOcean)。

我找到了一些不错的资源 [ 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 构建中。没运气。

有很多修改,但我的设置类似于:

docker-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;'"
Run Code Online (Sandbox Code Playgroud)

nginx/Dockerfile

FROM nginx:1.15.9-alpine

RUN rm /etc/nginx/conf.d/default.conf
COPY prod.conf /etc/nginx/conf.d/
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

Car*_*ero 1

我需要有关您收到的错误的更多详细信息,但基本上您的配置中的一切都或多或少没问题。我发现卷部分可能存在错误。但要一步一步来,因为你问了几个有趣的问题:

  1. 您可以在本地测试所有内容,但恐怕(或者我找不到方法)您无法使用“让我们自动加密”来完成此操作,因为 certbot 在互联网中找到了合适的可用域(因此本地无法访问)。我所做的是生成证书(我已经验证了证书),然后使用指向您使用有效证书选择的 localhost(或 Windows 中的 Docker 工具箱 IP)的域来修改计算机上的主机。这是一种解决方法,但它可以工作。

  2. 在 Medium 示例中,为两个容器volumes创建:host volumes

     volumes:
        - ./data/certbot/conf:/etc/letsencrypt
        - ./data/certbot/www:/var/www/certbot
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着证书必须放置在docker 主机的文件夹中,并且它们映射到./data/certbot/conf容器中的文件夹。您正在使用匿名卷(我过去使用它们时遇到过问题)。检查此stackoverflow 问题以获取有关卷类型的进一步说明。/path/to/host/etc/letsencrypt

最后,如果您更喜欢另一种更动态的解决方案(自动包含在内),https您可以查看有关如何使用 nginx 作为反向代理的 stackoverflow 答案,以简化部署。还有一个可用的docker compose ELK 部署示例