如何使用 Docker 和 Nginx 图像实现 (Certbot) ssl

How to implement (Certbot) ssl using Docker with Nginx image

我正在尝试使用 Docker 和 nginx 图像在我的应用程序中实现 ssl。我有两个应用程序,一个用于后端 (api),另一个用于前端 (admin)。它在端口 80 上使用 http,但我需要使用 https。这是我的 nginx 配置文件...

upstream ulib-api {
  server 10.0.2.229:8001;
}

server {
  listen 80;
  server_name api.ulib.com.br;

  location / {
      proxy_pass http://ulib-api;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  client_max_body_size 100M;
}

upstream ulib-admin {
  server 10.0.2.229:8002;
}

server {
  listen 80;
  server_name admin.ulib.com.br;

  location / {
      proxy_pass http://ulib-admin;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Server $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  client_max_body_size 100M;
}

我得到了一些教程,但都是使用 docker-compose。我需要用 Docker 文件安装它。谁能给我一盏灯?

...我在 AWS 上使用 ECS 实例,项目正在使用 CI/CD

构建

这只是其中一种可能的方式:

首先使用 certbot 颁发证书。您最终会得到几个 *.pem 文件。 有很多关于在不同系统上安装和 运行ning certbot 的教程,我使用 Ubuntu 和命令 certbot --nginx certonly。您需要 运行 在您的域 上执行此命令 因为 certbot 将通过一系列挑战来检查您是否是该域的所有者。

其次,您创建 nginx 个容器。此容器需要适当的 nginx.conf 和 link 证书。我使用 docker 卷,但这不是唯一的方法。

我的 nginx.conf 如下所示:

http {
    server {
        listen 443 ssl;

        ssl_certificate /cert/<yourdomain.com>/fullchain.pem;
        ssl_certificate_key /cert/<yourdomain.com>/privkey.pem;
        ssl_trusted_certificate /cert/<yourdomain.com>/chain.pem;
        ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
        ...
    }
}

最后,您 运行 nginx 连接了正确的卷:

docker run -d -v $PWD/nginx.conf:/etc/nginx/nginx.conf:ro -v $PWD/cert:/cert:ro -p 443:443 nginx:1.15-alpine 

通知:

  • 我将 $PWD/cert 映射到容器中作为 /cert。这是一个文件夹,其中存储了 *.pem 个文件。他们住在 ./cert/example.com/*.pem

  • nginx.conf 中,您使用 ssl_... 指令引用这些证书

  • 您应该公开端口 443 以便能够连接