MENU

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をインストール

 

■お願い
去年ECMAScript2020を頑張って日本語訳しましたが、誰も見てくれません・・・
誰かみて!!
【JavaScript】 学習のためECMAScript2020を日本語訳してみました

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何それ?という状態から始めたこの企画。
完成するまで丸一週間かかりました。

 

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

 

記事の内容について

 

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


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

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

そんなときは、ご意見もらえたら嬉しいです。

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

【お願い】

お願い

■このページのURL


■このページのタイトル


■リンクタグ