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

最近、サークル（？）でWordPressを作った物の紹介に使おうぜと提案があったので作った際の覚え書きです。  
とりあえずdocker-composeでWordPressを建てます。  

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

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

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

```docker: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すれば良いわけですし。メンテナンスも楽ですなー。