【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のオンラインドキュメントを参照してほしい。
パラメータ名 | 説明 | 対応する「docker run」コマンドのオプション |
---|---|---|
cap_add | 指定したcapabilitiesを追加する | –cap-add |
cap_drop | 指定したcapabilitiesを削除する | –cap-drop |
cgroup_parent | cgroupにおける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」コマンドの実行後、停止されたコンテナは自動的に削除される。