はじめに
Docker Composeを使い始めた頃、こんな疑問を持ったことはありませんか?
docker compose up -d
でコンテナを起動した後に、
docker compose up
を実行したらどうなるのだろう?
- エラーになる?
- 二重起動する?
- 一度停止した方がいい?
私もDocker学習中に気になったので調べてみました。
この記事では、docker compose up -d と docker compose up の違いと、連続で実行した場合の挙動について解説します。
結論
先に結論です。
docker compose up -d
を実行した後に、
docker compose up
を実行しても問題ありませんでした。
コンテナが二重起動することもなく、基本的にエラーにもなりません。
ただし、
表示される内容やターミナルの使われ方が変わります。
up -d と up の違い
まずは2つのコマンドの違いの理解から。
① docker compose up -d
-d は detached(デタッチドモード) の略です。
コンテナをバックグラウンドで起動します。
特徴は次の通りです。
- コンテナは裏で動く
- ターミナルはすぐ操作可能になる
- ログは表示されない
- 開発時によく使われる
実行イメージ
コンテナ起動
↓
すぐにプロンプトが返る
↓
別の作業ができる
② docker compose up
こちらはフォアグラウンドで起動します。
特徴は次の通りです。
- コンテナのログがリアルタイムで表示される
- ターミナルが占有される
- 停止するには Ctrl + C が必要
実行イメージ
コンテナ起動
↓
ログが流れ続ける
↓
Ctrl + Cで終了
up -dの後にupするとどうなる?
例えば次のように実行します。
docker compose up -d
docker compose up
初心者の頃は、「同じコンテナがもう1つ起動するのでは?
と思っていたことがありました。
しかし実際にはそうなりません。
既にコンテナが起動しているため、Docker Composeは既存のコンテナを利用します。
つまり、
新しく起動する
↓
ではなく
↓
既存のコンテナに接続する
という動作になります。
表示される「Attaching to」の意味
docker compose up を実行すると、次のような表示を見ることがあります。
Attaching to web-1
これはエラーではありません。
意味としては、以下のようなことになります
既に起動しているコンテナに接続しました
Docker Composeがコンテナのログを表示するためにアタッチしている状態になります。
停止してから実行する必要はある?
以下のようなケースでは、そのまま実行して問題ありませんでした。
- ログを確認したい
- コンテナの状態を確認したい
- デバッグしたい
⚠️設定を変更した場合は話が変わります。
停止した方がよいケース
① Dockerfileを変更したとき
例えば次のような変更です。
FROM ruby:3.2
↓
FROM ruby:3.3
イメージの内容が変わるため、再ビルドが必要です。
② compose.ymlを変更したとき
例えば、
- ポート番号
- 環境変数
- ボリューム設定
などを変更した場合です。
この場合も再起動が必要になります。
③ 再ビルドしたいとき
よく使うのは次のコマンドです。
docker compose down
docker compose up --build
流れとしては、
- コンテナを停止
- イメージを再ビルド
- 新しい設定で起動
となります。
使い分け
使い分けをまとめると以下のような感じになります
| やりたいこと | コマンド |
|---|---|
| コンテナ起動 | docker compose up -d |
| ログ確認 | docker compose logs -f |
| デバッグ | docker compose up |
| コンテナ停止 | docker compose down |
| 再ビルド | docker compose up --build |
おすすめの運用方法
Docker学習中であれば、まずは次の運用がおすすめです。
起動
docker compose up -d
ログ確認
docker compose logs -f
停止
docker compose down
この3つを覚えるだけでも十分に開発できます。
特にログ確認は、
docker compose logs -f
を使う方が便利なことが多いため、普段は up -d を使うケースが多いです。
まとめ
今回のポイントを整理します。
-
docker compose up -dはバックグラウンド起動 -
docker compose upはログを表示しながら起動 -
up -dの後にupを実行しても問題ない - コンテナが二重起動するわけではない
- 「Attaching to」は既存コンテナへの接続を意味する
- Dockerfileやcompose.ymlを変更した場合は再ビルドを検討する
最初は「同じコマンドなのに何が違うの?」と混乱しがちですが、実際には ログを表示するかどうかの違い と考えると理解しやすいでしょう。
Docker Composeを使い始めたばかりの方の参考になれば幸いです。
