Dockerで「CentOS+WordPress+Apache+MySQL5.7」の環境を作る

今回は、DockerでWordPressの環境を整える方法を備忘録としてまとめる。

もし、「とりあえずDockerでWordPressが動けばいいや」と言うのであれば、公式で紹介されている「クイックスタート・ガイド:Docker Compose と Wordpress — Docker-docs-ja 17.06.Beta ドキュメント」を参考にすると簡単に環境構築ができる。

しかし、Docker公式で用意されているWordPressは英語版だったりOSはUbuntuを使っている等、必ずしも自分の理想的な環境を用意してくれていない。

なので、今回の方法で以下の環境を作っていく。

  • WordPress日本語版
  • PHP 7.2.28
  • Apache 2.4.6
  • MySQL 5.7

僕の開発環境

  • Mac 10.14.6
  • Docker version 19.03.5

なお、今回はDockerはすでに導入済みの前提で話を進めていく。もし、Dockerをインストールしていなければ、「Get started with Docker Desktop for Mac | Docker Documentation」の公式ページからインストールしよう。

Dockerfileの作成

まずはDockerのイメージを作成するためのDockerfileを作成する。現在のディレクトリにDockerfileと言うファイルを作成し、以下のコードを書く。

FROM centos:7

# update yum & 必要な物をインストール
RUN yum -y update
RUN yum -y install yum-utils openssl tar wget epel-release
RUN yum clean all

# 今回はphp7をインストールしたいので、必要なremiリポジトリをインストール
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN rpm -Uvh remi-release-7*.rpm
RUN yum-config-manager --enable remi-php72

RUN \
    yum -y install \
    httpd \
    php \
    php-common \
    php-mbstring \
    php-mcrypt \
    php-devel \
    php-xml \
    php-mysqlnd \
    php-pdo \
    php-opcache --nogpgcheck \
    php-bcmath

RUN yum clean all

RUN mkdir /app
WORKDIR /app

# WordPress日本語版を公式サイトからインストール
RUN curl -LO https://ja.wordpress.org/latest-ja.tar.gz
RUN tar xvzf latest-ja.tar.gz -C /var/www/html --strip-components=1     
RUN rm latest-ja.tar.gz  

RUN chown -R apache:apache /var/www/                                    
RUN echo "ServerName localhost" >> /etc/httpd/conf/httpd.conf

EXPOSE 80

CMD ["/usr/sbin/httpd","-D","FOREGROUND"]

やっていることは、CentOSでLANP+WordPress環境を整えるのとほぼ同じ事を行っている。

ポイントはRUN chown -R apache:apache /var/www/とサーバーのディレクトリの所有者をApacheに変更する事と、EXPOSE 80でポート番号80を解放する事。最後にCMD ["/usr/sbin/httpd","-D","FOREGROUND"]でApacheを起動し続けるようにする事だ。

Dockerfileの書き方については「Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント」が詳しい。

docker-composeを作成

次にdocker-compose.ymlと言うファイルを作成し、以下のコードを書く。

version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
     - db_data:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
  wordpress:
    build: .
    env_file: .env
    depends_on:
     - db
    ports:
     - 8080:80
    volumes:
     - ./themes:/var/www/html/wp-content/themes
     - ./plugins:/var/www/html/wp-content/plugins
     - ./wp-config.php:/var/www/html/wp-config.php
volumes:
  db_data:

ポイントは、以下のvolumesの部分。以下のように書く事で、現在のディレクトリにあるthemesディレクトリと、Dockerコンテナ内の/var/www/html/wp-content/themesをリンクしてくれるようになる。

また、Dockerのコンテナは再起動するたびにWordPressのwp-config.phpが削除されるので、wp-config.phpも自身で作成してvolumesに入れるようにしている。

volumes:
 - ./themes:/var/www/html/wp-content/themes
 - ./plugins:/var/www/html/wp-content/plugins
 - ./wp-config.php:/var/www/html/wp-config.php

wp-config.phpはWordPress公式を参考に以下のように書けば良い。(結構省略している)

<?php

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', getenv("DB_NAME"));

/** MySQL database username */
define('DB_USER', getenv("DB_USER"));

/** MySQL database password */
define('DB_PASSWORD', getenv("DB_PASSWORD"));

/** MySQL hostname */
define('DB_HOST', getenv("DB_HOST"));

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

また、docker-composeはenv_file: .envと買う事で、現在のディレクトリにある.envを読み取って環境変数として取り込んでくれる。

.envは以下のように記述しておいた。

DB_HOST=db:3306
DB_USER=wordpress
DB_PASSWORD=wordpress
DB_NAME=wordpress

今回はdbwordpressと言う名の2つのコンテナを立ち上げており、感覚的には2つのサーバーを立てている状態になっている。

Dockerのネットワークのシステムはシンプルに作られており、db:3306とする事でdbコンテナと接続できるようになる。(3306の部分はポート番号)

参考:Docker入門(第五回)〜コンテナ間通信〜 | さくらのナレッジ

なお、環境変数を指定する際にDB_HOST=db:3306のように書いているが、"db:3306"のようにクオーテーションマークは使えないからだ。(参考:環境ファイル — Docker-docs-ja 17.06.Beta ドキュメント

WordPressを起動する

ここまでくれば、後は以下の2つのコマンドを実行するだけでOK。

docker-compose build
docker-compose up -d