Docker(ドッカー)とはシンプルで軽量なコンテナ型の仮想化環境です。ウェブ制作者にとっては手軽にサーバー環境を構築できるため注目を集めています。また、「Docker CE For Windows」と「Docker CE For Mac」を利用することで、Linux上だけでなく、Windows・macOSでも環境の違いを意識することなく手軽にDockerを導入できることも魅力の1つです。

本連載ではDockerを活用してウェブサーバーなどの環境を構築する手順について解説しています。

前回の記事「HTTP/2に対応したウェブサーバーを簡単に構築! Dockerfileでオリジナルの環境を構築する手順について」では、Dockerfileを作成しオリジナルの環境を構築する手順について紹介しました。

本記事では、前回作成したHTTP/2に対応したWebサーバーのコンテナに、データベースや言語のコンテナを組み合わせて、一つのサービスを構築していく手順について紹介します。

※後述のサンプルデータ内に、前回の記事で作成したDockerfileが含まれています。前回記事の手順を行っていない方は、サンプルデータを利用ください。

▲本記事のサンプルのイメージ。Docker Composeを使ってHTTP/2に対応したWordPress環境を構築します

完成イメージ 〜HTTP/2に対応したWordPress環境〜

WordPressが動作する環境を整えるため、前回作成したHTTP/2に対応したたウェブサーバー(nginx)に、PHPのコンテナとデータベース(MySQL)のコンテナを組み合わせます。WordPressのデータは他のコンテナに依存しないよう、データボリュームコンテナとして別のコンテナを用意します。

1つのコンテナでまとめて動作させることも可能ですが、ミドルウェアごとにコンテナを分け依存関係をなくすことで、PHPやMySQLなどミドルウェアのアップデートを行う際に他のミドルウェアに影響を与えないため、再ビルドの必要もなく容易に対応できます。

Docker Composeは複数コンテナを一元管理できるツール

Docker Composeとは、複数のDockerコンテナを組み合わせたサービスを構築する際に、YAML形式のファイルにサービスの構成を定義することで、一元管理できるツールです。従来の方法では、サービスに必要なコンテナを個別に立ち上げ、コンテナ同士を関連付けをしていく必要があるため、起動順序にも気をつけなければならずとても面倒でした。

Docker Composeを使用すれば、事前にYAMLにサービスの構成を定義しておくことで、これらの事を意識することなくコマンドを一つ実行するだけで環境を構築できます。

Docker Composeを使ってサービスを立ち上げる

それでは、Docker Composeでサービスを立ち上げるために必要なファイルを次のディレクトリー構成で準備していきます。サンプルコードはGitHubにアップしてありますので、そのまま利用していただいても問題ありません。

サンプルコードは次の環境で動作することを確認しています。

  • macOS Sierra 10.12.5
  • Docker Community Edition for Mac : Version 17.03.1-ce-mac12

docker-compose.ymlの作成

まずは、docker-compose.ymlという名前のファイルを作成し、次の通りYAML形式でサービスの構成を定義します。YAMLとはインデントを使ってデータの階層構造を表すフォーマットです。

※本記事でversion2の形式で記述します。

version: "2"
services:
  web:
    build: ./web
    ports:
      - "80:80"
      - "443:443"
    volumes_from:
      - app
    volumes:
      - ./web/nginx.conf:/etc/nginx/nginx.conf
  php:
    build: ./php
    ports:
      - "9000:9000"
    volumes_from:
      - app
    depends_on:
      - db
  app:
    build: ./app
    volumes:
      - /usr/local/nginx/html
  db:
    image: mysql:5.7.18
    env_file: .env
    ports:
      - "3306:3306"
    volumes:
      - ./db-data:/var/lib/mysql
volumes:
    db-data:

前述の通り、ウェブサーバー(web)、PHP(php)、データベース(db)、データボリュームコンテナ(app)の4つのコンテナを作成し、それぞれのコンテナを組み合わせ一つのサービスとして構築していきます。

設定ファイル内では主に次のオプション設定が使用されています。

オプション設定概要
imageコンテナを実行時の元となるイメージを指定します。
buildDockerfileが格納されているディレクトリのパスを指定します。
ports公開するポートを指定します。ホスト側:コンテナ側の形式で指定することで、ホストマシン側のポートとコンテナ側のポートをマッピングします。
volumesホスト側:コンテナ側の形式で指定することで、ホストマシン側の任意のディレクトリーまたはファイルをコンテナ内にマウントします。
volumes_from指定した他のサービスやコンテナ上のボリュームをマウントします。
※本オプションはversion3では廃止されます。同様の仕組みを実現する場合はプラグインを使用する必要があります。
depends_onサービス間の依存関係を指定します。依存関係のある順番に従ってサービスを起動していきます。
env_file環境変数を外部ファイルを参照し追加します。

次のページでは、各コンテナで行っているオプション設定の内容について説明します。