Help us understand the problem. What is going on with this article?

個人運営サイトのSSLをDockerで良い感じに設定する

More than 3 years have passed since last update.

最近、サークル(?)でWordPressを作った物の紹介に使おうぜと提案があったので作った際の覚え書きです。

とりあえずdocker-composeでWordPressを建てます。

docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - /home/core/wordpress/data/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - /home/core/wordpress/wp-content:/var/www/html/wp-content
    links:
      - db
    ports:
      - 80:80
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress

良い感じのフォルダに用意してフォルダ内から docker-compose up -d よし、建った。やったぜ。

ですが、これだけだとhttpのみでのアクセスしかできない…。httpsでアクセスしたくない?したい。
最近はhttpsで接続できないとGoogleさんの検索結果にも影響するらしいので断然しておきたい。

のでSSL対応をDockerらしくします。使用しているOSもcoreosなのでSSL対応用のコンテナを立てます。

最初はイメージを作ろうかとしたのですがこの辺りは本業でやっている訳でもなく、いつもはゲームを作っているのでgithubやらdockerhubで強い人が作ったイメージを使う事にしました。


JrCs/docker-letsencrypt-nginx-proxy-companion
このイメージは簡単に言うとDocker.sockを監視してホスト名とメールアドレスからLet's Encryptを使用してSSL証明書を取ってきてくれる感じの奴です。
しかも更新作業も自動でやってくれます。なんと素晴らしい。
本当ならこれを良い感じに設定すれば終わりですが、他のコンテナが増えた際に対応するのが面倒なのでもう一つイメージを追加します。

jwilder/nginx-proxy
このイメージも簡単に言うとDocker.sockを監視して、指定されたパラメータが入っているコンテナへ自動で接続してくれるものです。中身はNginxです。フロント用にしておくことで他のバック用のコンテナにbasic認証とかが簡単にかけられます。あと、SSLのリダイレクトも自動でする(?)

そして、この二つを追加してSSLの対応を行います。

docker-compose.yml
version: '2'
services:
  db:
    image: mysql:5.7
    volumes:
      - /home/core/wordpress/data/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: wordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - /home/core/wordpress/wp-content:/var/www/html/wp-content
    links:
      - db
    expose:
      - 80
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: wordpress
      VIRTUAL_HOST: www.hoge.jp
      LETSENCRYPT_HOST: www.hoge.jp
      LETSENCRYPT_EMAIL: hoge@mail.com
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /home/core/wordpress/certs:/etc/nginx/certs:ro
      - /home/core/wordpress/htpasswd:/etc/nginx/htpasswd
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro

  letsencrypt-nginx-proxy-companion:
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - /home/core/wordpress/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy

networks:
  default:
    external:
      name: ssl-proxy

これで起動してから少し待つとSSL対応完了です。認証書が発行されるのに少しかかります。

VIRTUAL_HOST: www.hoge.jp
LETSENCRYPT_HOST: www.hoge.jp
LETSENCRYPT_EMAIL: hoge@mail.com
上記のパラメータが肝で、これらが良い感じに先程紹介したイメージのコンテナが見つけて自動で接続の設定をしてくれます。
あと、一つ気をつけておかないといけないのがdockerのネットワークが同じでないと見つけて貰えないのでその辺りはきちんと設定しましょう。完全に忘れていてあーだこーだしているうちに土日がなくなります。

web系に疎くても簡単にセキュリティが比較的高い物作れるのがdockerの良いところですよねー。更新もpullすれば良いわけですし。メンテナンスも楽ですなー。

KappaBull
渋谷で活動中のサーバーラックと住んでるUnityエンジニア
https://ka8.app/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away