【Docker入門 】⑤ Docker Composeの基本

Docker Composeで複数コンテナを一括操作

複数のDockerコンテナの操作を簡単にする、Docker Composeついて紹介します。

本記事で使用するファイルはこちらからダウンロード出来ます。
docker-compose-lesson.zip
SAMPLE

Docker Composeの機能は※docker-composeコマンドで操作します。
※Docker Desktopをインストールした時点で使用可能

docker-comoseバージョン確認
(docker本体とはバージョンが分かれている)

下記の記事ではそれぞれ別々で起動したwebサーバ(PHP & Apache)のコンテナとDBサーバ(MySQL)のコンテナをネットワーク連携する方法を紹介しました。

【Docker】コンテナ間をネットワークで連携する

本記事ではそれと全く同じことをDocker Composeを使ってより簡単、シンプルに実現する手順を解説します。

環境: Docker version 19.03.13, docker-compose version 1.27.4

Docker Composeのメリット

複数のコンテナからなるアプリケーションを実行する際、通常は利用するコンテナの数だけ起動を行い、docker runコマンドのオプションも毎回正しく指定しなくてはいけません。

Docker Composeを使用する場合、
詳しくは後ほど紹介していきますが、docker-compose upという決まったコマンドを一度実行するだけで、アプリケーションを構成する複数のコンテナを一度にまとめて起動することが出来ます。

また、docker runコマンドで指定していたオプション等は専用の定義ファイルであるdocker-compose.ymlに記述出来るようになります。

これにより複数人の開発者間で共有する場合や、環境が異なる際にも毎回決められた設定で確実にコンテナを起動する事が出来るようになります。

起動するコンテナがひとつのみであってもコマンド実行時に多くのオプションを必要としないメリットがあります。

Docker Compose利用の準備

Docker Composeを利用する際はサンプルのように対象のアプリケーションごとに実行に必要なファイル郡を一箇所にまとめておきます。

1. docker-compose.yml

docker-compose.ymlはDocker Composeを利用するための定義ファイルで、docker-composeコマンドを実行する際のルールをインデント(字下げ)と:(コロン)を用いるYAMLという形式で記述します。

(各項目について)

version:
ファイルの記述バージョンを指定する。

Docker本体であるDocker Engineのアップデートにともない、過去の記法がサポートされなくなった場合でも、こちらに作成時点のバージョンを明示しておけば、Dockerの最新バージョンでも過去の記法を使用することが出来ます。

services:
起動するコンテナごとにひとつのサービスとして定義する。
ここではWebサーバ用コンテナにweb、DBサーバ用コンテナにdbというservice名をつけて個別に定義しています。

service名は次に説明する、ビルドコンテキスト及びディレクトリ名と統一しておくことが推奨されます。

build:
イメージの元となるDockerfileの場所とDockerfileの名前を定義する。

contextにはdocker-compose.yml自身から見たDockerfileの存在するパス、Dockerfileにはcontextからのパスを記述します。

Dockerfileの名前を変更していない場合は、これらを省略して

とするだけでもOKです。

image:
ビルド後のイメージ名を指定する。
(ビルドしない場合は通常のdockerイメージ名を指定)

container_name:
起動するコンテナ名を指定する。

restart:
再起動ポリシーの指定。
(docker runで指定するオプションと同じ)
https://docs.docker.jp/config/container/start-containers-automatically.html

environment:
環境変数を設定する。(コンテナごとの設定値)

ports:
ポートフォワーディング設定。

volumes:
ディレクトリマウント設定。
ホスト側:コンテナ側
のように、ディレクトリ共有設定を行う。

2. 各コンテナごとのDockerfile

各コンテナの元となるイメージをビルドする場合は対象のDockerfileも用意します。

イメージをビルドしないでデフォルトの状態からコンテナを起動する際はDockerfileは必要なく、
docker-compose.ymlにもbuildの指定は必要ありません。

(その他) 設定ファイル、ソースコード

DBの設定ファイル、テストデータ用の.sqlファイル、Webサーバの実行ファイル等を通常のdockerコンテナによる環境構築時と同様に用意しておきます。

docker-composeコマンドの実行

必要なファイルの用意が出来たら、docker-compose.ymlのパスでdocker-composeコマンドを実行していきます。

イメージのビルド

docker-compose.ymlに記述された各コンテナのイメージをまとめてビルドします。

コンテナの起動

イメージのビルドに成功したら、下記コマンドを実行し、docker-compose.ymlに記述されたコンテナを一括で作成、起動します。

コンテナの起動だけでなくこの時点で各コンテナ間を通信させるためのネットワークの作成も行われます。

イメージのビルドとコンテナの起動を同時に行うには…

下記のようにbuildオプションを指定することで、コンテナ起動時にイメージのビルドも行うことが出来ます。

ビルドを行わないとどうなる?

ビルドを行わないとDockerfileの更新内容が反映されません。

ビルドするイメージがまだ存在していないときは、次で説明するdocker-compose upの実行だけでもビルドが行われますが、
2回目以降のコンテナ起動時には上記のオプションを使用するか、buildコマンドでビルドを明示的に行わなければDockerfileに加えた定義の変更内容がイメージ(つまりコンテナにも)に反映されません。

アプリケーションの実行確認

コンテナの起動が確認出来たらコンテナで起動中のwebサーバーにブラウザからアクセスします。

docker-compose.yml、ports:で指定した接続ポート番号でアクセス
http://localhost:82/

画面上にテスト用データが表示出来たらDocker Composeによるコンテナ操作の成功です。

docker-composeコマンドまとめ

コマンド動作備考
docker-compose buildイメージのビルド
docker-compose upコンテナの起動オプション

-d
バックグラウンドモード

--build
イメージのビルドを同時に行う
docker-compose ps起動中のComposeコンテナの確認
docker-compose imagesComposeイメージの確認
docker-compose exec ※サービス名 bashComposeコンテナへのログイ※docker-compose.yml、services:
docker-compose downComposeコンテナをまとめて削除オプション

--rmi all
Composeイメージ、ネットワークを含め全て削除

docker-composeコマンドの操作対象はdocker-compose.ymlに関連するコンテナやイメージだけで、通常のdockerコマンドで作成されたコンテナやイメージの操作は出来ません。

逆に、docker-composeコマンドで作成されたコンテナ、イメージは通常のdockerコマンドでも操作を行うことも出来ますが、複数コンテナにまたがる操作を行う場合はdocker-composeコマンドを使う事が推奨されます。

Follow me!