web-dev-qa-db-ja.com

docker-machine + docker-compose + ssl(nginxとcertbotで暗号化します)

docker-machine(DigitalOcean)を介してデプロイされたdocker-composeでNginxに自動TLS/SSL終了を追加しようとしています。

私はいくつかの素敵なリソースを見つけました[ hum​​ankode/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;'"

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;
4
Dawid Laszuk

あなたが受け取っているエラーの詳細が必要ですが、基本的にはすべての設定で大体問題ありません。ボリューム部分にエラーの可能性があります。しかし、あなたがいくつかの興味深い質問をしているので、一歩一歩。

  1. ローカルですべてをテストできますが、certbotがインターネットで適切な利用可能なドメインを見つけるため(ローカルではアクセスできないため)、Let'sで自動的に暗号化することはできません(または方法を見つけることができませんでした)と思います。私がやったことは、証明書を生成し(私は証明書を検証しました)、有効な証明書で選択しているlocalhost(またはWindowsの場合はDockerツールボックスIP)を指すドメインでマシンのホストを変更することです。回避策ですが、機能します。

  2. 中規模の例では、volumesは両方のコンテナに対してHost volumesとして作成されます。

     volumes:
        - ./data/certbot/conf:/etc/letsencrypt
        - ./data/certbot/www:/var/www/certbot
    

    つまり、証明書はdocker Hostマシンの./data/certbot/confまたは/path/to/Hostフォルダーに配置する必要があり、それらはコンテナーの/etc/letsencryptフォルダーにマップされます。匿名ボリュームを使用しています(以前に使用したときに問題が発生しました)。ボリュームのタイプに関する詳細な説明については、この stackoverflowの質問 を確認してください。

最後に、自動的にhttpsを含む別のより動的なソリューションが必要な場合は、展開を容易にするために、 nginxをリバースプロキシとして使用する方法に関するスタックオーバーフローの回答 を確認できます。 docker compose ELKデプロイメントの例 も利用できます

1
Carlos Cavero