WordPress開発環境構築[3] DcokerでSSL・WordPress・proxy・mysqlをインストール

更新日:2019/07/31

VPS上に、5分でSSLなサブドメインを増やして、Wordpressテスト環境を量産するのが目標な企画第三回です。

最終的な目標は次のとおり。

(1) サブドメインが異なるWordpress環境を同じサーバー内に、5分以内で作れるようにする。

(2) 追加したサブドメインすべてに、自動的にSSLを設定する。

(3) 各Wordpressのwp-contentディレクトリ内に、同じFTPアカウントで自由に読み書きができる。

(4) FTPでアップしたファイルを、Wordpress上のエディタで自由に変更できる。

その実現方法として、Dockerを利用します。

前回は、ConoHa VPSでOSをインストールして、DNSとOSの初期設定をおこないました。

今回は、Dcckerの設定をおこなっていきます。

WordPress開発環境構築レポート

第一回:5分でSSLなサブドメインを増やせる状態にする!
第二回: ConoHa VPS 初期設定(DNS・Ubuntu)
第三回: DcokerでSSL・Wordpress・proxy・mysqlをインストール

 

Dockerの存在とバージョン確認

まずはVPSに『Docker』と『Docker Compose』がインストールされているかどうか確認します。

$ docker --version
Docker version 19.03.1, build 74b1e89

$ docker-compose --version
docker-compose version 1.24.1, build 4667896b

ConoHaのDockerテンプレートには、『Docker Compose』が入っていないという情報があったのですが、今回の環境では入っているようです。

 

Dockerのコンテナ構成

今回は複数のWordpressをVPSにインストールして、個々にサブドメインに割り振ります。
さらに、サブドメインが追加されるたびにSSLを自動で設定します。

イメージとしては、こんな感じ↓

Docker Wordpess 複数

nginx-proxy

WordPress側で『変数:VIRTUAL_HOST』にドメインを設定すると、自動で割り振ってくれる。
便利!

リバーシプロキシというらしい。

letsencrypt-nginx

WordPress側で『変数:LETSENCRYPT_HOST』などにドメインを設定すると、自動でSSL証明書を取得してくれる。
ちょー便利!

 

ネットワークを作る

最初に、コンテナ間の通信で必要なネットワークを作成します。

$ sudo docker network create --driver bridge shared-proxy

コマンドの最後の『shared-proxy』は、自分の好きな名前で大丈夫です。

 

リバーシプロキシとSSL用のコンテナ作成

次に『nginx-proxy』と『letsencrypt-nginx』のコンテナを作成・起動させます。

(1) 任意のユーザーでログインして、ディレクトリを作成

$ pwd
/home/userxxx
$ mkdir proxy

(2) 作成したディレクトリ内に、『docker-compose.yml』を作成

docker-compose.yml:

version: "2"
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    privileged: true
    ports:
      - 80:80
      - 443:443
    volumes:
      - /srv/docker/nginx-proxy-with-encrypt/certs:/etc/nginx/certs:ro
      - /srv/docker/nginx-proxy-with-encrypt/htpasswd:/etc/nginx/htpasswd
      - /etc/nginx/vhost.d
      - /usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - /srv/docker/nginx-proxy-with-encrypt/log:/var/log/nginx
    restart: always
  letsencrypt-nginx:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-nginx
    privileged: true
    volumes:
      - /srv/docker/nginx-proxy-with-encrypt/certs:/etc/nginx/certs:rw
      - /var/run/docker.sock:/var/run/docker.sock:ro
    volumes_from:
      - nginx-proxy
    restart: always
networks:
  default:
      external:
        name: shared-proxy

ymlは字下げがめちゃくちゃ大事。
タブは不可。
半角スペースで、きっちり揃えないとエラーになる。
この例は、字下げ一回で半角スペース二つ。

(3) 作成した、『docker-compose.yml』を適用。

$ cd proxy <= 『docker-compose.yml』を保存したディレクトリへ
$ sudo docker-compose up -d
Pulling nginx-proxy (jwilder/nginx-proxy:)...
latest: Pulling from jwilder/nginx-proxy
a5a6f2f73cd8: Pull complete
        ・
        ・
        ・
Creating nginx-proxy ... done
Creating letsencrypt-nginx ... done

『docker-compose up -d』を実行すると、ディレクトリ内の『docker-compose.yml』を読み込んで、必要なものを自動で引っ張ってきて、設定してくれます。

(4) 確認

$sudo docker ps -a

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
8c22f3b72e0bjrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 21 minutes agoUp 21 minutesletsencrypt-nginx
f3c07fd9f2cfjwilder/nginx-proxy"/app/docker-entrypo…"21 minutes agoUp 21 minutes0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcpnginx-proxy

各行にUPがあれば、OK(らしい)

 

WordPressとmysql用のコンテナ作成

次に『WordPress』と『Mysql』のコンテナを作成・起動させます。

今回作成するディレクトリやファイルの配置は、次のようなイメージになります。

/home/userxxx
  ┣ .env(環境設定ファイル)
  ┣ .docker-compose.yml(docker-compose構成ファイル)
  ┣ wp(WordPressディレクトリ)
  ┗ db(Mysqlディレクトリ)

(1) 任意のユーザーでログインして、ディレクトリを作成

$ pwd
/home/userxxx
$ mkdir wp1

(2) 作成したディレクトリ内に、データ保存用のディレクトリを作成

$ cd wp1<=作成したディレクトリに移動
$ mkdir wp<=wordpress用
$ mkdir db<=mysql用

(3) 作成したディレクトリ内に、環境設定ファイル『.env』を作成

.env:

MY_SUBDOMAIN=w1<=サブドメイン名

MY_DOMAIN=xxx.com<=ドメイン名
MY_EMAIL=xxx@xxxx.jp<=SSL設定用メール

MY_DB_NAME=wp<=wordpress用データーベース名
MY_DB_USER=wp_user<=wordpress用データーベースユーザー名
MY_DB_PASSWORD=passxxxxxxxx<=wordpress用データーベースパスワード

設定値は、適宜変更してください。

(4) 作成したディレクトリ内に、『docker-compose.yml』を作成します。

docker-compose.yml:

version: "2"
services:
  wp:
    image: wordpress:latest
    container_name: "wp_${MY_SUBDOMAIN}"
    depends_on:
      - mysql
    volumes:
      - ./wp:/var/www/html
    environment:
      VIRTUAL_HOST: "${MY_SUBDOMAIN}.${MY_DOMAIN}"
      LETSENCRYPT_HOST: "${MY_SUBDOMAIN}.${MY_DOMAIN}"
      LETSENCRYPT_EMAIL: ${MY_EMAIL}
      WORDPRESS_DB_HOST: "mysql_${MY_SUBDOMAIN}"
      WORDPRESS_DB_USER: ${MY_DB_USER}
      WORDPRESS_DB_PASSWORD: ${MY_DB_PASSWORD}
      WORDPRESS_DB_NAME: ${MY_DB_NAME}
    restart: always
  mysql:
    image: mysql:5.7
    container_name: mysql_${MY_SUBDOMAIN}
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: yes
      MYSQL_DATABASE: ${MY_DB_NAME}
      MYSQL_USER: ${MY_DB_USER}
      MYSQL_PASSWORD: ${MY_DB_PASSWORD}
    volumes:
      - ./db:/var/lib/mysql
    restart: always
networks:
  default:
    external:
      name: shared-proxy

${XXX}は、.envファイルから読み込んだ変数を展開します。

主な項目の説明

version:

バージョンにより、パラメータ等が異なります。
ネットで紹介されている『docker-compose.yml』を参考にする場合、バージョンを確認しないとわけが分からなくなります。

container_name:

container_nameを指定しない場合、自動で名前が付与されます。
今回は後で特定しやすいように、サブドメインを付加した名前を指定しています。

depends_on:

依存関係を指定しています。
ここで指定したコンテナが先に起動されます。

volumes:

基本的にデータはすべてコンテナ内に作成されます。
volumesを指定することで、コンテナ外に作成します。

これによりFTPなどで、直接データを転送することができます。

書式は、

コンテナ外のディレクトリ名: コンテナ内のディレクトリ名

となります。

environment:

設定に必要な環境変数などを指定します。

VIRTUAL_HOST:

この値を見て、サブドメインが設定されます。

LETSENCRYPT_HOST:

SSLが設定されるドメインです。
通常VIRTUAL_HOSTと同じになります。

LETSENCRYPT_EMAIL:

SSLを設定するときに必要になるメールアドレスです。

WORDPRESS_DB_HOST:

WordPressが接続するデータベースを指定します。
networks内に複数のDBがある場合、接続するDBを特定しないといけないようです。
今回は、mysqlのcontainer_nameと同じ値を指定しています。

WORDPRESS_DB_USER:
MYSQL_USER:

WordPressがMysqlで使用するユーザーです。
指定しなくてもデフォルトで作成してくれるので、いらないかもしれません。

WORDPRESS_DB_NAME:
MYSQL_DATABASE:

WordPressがMysqlで使用するデータベース名です。
指定しなくてもデフォルトで作成してくれるので、いらないかもしれません。

WORDPRESS_DB_PASSWORD:
MYSQL_PASSWORD:

WordPressがMysqlで使用するデータベースのパスワードです。
指定しなくてもデフォルトで作成してくれるので、いらないかもしれません。

(5) 作成した、『docker-compose.yml』を適用。

$ cd wp1 <= 今回作成したディレクトリへ
$ sudo docker-compose up -d

実行すると、『.env』と『docker-compose.yml』を読み込む、必要なファイルを引っ張ってきて設定してくれます。

(6) 確認

$ sudo docker ps -a

CONTAINER IDIMAGECOMMANDCREATEDSTATUSPORTSNAMES
c1b2264e1db3wordpress:latest"docker-entrypoint.s…"17 seconds agoUp 14 seconds80/tcpwp_w1
ac6305610f57mysql:5.7"docker-entrypoint.s…"18 seconds agoUp 17 seconds3306/tcp, 33060/tcpmysql_w1
8c22f3b72e0bjrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 21 minutes agoUp 21 minutesletsencrypt-nginx
f3c07fd9f2cfjwilder/nginx-proxy"/app/docker-entrypo…"21 minutes agoUp 21 minutes0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcpnginx-proxy

各行にUPがあれば、OK(らしい)

 

WordPress起動

設定が終わったら、ブラウザからサブドメイン込みのURLでアクセスします。

ドメイン取得元のネームサーバー情報やDNS設定直後は、設定した内容が浸透するまで時間がかかります。
しばらく待つか、次のページを参考にしてください。
参考Windows10でhostsを編集してドメインにアクセスする

またSSL取得についても、多少の時間がかかります。
こちらは、設定が終わるまでお待ちください。

無事アクセスができると、次のようにワードプレスで使用する言語を選択する画面が表示されます。

Docker WordPress 言語選択

設定をすすめるとログイン画面が表示されます。
ログインができれば、Wordpressの起動成功です。

FTPで書き込めるようにする

Docker Composeで作成したWordpressの共有ディレクトリのパーミッションは、次のようになっていました。

drwxr-xr-x  www-data  www-data  wp-content

このフォルダは、www-dataというユーザーのみが書き込めるようになっています。

www-dataは、Docker Compose実行時に設定されたもので、作業用のユーザーはありません。
このままだと、FTPで書き込みできません。

そこで、次の設定を行います。

(1) ファイルとディレクトリにグループの書き込み権限を付加
(2) 作業用ユーザーをwww-dataグループに追加

$ cd ./wp1/wp <=Wordpressの共有ディレクトリに移動
$ sudo find ./wp-content -type f -exec chmod 664 {} + <=wp-content内のファイルのパーミッションを再帰的に664に設定
$ sudo find ./wp-content -type d -exec chmod 775 {} + <=wp-content内のファイルのディレクトリを再帰的に664に設定
$ sudo gpasswd -a 作業用ユーザー www-data <=作業用ユーザーをwww-dataグループに追加

FTPしたファイルをWordpressのエディタで書き込めるようにする

作業用のユーザーでFTPしたファイルのパーミッションは、次のようになります。

-rw-rw-r-- 1 ユーザー名 ユーザーグループ名

基本的にユーザー名と、ユーザーグループ名は同じ文字です。
この場合、作業用のユーザーのみが、このファイルに書き込みできます。

一方、Wordpress上でエディタの編集を行う場合、ユーザーはwww-dataになります。
そのため、FTPしたファイルを編集できません。

そこで次の作業を行います。

(1) ユーザーのグループ番号を確認
(2) ワードプレスのコンテナに入る
(3) コンテナ内にグループ番号が同じグループを作る
(4) www-dataユーザーを作成グループに追加

$ id <=ログイン中しているユーザーのidを表示
uid=1000(ユーザー名) gid=1004(グループID) groups=1004(グループ)
$ sudo docker exec -it wp_w1 /bin/bash<=コンテナに入る
# groupadd -g 1004 グループ名<=グループを作る
# gpasswd -a www-data グループ名<=作成したグループに追加

これで、一つ目のWordpressの作成が完了です。

 

2つめのWordpress環境を作る

次に2つめのWordpress環境を作ります。

ディレクトリを『wp2』に。
サブドメインを『w2』にします。

その他は、一つ目と同じです。

$ pwd
/home/userxxx
$ mkdir wp2
$ mkdir wp
$ mkdir db

.env:

MY_SUBDOMAIN=w2

MY_DOMAIN=xxx.com
MY_EMAIL=xxx@xxxx.jp

MY_DB_NAME=wp
MY_DB_USER=wp_user
MY_DB_PASSWORD=passxxxxxxxx

docker-compose.yml:
変更なし

$ pwd
/home/userxxx
$ cd wp2

$ sudo docker-compose up -d

新しく作成したWordpressにアクセスして、確認。

パーミッション関連設定1:

$ cd ./wp2/wp
$ sudo find ./wp-content -type f -exec chmod 664 {} +
$ sudo find ./wp-content -type d -exec chmod 775 {} +
$ sudo gpasswd -a 作業ユーザー www-data

パーミッション関連設定2:

$ id
uid=1000(ユーザー名) gid=1004(グループID) groups=1004(グループ)
$ sudo docker exec -it wp_w2 /bin/bash
# groupadd -g 1004 グループ名
# gpasswd -a www-data グループ名

内部的に、SSLを取得して反映される時間を除くと、5分以内でWordpressのテスト環境を増やすことができました。

 

WordPressを削除して再インストールする

次に、インストールしたWordpressのテスト環境を削除して、再度インストールしてみます。

まずは削除。
docker-compose.ymlのあるディレクトに移動して、downコマンドを実行します。

$ cd ./wp2
$ sudo docker-compose down -v

このコマンドは、コンテナを停止して削除します。
同時にボリュームも削除する…はずですが、Wordpressのデータなど共有ディレクトリは削除されませんでした。

なので手動で削除します。

$ rm -rf ./wp/*
$ rm -rf ./db/*

そして再度、.envファイルとdocker-compose.ymlを用意。
docker-composeを実行して、各種ファイルをインストールすると…

Docker WordPress 言語選択

何の問題もなく、起動しました。

 

最後に

Docker何それ?という状態から始めたこの企画。
完成するまで丸一週間かかりました。

とりあえずやったことの意味は理解できるようになったので、超初心者の仲間入りはできたと思います。

更新日:2019/07/31

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。