【Dockerの最新機能を使ってみよう】複数のDockerコンテナを自動で立ち上げる構成管理ツール「Docker Compose」 2ページ

Docker Composeが使用する設定ファイル

 続いては、Docker Composeが使用する設定ファイルについて説明しよう。前述のとおり、Docker ComposeではYAMLもしくはJSON形式で設定ファイルを記述する。手作業で設定ファイルを記述する場合はYAMLのほうが書きやすいため、今回はYAML形式での設定ファイル記述について紹介する。

バージョン番号の記述

 Docker Composeの設定ファイルフォーマットには複数のバージョンが存在しており、2017年7月現在の最新バージョンは3.3だ。設定ファイルのバージョンはファイル内の「version:」要素で指定でき、たとえばバージョン2形式で設定ファイルを記述するには、ファイル内に「version: ‘2’」と記述すれば良い。いっぽう「version: ‘1’」と記述されている、もしくはバージョンの記述がない場合はバージョン1形式の設定ファイルとして認識される。

 Docker Composerでは後方互換性を保つため、設定ファイルで指定したバージョンに沿った挙動を行うようになっている。バージョンによって利用できる機能は異なるほか、バージョンが異なると挙動が変化する場合もあるので、設定ファイル内のバージョン表記を変更する際には注意したい。

設定ファイルの記述

 設定ファイルの基本的な記述スタイルは以下のようになる。

version: '2'
services:
  <サービス名>:
    各サービスに関する設定
    

volumes:
  <ボリューム名>:
    各ボリュームに関する設定
    
    

networks:
  <ネットワーク名>:
    各ネットワークに関する設定
    
    

build:
  ビルドに関する設定
  
  

 なお、「services」および「volumes」、「networks」、「build」のいずれも、設定項目がない場合は省略が可能だ。

コンテナやその起動オプションの記述

 コンテナやその起動オプションに関しては、「services:」以下に記述する。ここでは「サービス名:」に続いてそのコンテナの起動時に与える環境変数やポート、ボリュームなどの設定を記述していく。もちろん、複数のサービスについて記述することも可能だ。

 ここで記述できる主なパラメータは図2のとおりだ。それぞれの詳細については、Docker Composeのオンラインドキュメントを参照してほしい。

表2 指定できるサービスの主要パラメータ
パラメータ名説明対応する「docker run」コマンドのオプション
cap_add指定したcapabilitiesを追加する–cap-add
cap_drop指定したcapabilitiesを削除する–cap-drop
cgroup_parentcgroupにおけるparent groupを指定する–cgroup-parent
devicesデバイスマッピングを指定する–device
depends_on依存するサービスを指定する
dns使用するDNSサーバーを指定する–dns
dns_search名前解決時に使用する検索ドメインを指定する–dns-search
tmpfsコンテナにテンポラリファイルシステムをマウントする–tmpfs
entrypointコンテナのエントリーポイントを上書きする–entrypoint
env_file設定する環境変数とその値を指定する–env_file
environment設定する環境変数とその値を指定する-e、–env
exposeコンテナ外に公開するポートを指定する–expose
extends別の設定ファイルを読み込む
external_linksリンクを行うコンテナ名を指定する–link
extra_hostsコンテナの/etc/hostsファイルに指定したホスト名/IPアドレスの組み合わせを追加する–add-host
imageコンテナの作成元イメージを指定する
labelsコンテナに追加するラベルを指定する-l、–label
linksリンクを行うコンテナを指定する–link
loggingログ設定をおこなう–log-driver、–log-opt
network_mode使用するネットワークモードを指定する–net
networks接続するネットワークを指定する–net
pid「host」を指定することでホストとPIDを共有するようになる–pid
portsポートを開放する-p、–publish
securty_optセキュリティオプションを指定する–securty-opt
stop_signalコンテナを停止させる際にプロセスに送信するシグナルを指定する–stop-signal
ulimitsコンテナ内で使用されるデフォルトのulimitsを指定する–ulimit
volumesコンテナ内にマウントするボリュームを指定する-v、–volume
volume_driver使用するボリュームドライバを指定する–volume-driver
volumes_fromほかのコンテナのボリュームをマウントする–volumes-from
cpu_sharesコンテナのCPU使用率制限を行う–cpu-shares
cpu_quotaコンテナのCPU使用率制限を行う–cpu-quota
cpusetコンテナが使用するCPUを指定する–cpuset
domainnameコンテナのドメイン名を指定する
hostnameコンテナのホスト名を指定する
ipcコンテナでIPC名前空間を使用する
mac_addressコンテナのMACアドレスを指定する–mac-address
mem_limitコンテナのメモリ使用量を制限する-m、–memory
memswap_limitコンテナのスワップメモリ使用量を制限する-memory-swap
privilegedコンテナに拡張権限を適用する–privileged
read_onlyコンテナのルートファイルシステムをリードオンリーでマウントする–read-only
restartコンテナがすでに存在していた際の挙動を指定する–restart
shm_sizeコンテナが使用する共有メモリサイズを指定する–shm-size
stdin_openコンテナの標準入力をオープンしたままにする-i、–interactive
ttyコンテナに疑似TTYを割り当てる-t、–tty
userコンテナを実行する際のユーザーを指定する-u、–user
working_dirコンテナ実行時の作業ディレクトリを指定する-w、–workdir

 なお、networks設定内では各ネットワークに対し、以下のようにパラメータを指定する。

networks:
  <ネットワーク名1>:
    aliases: <そのコンテナのエイリアス(別名)>
    ipv4_address: <割り当てるIPv4アドレス>
    ipv6_address: <割り当てるIPv6アドレス>
  <ネットワーク名2>:
    aliases: <そのコンテナのエイリアス(別名)>
    ipv4_address: <割り当てるIPv4アドレス>
    ipv6_address: <割り当てるIPv6アドレス>
  
  

複数のコンテナの設定を1つの設定ファイルに記述する

 前述のとおり、Docker Composerでは複数のコンテナの設定を1つの設定ファイル内に記述することができる。たとえばWordPressのテスト環境として、MySQLを実行するコンテナとHTTPサーバー、PHP、WordPresを実行するコンテナの2つを使用したい場合、次のように記述できる。

version: '2'
services:
  my_mysql:
    image: mysql:5.7
    volumes:
      - /var/test/mysql:/var/lib/mysql
      - /var/test/mysql_conf.d:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: some_password
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress_password

  my_wordpress:
    image: wordpress:4.5-apache
    links:
      - my_mysql:mysql
    volumes:
      - /var/test/wp_plugins:/var/www/html/wp-content/plugins
    environment:
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress_password
      WORDPRESS_DB_NAME: wordpress
    ports:
      - 80:80

 ここでは、「my_mysql」と「my_wordpress」という2つのサービスを定義している。前者がMySQLを実行させるサービス、後者がWordPressを実行させるサービスだ。my_mysqlサービスでは、「volumes」設定項目を使ってホスト上の/var/test/mysqlおよび/var/test/mysql_conf.dディレクトリをコンテナ内にマウントして使用している。また、いくつかの環境変数も指定している。これらの環境変数は、コンテナの起動時に自動でユーザーの作成/設定やデータベースの作成を行うためのものだ。詳細についてはDockerHubのmysqlページで解説されているので、そちらを参照して欲しい。

 また、my_wordpressサービスでは、「links」設定項目を使って、先に定義している「my_mysql」サービスに対し「mysql」というホスト名でアクセスできるよう設定している。DockerHubで公開されているWordPressコンテナでは、デフォルトで「mysql」という名称のMySQLホストに接続するように構成されており、これだけでMySQLへ接続できるようになる(詳しくはDockerHubのwordpressページを参照)。また、「volumes」設定項目でホスト上に配置したプラグインのディレクトリをコンテナ内のWordPressのプラグインディレクトリにマウントするようにしている。このようにすることで、コンテナイメージ自身を修正することなく、任意のプラグインを追加することが可能になる。

 この設定ファイルを作成したら、このdocker-compose.ymlファイルが格納されているディレクトリ内で次のようにdocker-composeコマンドを実行することで2つのコンテナが起動し、サービスが開始される。

# docker-compose up -d

 ここで指定されている「-d」オプションはそれぞれのコンテナをデタッチドモード(Detached mode)でバックグラウンドで起動させるオプションだ。これを付けないと、2つのコンテナがフォアグラウンドで起動するので注意したい。

 コンテナの起動後、「docker ps」コマンドで稼動しているコンテナを確認すると、次のようにプロジェクト名(docker-compose.ymlファイルを格納したディレクトリ。ここでは「compose」)とサービス名(ここでは「my_wordpress」および「my_mysql」)、そしてインスタンス数(ここでは「1」)をアンダースコア(「_」)で繋いだ名前でコンテナが作成されていることが分かる。

# docker ps
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS                    NAMES
df629ab197f3        wordpress:4.5-apache   "/entrypoint.sh apach"   5 minutes ago       Up 2 seconds        0.0.0.0:80->80/tcp       compose_my_wordpress_1
b328aae57177        mysql:5.7              "docker-entrypoint.sh"   5 minutes ago       Up 3 seconds        3306/tcp                 compose_my_mysql_1

 また、「docker up」コマンドではサービス名を引数として指定することで、指定したサービスだけを起動することもできる。たとえば「my_mysql」サービスのみを起動したい場合、次のようにする。

docker-compose up -d my_mysql

 起動したコンテナを停止させるには、同じディレクトリで「docker-compose down」コマンドを実行すれば良い。

# docker-compose down

 なお、「docker-compose down」コマンドの実行後、停止されたコンテナは自動的に削除される。