最初に
本記事「Dockerコンパクトマニュアル」は4項目で構成されております。
他の記事はこちらです。
投稿番号 | サブタイトル及びアクセス先 |
---|---|
1 | 初歩・基本コマンド |
2 | マウントとデータ永続化 |
3 | docker-compose (*本記事) |
4 | カスタムイメージを作成する |
この記事の目的
本記事では複数コンテナをまとめて起動するDocker-composeのまとめをしたいと思います。
docker-compose
Dockerホスト上では複数のコンテナを組み合わせて使う事は
Dockerネットワークを使用すれば可能です。
しかし、問題として起動の順序を意識し、実行する事が必要です。
その際にも docker run
して --name
で名前をつけて
--mount
でマウント設定を行ったり・・・・。
長いコマンドを間違いなく順番に実行する事が必要となります。めんどくさーい!
この煩雑なコンテナの作成、停止、破棄の一連動作を定義ファイルを読み込ませる事で
実行できるのがdocker-compose
です。
docker-composeは定義ファイル(docker-compose.yml)に
実行・コピーしたいファイルなどを1つのディレクトリにまとめておきます。
このファイルをdocker-composeというツールで実行するとボリュームやネットワークが作られ
まとめてコンテナが起動します。
docker-compose のメリット
- 従来必要なdocker run等の長い引数を指定する必要がない
- まとめて複数のコンテナを起動できる。
- 起動順序の指定もできる
- まとめてコンテナの停止・破棄ができる
- コンテナ起動後にコマンド実行等の初期化操作が行える
docker-composeのインストール
docker-composeやDockerを補助するPython製のツールです。
Docker Engineとは別ですので、別途インストールする必要がありますが、
Docker for Mac,WindowsにはComposeが含まれているので
上記がインストール済みでしたら意識する必要はありません。
念の為、下記でdocker-composeのバージョンを確認できます。
docker-compose --version
docker-compose version 1.27.2, build 18f557f9
docker-compose操作
docker-composeは docker-compose コマンド オプション引数
で
docker-compose.yml
ファイルを処理し実行を行います。
コマンドは多種ありますが、よく使うものは
up
down
start
stop
run
exec
の6つだと思います。
それ以外のコマンド種類を抜粋したものが下記の表となります。
・docker-compose コマンド
コマンド | コマンドの内容 |
---|---|
up | コンテナを作成し起動する |
down | コンテナ、ネットワーク、イメージ、ボリュームをまとめて停止削除する。 ただしイメージとボリュームはオプション引数による指定が必要 |
start | サービスを開始する |
stop | サービスを停止する |
run | コンテナを実行する |
exec | コマンドを実行する |
ps | コンテナを一覧表示する |
config | Composeファイルの確認と表示をする |
kill | コンテナを強制停止する |
restart | サービスを再起動する |
build | サービス用のイメージを構築または再構築する |
events | コンテナからリアルタイムにイベント受信 |
またよく使う up
のコマンド引数は下記のような物があります。
よく使うオプションは -d
だと思います。
・docker-compose up オプション引数
upオプション | オプション内容 |
---|---|
-d | デタッチモード(バックグラウンド動作)で実行。よく使うと思います。 |
--no-deps | リンクしたサービスを表示しない |
--force-recreate | 設定やイメージに変更がなくても、コンテナ再生成する。 --no-recreateと同時指定不可 |
--no-create | コンテナがすでに存在していれば再生成しない。 --force-recreateと同時指定不可 |
--no-build | イメージが見つからなくてもビルドしない |
--build | コンテナを開始前にイメージをビルドする |
--abort-on-container-exit | コンテナが1つでも停止したら、全てのコンテナを停止する。 -dオプションと同時指定不可 |
-t,--timeout ** | コンテナを停止する時のタイムアウト秒数。規定は10秒 |
--remove-orpahns | Composeファイルで定義されていないサービス用のコンテナを削除 |
同じくdown
にもオプション引数があります。
イメージが多くなる場合やイメージを次回使いたくない場合
--rmi
でdownと一緒に削除するのがいいと思います。
docker-compose down --rmi all --volumes
とすれば
イメージ・ボリューム含め一括削除できます。
・docker-compose down オプション引数
downオプション | オプション内容 |
---|---|
--rmi all, local | 破棄後にイメージも削除します。 allの指定をした場合、利用した全イメージを削除。 localの場合はimageにカスタムタグがないイメージのみとなります。 |
--v,--volumes | volumesに記述されているボリュームを削除する。 ただしexternal指定されている物は除く |
--remove-orphans | docker-compose.ymlで定義していないサービスのコンテナも削除する |
docker-compose down,upでの注意
docker-compose up
とdown
する時にdocker-compose.yml
ファイルが異なる場合
docker-compose down
はその時点でのdocker-compose.yml
ファイルを見て動作します。
up
時からコンテナ記述が抹消されている場合はdown
してもコンテナは破棄されることはありません。
コンテナの削除残しや、意図しないコンテナやネットワーク削除に注意ください。
docker-compose.ymlファイルの書き方
docker-compose.ymlはサービス、ネットワーク、ボリュームの3つの定義が必要となります。
またyml形式のファイルではインデントしたブロック単位で記載します。
インデントが間違っていると記載した内容が反映されずエラーとなります。
またインデントにタブ文字は使えないので要注意です。
docker-compose.ymlに必要な記述は下記となります。
1.バージョン定義
2020.9月現在はversion3.8が最新となります。
version指定においては"3"
と記載した場合は3.0
が適応されます。
マイナーバージョンの設定を反映する場合は"3.8"
のように記載しないと反映されません。
Note: When specifying the Compose file version to use, make sure to specify both the major and minor numbers. If no minor version is given, 0 is used by default and not the latest minor version. As a result, features added in later versions will not be supported.
2.サービス
全体を構成する1つ一つのコンテナの事を指します。
docker-compose.yml設定の根幹部分となります。
サービスの設定は下記の書式で記述します。
services:
サービスAの名前:
サービスAの設定
・・・
サービスBの名前:
サービスBの設定
・主なサービスの設定
公式サイトを元によく使うと思われるサービス設定を抜き出したものが下記となります。
詳細は公式サイトを閲覧頂きますようお願いします。
Compose file referende
サービス項目 | 内容 | 補足事項 |
---|---|---|
image | 利用するイメージを指定する | redis,postgres,mysql 等 |
ports | ポートマッピングを利用する | postgres 5432:5432 等 |
build | ビルド時に設定される。 ビルドコンテキストへのパスを含む文字列として 指定することができます。 |
build . の場合カレントディレクトリ内のDockerfileを 参照する。 |
depends_on | 別のサービスに依存することを示す。 docker-compose up,downする時に 指定したサービスが先に起動または終了 するようになる。 |
app側にてdbへの設定で使用する 等 |
volumes | バインドマウントやボリュームマウントを定義する | --mountオプションのように type:,source: 等 詳細設定で記述する事も可能 |
command | 起動時の既定のコマンドを上書きする | bundle exec rails s 等 |
environment | 環境変数を設定します。 | DBのパスワード、ユーザー名 等 |
上記意外にも多くのサービス設定項目があり、一度目通しされる事をおすすめします。
version 3.8からはreplica setの数を指定する記述設定が追加されました。
マイナーバージョンでもアップデートがありますのでversion指定に注意が必要です。
3.ネットワーク
サービスが参加するネットワークを定義。省略される事が多いので割愛します。
4.ボリューム
コンテナが利用するボリュームを定義します。
オプションでドライバ名等を指定する事ができます。
下記が主なオプションです。
項目 | 内容 |
---|---|
driver | ボリュームドライバ名 |
driver_opts | ボリュームのオプション。NFS等 |
external | docker-compose 管理対象外のボリュームであることを指定する。 このボリュームは予め作成されている必要があります。 external true, external: name: 等で指定した場合 docker-compose down -v をしても削除されません。 |
docker-compose でのサービス個別操作
時には1つのコンテナのみ起動したり操作したい場面もあるかと思います。
その時にはdockerコマンドを使用する事もできますが、docker-composeコマンドを使用する事により
docker-compose.ymlファイルを元に、依存関係を考慮したコマンド実行ができます。
(*アプリ実行前にdatabaseを起動させておく depends-on
設定が反映される等)
-
docker-compose
コマンドとdocker
コマンドの対比抜粋
docker-compose コマンド | 対応する dockerコマンド | 動作 |
---|---|---|
docker-compose exec | docker exec | コンテナ内でコマンド実行 |
docker-compose run | docker run | 特定のコンテナを実行する |
docker-compose start | docker start | 特定のサービスを開始する |
docker-compose stop | docker stop | 特定のサービスを停止する |
docker-compose rm | docker rm | 停止中のコンテナを削除する |
docker-compose logs | docker logs | コンテナの出力を表示する |
個別のコンテナの操作をする際には下記のようにコマンドを実行します。
よく使われるのが exec
と run
ではないかと思います。
下記は web というコンテナに /bin/bash で シェル実行を行う時のものです。
dockerコマンド時は -it
が必要でしたが、composeではこれらのオプションは不要です。
これでコマンドプロンプトが変わってコンテナ内でコマンド入力ができるようになります。
(*12e7a08bb0bd
はコンテナIDです。環境によって異なります。)
❯ docker-compose exec web bash
root@12e7a08bb0bd:~#
- シェル作業時の結果例(
ls -a
コマンド実行での抜粋)
❯ docker-compose exec web bash
root@12e7a08bb0bd:~# ls -a
. .gem .rspec Dockerfile README.md config log public storage yarn.lock
.. .git .rubocop.yml Gemfile Rakefile config.ru memo.md public_data tmp
.bash_history .github .rubocop_todo.yml Gemfile.lock app db