はじめに
Docker を使ってシステムを構築する機会があったのですが、
その際に docker start を実行したにもかかわらず、設定変更が反映されない という事象に遭遇しました。
- docker-compose.yml は「いつ」「どこで」参照されているのか分からない
- 別ディレクトリにある docker-compose.yml からコンテナを起動できるのか?
といった点が分からず、
「なんとなく分かるけど、腑に落ちない」状態がしばらく続いていました。
そこで本記事では、
実際の作業を通して理解した内容を、Docker 初心者目線で整理してみます。
同じようなところで詰まっている方の参考になれば幸いです。
※ Docker を使っている方には当たり前の内容かもしれませんが、備忘録として残しておきます。
前提の構成
AWSのEC2 上で以下のような構成を使っていました。
- リバースプロキシ用コンテナ
- バックエンドコンテナ
- フロントエンドコンテナ
- docker-compose で管理
ディレクトリはこんなイメージです。
/home/app-a
└ docker-compose.yml
/home/app-b
└ docker-compose.yml
起きたこと
まず /home/app-a でコンテナを起動しました。
cd /home/app-a
docker compose up -d
その後、設定を少し変えて、
docker restart app-nginx
を実行したのですが、
- 設定変更が反映されない
- 「今いるディレクトリの docker-compose.yml が使われていない?」
状態でした。
docker start / restart は何を見ているのか?
結論からですが、
👉 docker start / docker restart は
docker-compose.yml を一切見ていません
これらのコマンドは、
- すでに存在しているコンテナ
- Docker Engine に保存されている「コンテナ定義」
を使って、ただ起動(再起動)するだけです。
つまり、
docker restart app-nginx
をどのディレクトリで実行しても、
- docker-compose.yml
- Dockerfile
は参照されません。
docker-compose.yml が参照されるタイミング
では、docker-compose.yml はいつ使われるのでしょうか。
👉 docker compose up を実行したときだけです。
cd /home/app-a
docker compose up -d
このときに初めて:
- 今いるディレクトリの docker-compose.yml
- (あれば)同じ場所の .env
が読み込まれます。
docker start と docker compose up の違い
混乱したポイントなので、表でまとめます。
| コマンド | 新規作成 | 設定ファイル参照 |
|---|---|---|
| docker start | ❌ | ❌ |
| docker restart | ❌ | ❌ |
| docker run | ✅ | ❌(引数のみ) |
| docker compose up | ✅ | ✅(docker-compose.yml) |
👉 設定変更を反映したい場合は docker restart では不十分
👉 docker compose up が必要
実際に動いているコンテナを確認してみる
docker ps
すると、以下のように表示されました。
- nginx コンテナ(80番公開)
- frontend コンテナ(3000番公開)
- backend コンテナ(ポート非公開)
ここで重要なのは、
「このコンテナたちは、
すでに Docker に登録された存在」
という点です。
docker start は この登録情報を使って起動しているだけです。
別ディレクトリの docker-compose.yml から起動できるのか?
結論:
👉 可能です
例えば、すでに /home/app-a のコンテナが起動していても、
cd /home/app-b
docker compose up -d
を実行すれば、
別の docker-compose.yml を元に新しいコンテナが作成されます。
注意点
① container_name の衝突
container_name: app-nginx
このように container_name を固定している場合、
別ディレクトリでも同じ名前は使えません。
Conflict. The container name is already in use
② ポートの衝突
ports:
- "80:80"
これは 1台のサーバで1つだけしか使えません。
別compose でも起動したい場合は、
ports:
- "8080:80"
など、ホスト側ポートをずらす必要があります。
③ volumes / networks の名前固定
volumes:
app_node_modules:
networks:
app_network:
名前が固定されていると、別 composeでも同じボリューム・ネットワークを共有します。
意図していない場合は注意が必要です。
まとめ
- docker start / restart は「既存コンテナ」を起動するだけ
- docker-compose.yml は docker compose up のときだけ使われる
- ディレクトリを切り替えて compose up すれば別構成を起動できる
- container_name / ports / volumes は衝突しやすい
Docker は便利ですが、
「どの情報をどのタイミングで使っているか」 を理解しないと混乱しやすいと感じました。
自分と同じように「docker start って何見てるの?」と疑問に思った方の助けになれば幸いです。