こんにちは。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コンテナです。
ディレクトリ構成は以下のようになっています。
.
├── 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環境をマウント(ディレクトリの同期)させたい
- ローカル環境の3000番ポートとDocker環境の3000番ポートをマッピングさせたい
- rails_appというDockerイメージを利用する
上記の要件を満たしたDockerコンテナの実行コマンドは以下のようになります。
$ docker run --rm -p 3000:3000 -v `pwd`:/rails_app rails_app
上記のコマンドを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コンテナの実行の設定管理
- アプリケーションを構成するDockerコンテナの依存関係の管理
また、『環境構築からデータ作成まで!MySQL x RailsのDocker Compose環境構築手順』の記事では複数のDockerコンテナで構成されるRailsアプリをDocker Composeを利用して構築する手順について紹介しています。
Docker Composeを活用したより実践的な内容となっていますので、ぜひ読んでいただければと思います。
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!