LoginSignup
1
3

More than 3 years have passed since last update.

Docker コンパクトマニュアル(3:docker-compose)

Last updated at Posted at 2020-10-29

最初に

本記事「Dockerコンパクトマニュアル」は4項目で構成されております。
他の記事はこちらです。

投稿番号 サブタイトル及びアクセス先
1 初歩・基本コマンド
2 マウントとデータ永続化
3 docker-compose (*本記事)
4 カスタムイメージを作成する

この記事の目的

本記事では複数コンテナをまとめて起動するDocker-composeのまとめをしたいと思います。

docker-compose

Dockerホスト上では複数のコンテナを組み合わせて使う事は
Dockerネットワークを使用すれば可能です。
しかし、問題として起動の順序を意識し、実行する事が必要です。
その際にも docker run して --name で名前をつけて
--mountでマウント設定を行ったり・・・・。
長いコマンドを間違いなく順番に実行する事が必要となります。めんどくさーい!

この煩雑なコンテナの作成、停止、破棄の一連動作を定義ファイルを読み込ませる事で
実行できるのがdocker-composeです。

1d54fa053d39.jpg

docker-composeは定義ファイル(docker-compose.yml)に
実行・コピーしたいファイルなどを1つのディレクトリにまとめておきます。
このファイルをdocker-composeというツールで実行するとボリュームやネットワークが作られ
まとめてコンテナが起動します。

docker-compose のメリット

  1. 従来必要なdocker run等の長い引数を指定する必要がない
  2. まとめて複数のコンテナを起動できる。
  3. 起動順序の指定もできる
  4. まとめてコンテナの停止・破棄ができる
  5. コンテナ起動後にコマンド実行等の初期化操作が行える

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 updownする時に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.

Compose-versioning

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 コンテナの出力を表示する

個別のコンテナの操作をする際には下記のようにコマンドを実行します。
よく使われるのが execrun ではないかと思います。
下記は 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

本記事はここまでです。読了ありがとうございました。
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3