はじめに
「dockerってめっちゃ使われてるし、よし、勉強しよ」と思って始めた当初から、「え?何が違うの??」と戸惑ってました。曖昧なまま勉強を進めていると、何度もこの問いにぶつかるのでまとめようと思います。初心者の備忘録も兼ねてるので、間違いがあればご指摘ください。
公式をちゃんと読もう
やっぱりこういう時には公式リファレンスです。
up ・ run ・ start の違いは何ですか?
一般的には docker-compose up が使われるでしょう。 up を使うと docker-compose.yml ファイル中で定義したサービスの開始または再起動を行います。デフォルトは「アタッチド」モードであり、全てのコンテナのログが画面上に表示されます。「デタッチド」モード( -d )では、Compose はコンテナを実行すると終了しますが、コンテナは後ろで動き続けます。
docker-compose run コマンドは「ワンオフ」(one-off;1つだけ、偶発的) または「アドホック」(adhoc;臨時)なタスクの実行に使います。実行するにはサービス名の指定が必要であり、特定のサービス用のコンテナを起動し、かつ依存関係のあるコンテナも起動します。 run の利用時は、テストの実行であったり、データ・ボリューム・コンテナに対するデータの追加・削除といった管理タスクです。 run コマンドは実際には docker run -ti を処理しており、コンテナに対してインタラクティブなターミナルを開き、コンテナのプロセスが終了すると、その時点の該当する終了コードを返します。
docker-compose start コマンドは既に作成済みのコンテナの再起動には便利です。しかし止まっているコンテナを起動するだけであり、新しいコンテナは作成しません。
up
は全サービスを開始or再起動してくれます。とりあえず一括で立ち上げて、全体に不備がないか確認できますね。
run
は一つのコンテナにのみフォーカスします。用途として想定されるのは、『テスト実行』『データの追加・削除』など。あるコンテナで色々作業したいときに便利ですね。depends_on
など依存関係があってもちゃんと考慮して立ち上げてくれます。
start
は元々ある停止中コンテナを再起動するだけです。事前にコンテナを作っておかないといけません。
まとめてみる
公式とその他記事を参考にして、まとめてみました。
コマンド | 対象 | イメージ作成 | コンテナ構築 | コンテナ起動 | いつ使うか |
---|---|---|---|---|---|
up | 全てのサービス | 初回のみ | 初回のみ | ○ | 全てのサービスを開始or再起動したい |
run | 1つのサービス | ○ | ○ | ○ | あるコンテナを一から作り作業をしたい |
start | 作成済の全てのコンテナ | ✕ | ✕ | ○ | 停止させていたコンテナを再起動させたい |
ちなみに、Dockerfileの更新を反映させてup
を使いたい場合は、--build
オプションをつけます。すなわち上の表で、up
の『初回のみ』となっている部分が--build
のおかげで○になりますね。
おわりに
これでやっと迷わずコマンドを打てそうです。やっぱり記事にすると頭の中が整理されて、細かいところまでクリアになるので良いですねー!