「モーゼは何故、50年もの間砂漠を彷徨ってたんだ?」
「道を訊かなかったからさ。」
というジョークもありますが、いままでdockerでhttps通信するために、公式ドキュメントに目を通すまでの間インターネットの巨大迷路を彷徨っていました。(挨拶
朗報です。docker-composeでLet’s EncryptによるdockerコンテナのSSL対応(HTTPS化)が難しいこと言わず無料でhttps-portalを使って可能とのことで、早速めも。
steveltn/https-portal Docker Image | Docker Hub
以下、公式ドキュメントから引用。
Quick Start
https-portal: image: steveltn/https-portal:1 ports: - '80:80' - '443:443' links: - wordpress restart: always environment: DOMAINS: 'wordpress.example.com -> http://wordpress:80' # STAGE: 'production' # Don't use production until staging works # FORCE_RENEW: 'true'
上記の例はDOMAINS:環境設定で、ホストOSへの通信をwordpressのコンテナポート80番で待つローカルアドレスに転送しています。
MediaWikiでもdockerコンテナを使ってdocker-compose仕様にすることで、SSL対応を可能としています。
MediaWikiの環境をdocker-composeで簡易的に構築する
DBコンテナはMySQL:8としていますが、お好みでMariaDBでも良いと思います。
今回はdocker-compose仕様なのでup downを繰り返すたびコンテナID,IPアドレスが変わってしまいます。なので、MediaWikiのデータベースホストにIPではなくホスト名で指定するためにhostnameで明示的に命名しています。
またMediaWiki最新バージョン1.37.1でのPHPエラーを抑えるため、今回は1.35を選択。ports:でコンテナポート80をホスト8080番ポートに繋いでいます。
docker-compose.yml
version: '3.8' services: mysql0002: image: mysql:8 container_name: mysql0002 hostname: mysql0002 volumes: - /root/mysql/mysql:/var/lib/mysql ports: - 3306:3306 restart: always networks: - mw000net2 environment: MYSQL_DATABASE: testdb MYSQL_USER: mysqluser MYSQL_PASSWORD: mysqluserpass MYSQL_ROOT_PASSWORD: mysqlPassword command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password mediawiki: image: mediawiki:1.35 container_name: mediawiki hostname: www.stuffy.site # ←あなたの取得済みのドメインのFQDN restart: always depends_on: - mysql0002 ports: - 8080:80 volumes: - ./images:/var/www/html/images # - ./LocalSettings.php:/var/www/html/LocalSettings.php networks: - mw000net2 links: - mysql0002:mysql https-portal: image: steveltn/https-portal:1 ports: - '80:80' - '443:443' links: - mysql0002:mysql - mediawiki networks: - mw000net2 restart: always volumes: - ./certs:/var/lib/https-portal environment: DOMAINS: 'www.stuffy.site -> http://mediawiki:80' # ←あなたの取得済みのドメインのFQDN CLIENT_MAX_BODY_SIZE: 16M STAGE: 'staging' # productionはstagingが成功してから行うこと #FORCE_RENEW: 'true' networks: mw000net2:
MediaWikiインストールの最後にホストにダウンロードしたLocalSettings.phpをコンテナのルートディレクトリに設置後、いったん、docker-compose downしてから下記ボリュームを有効にするのがポイントでした。
# docker cp ./LocalSettings.php mysql0002:/var/www/html
# docker-compose down
- ./LocalSettings.php:/var/www/html/LocalSettings.php
https-portal のSTAGE設定は、staging(オレオレ証明書)の発行に成功してから本番のproductionを行うと良いです。
docker-compose up -d してhttps-portalコンテナが正常起動して証明書の取得に成功すると
HTTPS化・・・完了です。
追記) 証明書取得には十数分掛かるのが通常ですが、何らかの理由でdocker-compose up -d が失敗してLet’s Encryptの証明書発行を繰り返しているとレート制限に引掛かり、#STAGE: ‘production’ のコメントを外しても古い証明書の更新ができないときがありますが、そんな時はおとなしく1週間待つしかないようです。
うまく行かないときは docker-compose logs でエラーログを拾って地道なバグ対応して、どうぞ
https-portal productionで証明書が取得できない時 (Response Code: 403) – Qiita