Docker for Mac + Docker ComposeでWordPress開発環境を構築する!

2017年2月15日

ENVIRONMENT

Docker fo Macの登場で、ますますDockerを使用した開発環境が構築しやすくなりました。
今回はWordPress開発環境の構築を例に、Docker, Docker Composeの基本的な使い方を紹介します。

この記事でわかること

  • 基本的なdockerコマンド
  • 基本的なdocker-composeコマンド
  • docker-compose.ymlファイルの構文

Docker for Macについて

Dockerは当初、動作環境はLinuxのみの対応だったため、MacOSでDocker実行環境を使用するにはVirtualBoxが必要でした。
ところが、2016年7月末頃にDocker for Macが正式リリースされ、MacのローカルでDocker実行環境を用意することができるようになりました。(→ VirtualBoxが不要に)
引き続きVirtualBoxを使用して開発環境を構築することは可能ですが、より簡単に行いたいのであればDocker for Macを使用しましょう。

Docker for Macのインストールはこちら Get started with Docker for Mac

Docker Composeについて

Docker Composeは、(Docker実行環境内の)複数のDockerコンテナを一括でコントロールする機能を提供します。

通常dockerコマンドを使用して複数のコンテナの起動や停止を行う場合は、コンテナ1つごとにコマンドを入力する必要があり、面倒です。
Docker Composeではこの操作や各コンテナの簡単な構成をdocker-composeコマンドでまとめて行うことができます。

Docker for Macをインストールすることで Docker Composeも合わせてインストールされます。
単体でインストールしたい場合はこちらからどうぞ Install Docker Compose

基本的なdockerコマンド

実は今回の環境構築はdocker-composeコマンドだけで事足ります。
ただ最低限知っていると便利なdockerコマンドがいくつかあるので紹介しておきます。

docker ps

現在のDocker実行環境で起動中のDockerコンテナの情報を確認する。

$ docker ps

docker images

現在のDocker実行環境にあるDockerイメージの一覧を表示する。

$ docker images

docker rmi

選択したDockerイメージを削除する。
IMAGE IDはdocker imagesコマンドで確認することができます。

$ docker rmi [IMAGE ID]

$ docker rmi -f [IMAGE ID] # '-f'オプションを付けると強制削除

その他オプション

Dockerコマンドのヘルプを確認したい場合はdocker -hコマンド。
各コマンドのヘルプを確認したい場合はコマンドに-hオプションを付けます。

$ docker -h        # Dockerコマンドのヘルプを表示
$ docker images -h # 'docker images'コマンドのヘルプを表示

基本的なdocker-composeコマンド

docker-compose build

ymlファイルに書かれている各サービスのビルドを実行する。
サービス毎に定義しているDockerイメージをリモートからプルしたり、Dockerfileを元にDockerイメージを作成します。

$ docker-compose build

docker-compose up

ymlファイルを元に各サービスのコンテナを作成し、起動する。
-dオプションを付けることでバックグラウンドで実行します。

$ docker-compose up

$ docker-compose up -d # '-d'オプションでバックグランド実行

docker-compose stop

docker-compose upによって起動中の各サービスのコンテナを停止する。

$ docker-compose stop

docker-compose down

docker-compose upによって作成された各サービスのコンテナを削除する。

$ docker-compose down

docker-compose ps

ymlファイルに書かれている各サービスから作成されたコンテナの状態一覧を表示する。

$ docker-compose ps

docker-compose logs

docker-compose upによって作成されたコンテナのログを表示。
続けてサービス名を指定すると、そのコンテナのログのみを表示します。

$ docker-compose logs

$ docker-compose logs db # dbコンテナのログのみ表示

その他オプション

dockerコマンド同様、-hオプションを付けることでヘルプを確認できます。

また、-fオプションを使用することで、使用するymlファイルを指定することができます。
(-fオプションで指定しない場合は、docker-compose.ymlファイルを探し出して実行します。)

# docker-compose.ymlファイルを元にビルドを実行
$ docker-compose build

# docker-compose.test.ymlファイルを元にビルドを実行
$ docker-compose -f docker-compose.test.yml build

docker-compose.ymlファイルの作成

それでは環境構築の実践に入ります。
まずDockerとDocker Composeが無事インストールされ、動作しているかを確認してください。

$ docker --version         # Docker version ... と表示されればOK

$ docker-compose --version # docker-compose version ... と表示されればOK

次にプロジェクトのディレクトリを作成し、ディレクトリルートに移動します。

$ mkdir wordpress-docker
$ cd wordpress-docker

カレントディレクトリにdocker-compose.ymlファイルを作成し、以下のコードを記述します。

docker-compose.yml
version: "2"
services:
  wp:
    image: wordpress:latest
    ports:
      - "8080:80"
    links:
      - db
    volumes:
      - "./wp:/var/www/html"
    environment:
      WORDPRESS_DB_HOST: "db:3306"
      WORDPRESS_DB_NAME: wordpress
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: password


  db:
    image: mysql:5.7
    ports:
      - "3306:3306"
    volumes:
      - "./db_data/mysql:/var/lib/mysql"
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_ROOT_PASSWORD: password

このファイルで、WordPress環境(PHP + Apache)を構成するwpコンテナと、MySQLサーバーを構成するdbコンテナを作成することができます。

構文説明

上記のdocker-compose.ymlをベースに構文を説明します。
公式ドキュメントはこちら Compose file reference

image

ベースイメージの指定を行う。

  • wp → wordpress:latest
    • wordpressイメージ(latest → 最新verを指定)
  • db → mysql:5.7
    • mysqlイメージ(5.7 → ver5.7を指定)

ports

公開するポートを指定する。ホスト:コンテナと記述することで、ホストとコンテナのポートを指定している。

  • wp → 8080:80
    • ホスト8080番を開放し、コンテナ80番にアクセス
    • コンテナではApacheが起動するため80番を指定
    • localhost:8080にアクセスすると、コンテナの80番に転送される
  • db → 3306:3306
    • ホスト3306番を開放し、コンテナ3306番にアクセス
    • コンテナでMySQLサーバが起動するため3306番を指定

links

コンテナと他のサービスをリンクする。

dbコンテナのMySQLデータベースを利用しないといけないのでwpコンテナ側でリンクの指定をしている。

volumes

パスをボリュームとしてマウントする。

  • wp → ./wp:/var/www/html
    • ローカルのwpディレクトリとコンテナの/var/www/htmlディレクトリをマウント
  • db → ./db_data/mysql:/var/lib/mysql
    • ローカルのdb_data/mysqlディレクトリとコンテナのvar/lib/mysqlディレクトリをマウント

environment

コンテナに環境変数をセットする。

  • wp → WordPressで使用するMySQLデータベースの情報をセット
    • WORDPRESS_DB_HOST: "db:3306"でdbコンテナを指定している
    • 基本的にdbコンテナの環境変数の値と同じ値をセットする
  • db → MySQLデータベースの情報をセット
    • MYSQL_DATABASE: wordpressをセットすることで、初回起動時にCREATE DATABASE wordpressが実行される

ビルド → コンテナ起動

docker-composeコマンドでwp, dbサービスをビルドし、コンテナの作成と起動を行います。

ビルド

まずdocker-compose buildでビルドを実行。
先ほど作成したカレントディレクトリにあるdocker-compose.ymlファイルを元にビルドします。

$ docker-compose build

wordpressイメージとmysqlイメージがリモートからプルされたはずです。確認してみましょう。

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           latest              ...                 ...                 ... MB
mysql               5.7                 ...                 ...                 ... MB

コンテナの作成と起動

次にdocker-comopse up -dでコンテナの作成と起動を行います。
合わせてコンテナの起動状態をdocker-compose psで確認してみましょう。
問題がなければ以下のような出力が表示されます。

$ docker-compose up -d # コンテナの作成、起動

Creating network "dockerwordpress_default" with the default driver
Creating dockerwordpress_db_1
Creating dockerwordpress_wp_1

$ docker-compose ps # コンテナの起動状態を確認

        Name                      Command               State           Ports
--------------------------------------------------------------------------------------
dockerwordpress_db_1   docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp
dockerwordpress_wp_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8080->80/tcp

カレントディレクトリの確認

カレントディレクトリにdb_datawpディレクトリが作成されています。

これは、docker-compose.ymlで定義したvolumesの結果で、mysqlのデータとwordpressのファイル群がそれぞれのディレクトリにマウントされています。
このディレクトリ内にあるファイルに変更を加えると、コンテナ内のファイルにも同じ変更が加わります。
例えば、WordPressテーマの開発を行う場合はwp/wp-content/themes/にテーマのディレクトリを作成し、そこにindex.php等を配置して開発していけばOKです。

localhost:8080にアクセス

localhost:8080にアクセスしてください。以下の画面が表示されるはずです。

あとは画面に従って初期設定を行うことで、WordPressの管理画面まで進むことができます。お疲れ様でした。

次はこの開発環境を使って簡単なWordPressテーマを開発していく記事を公開予定です。お楽しみに!