はじめに
こんにちは。最近dockerを触ってばかりいます。以前、ローカルでオレオレ証明書をサクッと発行する方法をご紹介しましたが、その記事の最後にご紹介した
https-portal
を使い、今回はdocker-composeのみでhttps化をしてみようと思います。
環境はmacOS High Sierra 10.13.6, Docker Desktop 2.0.0.3です。
https-portalとは
dockerで構築したサーバを自動でhttps化してくれるコンテナで、nginxとlet’s encryptを内包しています。DNS登録されているドメインなら実際に証明書を取得し、ローカルの場合はオレオレ証明書に切り替えてくれます(ブラウザの警告は出てしまいますが)。
チュートリアルにはwordpressコンテナとの接続方法が記載されていますが、今回は一度構築したnginx+php-fpmをhttps化します。
設定ファイル
前回の記事で作成した
docker-compose.yml
がベースになっています。
docker-compose.yml
最終的にこうなります。
php-fpm
,
db
,
mailhog
は一切変更が無いので、ここでは触れません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | version: "3" services: https-portal: image: steveltn/https-portal:1 ports: - 80:80 - 443:443 restart: always environment: DOMAINS: 'laravel.local -> http://web:8000' STAGE: local volumes: - ./org-chimata-ssl-certs:/var/lib/https-portal web: image: nginx:latest ports: - 8000:8000 volumes: - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html depends_on: - php-fpm php-fpm: build: ./docker/php volumes: - .:/var/www/html depends_on: - db - mailhog db: image: mariadb:latest ports: - 3306:3306 environment: MYSQL_ROOT_PASSWORD: root MYSQL_USER: test MYSQL_PASSWORD: test MYSQL_DATABASE: testdb volumes: - ./db-data:/var/lib/mysql mailhog: image: mailhog/mailhog ports: - "8025:8025" - "1025:1025" |
default.conf
nginxの設定ファイルです。こちらも最終的な内容になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | server { listen 8000; server_name laravel.local root /var/www/html; index index.php index.html index.htm; access_log /var/log/nginx/ssl-access.log; error_log /var/log/nginx/ssl-error.log; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { root /var/www/html/testapp/public; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass php-fpm:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; } } |
php-fpm
の
Dockerfile
は前回から変更ありませんので省略しています。
説明
docker-compose.yml
https-portalの記述部分を抜粋しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | https-portal: image: steveltn/https-portal:1 ports: - 80:80 - 443:443 restart: always environment: DOMAINS: 'laravel.local -> http://web:8000' STAGE: local volumes: - ./org-chimata-ssl-certs:/var/lib/https-portal web: image: nginx:latest ports: - 8000:8000 |
- image:
現在公開されているのが1系なので、その最新版が入るようにします。 - ports:
httpの80番およびhttpsの443番はhttps-portalのコンテナに含まれるnginxがプロキシとなって受けて、php-fpmと連携しているnginxに転送します。 - DOMAINS:
どのドメインでアクセスされたら、どのdockerコンテナに転送するかを記述します。左側がドメイン、右側がコンテナ名(この場合はweb)で、80番ポートはhttps-portalで使用しているので任意の別ポートを指定します。 - STAGE:
local/staging/production
の3種類を指定できます。
意味はそれぞれ見ての通りで、staging/production
はオンラインのサーバですから実際にlet’s encryptが証明書を発行します。ドメインがDNSに登録されている必要があります。
local
のみオレオレ証明書になるため、ブラウザの警告が出ます。 - volumes:
コンテナ内の/var/lib/https-portal
に設置される証明書をマウントしています。ホスト側にマウントしないと証明書ファイルが永続化できず、コンテナ起動の度に証明書を発行することになってしまいます。
ローカルのオレオレ証明書なら問題ありませんが、ステージングや本番で実際に証明書を発行する場合、毎回証明書を発行していると回数制限に引っかかってしまいますので、きちんと永続化しましょう。 - ports(web):
https-portalで転送設定したポートで待ち受けるようにします。この場合は8000番ですね。何番でも構いませんが、他のサービスと被らないようにしてください。
default.conf
こちらもhttps-portalに対応して、下記の一箇所だけ書き換えています。
docker-compose.ymlで指定したポート番号をlistenするようにします。
1 2 3 4 | server { listen 8000; ... ... |
ビルドして実行
ここまで設定したら、あとは
docker-compose build && docker-compose up -d
を実行するのみです。
接続確認
ローカル環境の場合は
docker-compose.yml
の
https-portal.DOMAINS
、および
default.conf
の
server_name
に記述したドメインを
/etc/hosts
に忘れず追記しましょう。
さいごに
let’s encryptそのものだけでも便利な代物ですが、dockerコンテナとして動いてくれると一層便利ですね。コンテナ内で定期的に証明書の再取得までしてくれるので、cron設定すら不要になります。