こんばんは。最近ブログばっかり書いて気がしますが、結構書いてみたい記事が溜まっているだけで、暇ではないよ、、きっと。。。ということはさておき、Wordpress を使っている方もそうじゃないかたもDocker を使ってwordpress の本番環境をホストしてみたいであったり、アプリケーションをDocker を使ってホストしてみたいみたいなことがあるかと思います。
そういったときは恐らくECS だとかEC2 の中にDocker をインストールして使う使い方があると思います。ただ、昨今ECS も少しお値段が高いので、EC2 の中で使ってみたいのような要望があるかもしれません。
そして、ALB とかあればいいですが、EC2 のみの場合は、サイトをSSL に対応する必要ありますね。そうしたら、きっとLet’s encrypt 使いたくなりますよね。ということで今回はDocker でも無料のSSL 証明書 の実装の仕方を紹介してみます!!(無理やり)
でも先に、docker-compose.yml などの設定を見る必要がありますね、というところでサラッと見てみます。
Docker compose yml を見てみよう
今回は自分のサイトでも使っているdocker compose yml を紹介しているのですが、yaml の中身はざっくりこんな感じです。
version: "3.7"
services:
mysql:
image: mysql
hostname: mysql8
container_name: wordpress_mysql
volumes:
- ./mysql_data:/var/lib/mysql
- ./mysql/etc/my.cnf:/etc/my.cnf
environment:
MYSQL_ROOT_PASSWORD: testteset
MYSQL_DATABASE: wp_test
MYSQL_USER: test
MYSQL_PASSWORD: testteset
ports:
- 3306:3306
wordpress:
container_name: kentaindeed_wp
hostname: wordpress
image: wordpress
volumes:
- ./public/wp/:/var/www/html
- ./public/log/:/var/log/apache2/
- ./apache2/etc/default/apache2.conf:/etc/apache2/apache2.conf
- ./letsencrypt/files:/etc/letsencrypt
- ./apache2/etc/conf.d/:/etc/apache2/sites-enabled/
links:
- mysql
depends_on:
- mysql
ports:
- "80:80"
environment:
- WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST}
- WORDPRESS_DB_NAME=${WORDPRESS_DB_NAME}
- WORDPRESS_DB_USER=${WORDPRESS_DB_USER}
- WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD}
certbot:
container_name: certbot
hostname: certbot
image: certbot/certbot:latest
volumes:
- ./letsencrypt/files:/etc/letsencrypt
- ./public/wp/:/var/www/html
- .letsencrypt/logs/:/var/log/letsencrypt
command: ["--version"]
一般的な構成ですね。wordpress の中に、apache とphp が入っていて、mysql のコンテナは別で存在している構成になっています。それと、certbot のcontainer も用意してあげます。
ここで重要なのは、wordpress のコンテナの記述の一部と、certbot コンテナです。なので、このyaml ファイルの中で言うと、この部分ですね。
wordpress:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
volumes:
- ./public/wp/:/var/www/html
- ./public/log/:/var/log/apache2/
- ./apache2/etc/default/apache2.conf:/etc/apache2/apache2.conf
- ./letsencrypt/files:/etc/letsencrypt
- ./apache2/etc/conf.d/:/etc/apache2/sites-enabled/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
certbot:
container_name: certbot
hostname: certbot
image: certbot/certbot:latest
volumes:
- ./letsencrypt/files:/etc/letsencrypt
- ./public/wp/:/var/www/html
- .letsencrypt/logs/:/var/log/letsencrypt
command: ["--version"]
特に大事なのが、Certbot とwordpress のvolume の部分です。certbot で証明書を発行した際に格納場所が必要になってきます。Docker ではない場合は、ホストのディレクトリなどは自動で作成してくれるので、特に気にしなくていいのですが、Docker はホスト側にbind mount する必要があるので、その設定をしてあげる必要があります。
# certbot 証明書mount
volumes:
- ./letsencrypt/files:/etc/letsencrypt
そして、それをwordpress 側のapache にも渡してあげる必要があるので、そのmount の記述も書く必要があります。それが、ここです。
volumes:
- ./public/wp/:/var/www/html
- ./public/log/:/var/log/apache2/
- ./apache2/etc/default/apache2.conf:/etc/apache2/apache2.conf
- ./letsencrypt/files:/etc/letsencrypt # ★ この部分
- ./apache2/etc/conf.d/:/etc/apache2/sites-enabled/
これを書くことでホスト側に配置されている証明書をwordpress コンテナにも配置することができます。これで443 にする準備もできました!!!最後にdocker compose コマンドでwordpress を起動してあげて、最後にcertbot で証明書発行をします。
# docker 起動
docker compose up -d
# certbot 証明書発行
docker compose run --rm certbot certonly --standalone
certbot の具体的な内容については以下のドキュメントを参照してみてください。
certbot でできないこと
Certbot を使ってできないことがあります。これ結構重要だったりするのかもしれませんが、Apache のplugin を使うことができません。Apache plugin を使うことで、A レコードの情報がなくても、Apache とLets が更新してくれるようなんですが、Docker のCertbot ではそれができないみたいなんです。。。
理由を知っている方がいましたら、ぜひ教えていただきたいです。。。
certbot でLet’s encrypt を更新してみよう
証明書が発行できるようになったら、次は更新が必要になりますね。このやり方はとても簡単です。cron で更新のコマンドを仕込んであげる形で対応できると思います。
具体的には以下のような感じですね。
30 3 * * * cd /path/to/your/compose-file/public_html && docker compose run --rm certbot renew
僕は夜中の3時に更新処理していますが、特に個人ブログとかであれば、特に気にしなくていいのかなと思います。やっていることは、とても簡単です。
# ここでdocker-compose.yml ファイルのある所まで移動
cd /path/to/your/compose-file/public_html
# Certbot で証明書更新コマンドを実行
docker compose run --rm certbot renew
certbot renew にdocker compose コマンドが付いた感じですね!これで、特にエラーが出てなければ大丈夫だと思います。cron で設定しているので、/var/log/cron にログが出力されていると思います。certbot renew のコマンドなどはここでは解説しないので、気になる方は調べてみてください。
まとめ
Docker を導入する時に、HTTPS化するのは少し悩みますが、案外簡単にできるので、恐れずSSL 化を進めていきましょう!!ということで今回のブログを終わります。
コメント