.net column

.NET開発者のためのブログメディア

docker-composeとは?基礎知識と8つのファイル項目を細かく解説!

2020年05月19日

SE
docker-composeとは、どのようなことができるのでしょうか?

PM
複数のdockerコンテナを容易に管理できるツールです。

docker-composeとは?

docker-composeは、複数のdockerコンテナを定義・実行するツールです。複雑なアプリケーションを構築するときには、複数のdockerコンテナを用意し、コンテナ間で通信させることがよくあります。しかし、複数のコンテナを管理することは容易ではありません。docker-composeを使うことで、複数のコンテナを容易に管理することができます。

設定方法

docker-composeでは、管理する複数のコンテナの詳細などを、docker-compose.yamlというyamlファイルで定義します。そうすることにより、複数のコンテナを同時に実行することが可能になります。完成したdocker-compose.yamlファイルがあるディレクトリで、docker-compseの各コマンドを実行することで、アプリケーションの起動・終了・削除などができます。

基本的なyamlファイルの記述方法

下記のリンクにある例を用いて、基本的なyamlファイルの書き方について説明します。簡単に以下の表にまとめたうえで、それぞれの項目について詳しく説明しています。

項目説明

version docker-composeのバージョン
services 管理する各コンテナ
services.〇〇 コンテナの名称
services.〇〇.build コンテナのDockerfileがあるパス
services.〇〇.ports コンテナに開けるポート番号
services.〇〇.volumes コンテナとホストマシン間のボリュームマウント
services.〇〇.links コンテナを他のサービスにリンク
volumes トップレベルのボリュームマウント
公式リファレンスのクイックスタートガイド

version

docker-composeには、バージョンという概念が存在します。2020年4月時点での最新バージョンは3です。バージョンによってyamlの書き方が異なることや、同じyamlでも異なる挙動をすることがあります。バージョンの違いには十分に注意しましょう。

services

docker-composeで管理する各アプリケーションは、サービスと呼ばれます。1つのサービスに対して1つのdockerコンテナが対応します。サービスは複数定義できるので、servicesは複数の子要素を持ちます。今回の例では、webとredisがサービスとして定義されています。

services.〇〇

各サービスの名称です。今回の例では、webとredisがサービスの名称です。サービスの名称は単なる名前だけでなく、コンテナ間が通信する際のエンドポイントの役目も果たします。例えば、webコンテナ内から「ping redis」と実行すると、redisコンテナと通信していることが確認できます。

services.〇〇.build

各サービスで起動するdockerコンテナのDockerfileのパスです。相対パスを指定する場合は、yamlファイルからの相対パスで考えます。webには「.」が指定されているので、yamlファイルと同じディレクトリに、webのコンテナ情報を記述したDockerfileが存在する、ということになります。

services.〇〇.ports

コンテナがコンテナ外(ホストマシン)と通信する際に公開するポートです。「ホストマシンのポート:コンテナのポート」というように、コロンで区切って記述します。今回の例では、webに「5000:5000」と記述されているので、ホストマシンでlocalhost:5000にアクセスすることで、コンテナのポート5000にアクセスすることができます。

services.〇〇.volumes

ホストマシンとコンテナ内でボリュームマウントをする際に使用します。先程のportsと同様に「ホストマシンのパス:コンテナのパス」というように、コロンで区切って記述します。今回の例では、webに「.:/code」と記述されているので、ホストマシンのyamlファイルがあるディレクトリが、コンテナの/codeにマウントされます。

services.〇〇.links

コンテナを他のサービスにリンクさせます。docker-composeのバージョン2では、depends_onというものと同じ役割をします。これらは、コンテナ間の起動の順番を制御します。今回の例では、webはlinksにredisを指定しているので、webはredisが起動した後に起動します。起動順が変わるだけで、サービスの準備が整うまで待つわけではないので、注意が必要です。

volumes

services.〇〇.volumesでは各コンテナに対してマウントしますが、トップレベルにvolumesを置くことで、複数のコンテナでマウントするディレクトリを共有することができます。複数のコンテナにマウントしたい場合は、それぞれのサービスの中で記述せずにこちらを採用しましょう。

docker-composeの操作

docker-composeには複数のコマンドがあり、それぞれを適切に実行することにより便利な操作を可能にします。以下では、よく行う操作について、それに対応するコマンドを説明します。

サービスをビルドする

最初に、docker-compose.yamlファイルがあるディレクトリで、以下のコマンドを実行します。$ docker-compose buildこのコマンドは、各サービスをビルドするコマンドです。Dockerfileをイメージ化などが行われます。Dockerfileでなく、使用するイメージを直接指定した場合などは、プルなども行います。

コンテナを作成する

build後は以下のコマンドを実行します。$ docker-compose createこのコマンドは、ビルドされたサービスを元にコンテナを作成するコマンドです。ここで1つ注意したいことは、このコマンドはコンテナを作成するだけで、コンテナの起動はしません。起動するには、次に説明するコマンドを実行する必要があります。

サービスを開始する

最後に以下のコマンドでサービスを開始します。$ docker-compose startこのコマンドにより、yamlに記載したサービス群が一斉に起動します。注意点は、既にコンテナが存在している状態でないと、エラーを吐いてしまうという点です。必ずcreateコマンドでコンテナを作成してから、startコマンドでサービスを開始しましょう。

サービスを確認する

起動したサービスを確認するには、以下のコマンドを実行します。$ docker-compose psこのコマンドを実行すると、docker-composeが管理している各コンテナの状態などを確認することができます。各コンテナが起動しているか、どのポートを開いているかなどを確認したい場合に重宝します。

ログを確認する

起動したサービスが出力するログを確認したい場合は、以下のコマンドを実行します。$ docker-compose logsこのコマンドは、サービス全てのログをまとめて出力するので、少し見づらい場合があります。特定のサービスのログを確認したい場合は、logsの後にサービス名を追加して実行することで、そのサービスだけのログを出力できます。

サービスを停止する

startコマンドによって開始したサービスを停止するには、以下のコマンドを実行します。$ docker-compose stopサービスを起動したままにすると、もちろんホストマシンに負荷がかかります。必要のない場合はstopを実行することで、負荷を軽減できます。また、このコマンドはサービスを停止するだけなので、再度startコマンドを実行することで、すぐにサービスを再開できる便利なコマンドです。

コンテナを削除する

コンテナを削除するには以下のコマンドを実行します。$ docker-compose downこのコマンドは、サービスの削除(コンテナの削除)を行います。一度削除してしまうと、サービスのビルドからやり直す必要があり時間がかかるので、このコマンドを実行する際は十分に注意しましょう。

SE
これならdocker-composeの操作ができそうな気がします!

PM
そうですね。複数のコンテナの管理がしやすくなるので、ぜひ導入してみましょう!

docker-composeを導入してみよう

docker-composeの設定方法や、実際の操作について解説してきました。docker-composeを利用することで、複数のコンテナの管理がしやすくなります。docker-composeの導入を検討している場合は、ぜひこの記事を参考に実際に取り入れてみましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

求人一覧

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)