Docker でLet’s encrypt を発行・更新してみた

docker

こんばんは。最近ブログばっかり書いて気がしますが、結構書いてみたい記事が溜まっているだけで、暇ではないよ、、きっと。。。ということはさておき、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 の具体的な内容については以下のドキュメントを参照してみてください。

Welcome to the Certbot documentation! — Certbot 4.1.1 documentation

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 化を進めていきましょう!!ということで今回のブログを終わります。

コメント

タイトルとURLをコピーしました