Docker Composeとは?Dockerコマンドとの比較で理解するDocker Compose入門

インフラ

こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。

Dockerを利用したアプリケーション開発はもはや当たり前になりつつあります。

Dockerでアプリケーション開発をするにあたり、Docker Composeという言葉を聞いたことがある方も多いのではないでしょうか。

今回はDocker Composeのもつ役割やメリットについてイマイチ理解できていないという方むけにDocker Composeの概要について紹介をしたいと思います。

  • Docker Composeの役割ってなに?
  • Dockerコンテナの実行コマンドとdocker-compose.ymlの関係性って?

こんな方の参考になればと思います。

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

一般的なアプリケーションの場合、単一のシステム(プロセス)のみでサービスが稼働していることはほとんどありません。

Webアプリケーションであれば、Webサーバーだけでなくデータベースサーバーやロードバランサーなどが用意されており、それらを連携することでひとつのシステムが構成されています。

Dockerで『複数のコンテナによって構成されたアプリケーション』を用意する場合、Dockerコンテナ同士の連携設定が必要になります。
そのようなときに役に立つのがDocker Composeです。

Docker Composeは複数のDockerコンテナの実行を一元管理するツールです。Docker Composeでは各コンテナの実行をdocker-compose.ymlという設定ファイルで管理します。

Docker Composeを導入することで、Docker環境での開発時にコンテナ同士の依存関係を気にする必要がなくなります。また、docker-compose.ymlの設定をみることでコンテナの構成がすぐにわかるようになります。

Dockerコンテナの実行コマンドとdocker-compose.ymlを比較してみる

docker-compose.ymlを利用することで、複数のコンテナの依存関係やコンテナ実行の設定を一元管理することができます。
今回はdocker-compose.ymlを利用したDockerコンテナの運用方法について紹介をします。

Docker Composeを利用することでDockerコンテナの実行が簡潔になるのを実感していただければと思います。

Docker環境で動かすサンプルアプリの紹介

今回はDocker環境で動くサンプルアプリを例にとり、Docker Composeの説明をしたいと思います。
なお、説明を簡略化するため、単一のDockerコンテナで起動するアプリケーションをサンプルとして利用します。

今回利用するサンプルアプリは『ローカル開発環境の構築不要!Dockerを利用したRailsアプリ起動手順』で紹介した、『Railsアプリが起動するというシンプルなDockerコンテナです。

ローカル開発環境の構築不要!Dockerを利用したRailsアプリ起動手順

ディレクトリ構成は以下のようになっています。

.
├── Dockerfile
├── Gemfile
├── README.md
├── Rakefile
├── app
├── bin
├── config
├── config.ru
├── db
├── lib
├── log
├── package.json
├── public
├── storage
├── test
├── tmp
└── vendor

Dockerコンテナを実行しlocalhost:3000にアクセスすると以下のような画面が表示されます。

『Dockerコンテナの実行オプション』と『docker-compose.yml』の比較

Dockerコンテナを実行する際に以下のような設定をしたいとします。

Dockerコンテナの実行設定
  • ローカル環境とDocker環境をマウント(ディレクトリの同期)させたい
  • ローカル環境の3000番ポートとDocker環境の3000番ポートをマッピングさせたい
  • rails_appというDockerイメージを利用する

上記の要件を満たしたDockerコンテナの実行コマンドは以下のようになります。

$ docker run --rm -p 3000:3000 -v `pwd`:/rails_app rails_app

図で表現すると以下のようになります。
docker runのオプション

上記のコマンドをdocker-compose.ymlに書き直すと以下のようになります。
なお、docker-compose.ymlの記述方法はversion 3のものを採用しています。1

$ vim docker-compose.yml

docker-compose.yml

version: '3'
services:
  web:
    image: rails_app
    ports:
      - '3000:3000'
    volumes:
      - .:/rails_app

作成したdocker-compose.ymlを利用してDockerコンテナを起動するには以下のようにします。

$ docker-compose up

docker-compose.ymlでコンテナの実行設定を管理するようにしたので、さきほどの『docker run』と比較して、コマンドがとてもシンプルになったのがわかると思います。

Docker ComposeはDockerコンテナの依存関係などをdocker-compose.ymlで管理します。そのため、Dockerコンテナを実行する開発者はコンテナの依存関係・実行オプションなどを気にすることなくDockerを利用できます。

特に、Dockerコンテナの依存関係が複雑になればなるほど、Docker Composeはなくてはならないツールです。

補足: Docker ComposeでDockerファイルをビルドする場合

docker-compose.ymlでビルド対象のDockerファイルを指定することもできます。
先ほど作成したdocker-compose.ymlのうち、以下の部分を追加してください。

version: '3'
services:
  web:
+   build: .
    image: rails_app
    ports:
      - '3000:3000'
    volumes:
      - .:/rails_app

build: .はカレントディレクトリのDockerファイルをビルドするという意味になります。

ですので、docker-compose.ymlとDockerfileが同じディレクトリ(今回の例でいえば、docker-compose.ymlはRailsアプリのルートディレクトリ)に存在してる前提になります。

docker-compose.ymlに記載したビルド設定を実行する場合は以下のようになります。

$ docker-compose build

まとめ: Docker Composeを活用してコンテナの設定を一元管理しよう

以上でDocker Composeに関する紹介を終わります。

Dockerコンテナを利用する開発者がコンテナの実行設定やコンテナ同士の依存関係を気にする必要がなくなるのは大きなメリットですね。

Docker Composeの役割
  • Dockerコンテナの実行の設定管理
  • アプリケーションを構成するDockerコンテナの依存関係の管理

また、『環境構築からデータ作成まで!MySQL x RailsのDocker Compose環境構築手順』の記事では複数のDockerコンテナで構成されるRailsアプリをDocker Composeを利用して構築する手順について紹介しています。
Docker Composeを活用したより実践的な内容となっていますので、ぜひ読んでいただければと思います。

環境構築からデータ作成まで!Rails x MySQLのDocker Compose環境構築手順

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!


  1. version3を利用する場合、docker versionは1.13.0以上が必要です(参考)