はじめに
- Dockerで、Dockerfileとかdocker-compose.ymlを使いまわしていると、どこまでプロジェクト名やサービス名を変える必要があるのだろうと不安になりました。
- なので、プロジェクト名やサービス名を被らせて、どこまでちゃんと動くか調べました。
- Reactプロジェクトを使っています。
- プロジェクト名とサービス名については、以下を参考
異なるプロジェクト名の場合
プロジェクト名を、react-app1とreact-app2でそれぞれ作成
docker compose up --build -d
すると以下の結果に
- プロジェクト名を変えると、完璧に動く
- ちゃんと違うプロジェクトとしてDockerが認識してくれる
- ただ、ホスト側のポート番号は変える必要がある
- ports: "3000:3000" と ports: "3002:3000"
- サービス名を同じにしても大丈夫
同じプロジェクト名・同じサービス名の場合
- 次は、同じプロジェクト名で、同じサービス名で実験しました。
- 「あプロジェクト」「いプロジェクト」を作ります。
- サービス名は、docker-compose.ymlで定義するものです。
- プロジェクト名を、react-appにしました。
# docker-compose.yml
version: "3"
services:
react-app: #同じサービス名!!!!
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3000:3000"
<div className="App">
<h1>「あ プロジェクト」</h1>
</div>
いプロジェクト
# docker-compose.yml
version: "3"
services:
react-app: #同じサービス名!!!!
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3002:3000"
<div className="App">
<h1>「い プロジェクト」</h1>
</div>
「あプロジェクト」を立ち上げる
-
docker compose up --build -d
→コンテナの立ち上がり成功 - localhost:3000→「あプロジェクト」が表示された
「いプロジェクト」を立ち上げる
-
docker compose up --build -d
→「いプロジェクト」は立ち上がったが、「あプロジェクト」が廃棄された - localhost:3000→アクセス不可
- localhost:3002→「いプロジェクト」が表示された
- イメージは、
<none>
と、react-app-react-app:latest
が作成された - 「あプロジェクト」のイメージ名は、
<none>
に変更されていた
↓「あプロジェクト」「いプロジェクト」を続けて立ち上げたときのコンテナ状況
結論
- イメージもコンテナも、後からビルドした「いプロジェクト」に乗っ取られた
- 同じプロジェクト名で、同じサービス名は一つしか作成できない
同じプロジェクト名・異なるサービス名の場合
今度は、同じプロジェクト名で、違うサービス名にしてみました。
↓あプロジェクトのフォルダ構成
↓いプロジェクトのフォルダ構成
あプロジェクト
# docker-compose.yml
version: "3"
services:
a-app: #サービス名をa-app
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3000:3000"
いプロジェクト
# docker-compose.yml
version: "3"
services:
i-app: #サービス名をi-app
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3002:3000"
docker compose up --build -d
で、あプロジェクトを立ち上げる
docker compose up --build -d
で、いプロジェクトを立ち上げる
ちゃんと立ち上がるけど、注意された
Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
time="2023-08-09T16:01:33+09:00" level=warning msg="Found orphan containers ([react-app-react-app-1]) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up."
- localhost:3000→「あプロジェクト」が表示された
- localhost:3002→「いプロジェクト」が表示された
イメージを見ると、ちゃんとそれぞれで、イメージが作成されていた
結論
- 同じプロジェクト名で、違うサービス名にすると、ちゃんと立ち上がる
- でも、同じプロジェクトとして認識されてしまい、関連のあるコンテナと思われてしまう
- 同じプロジェクト名にするのは、よくない!!!
ホスト側のポートが同じ場合
port: ホスト側のポート:コンテナ側のポート
です。
コンテナ側のポートは、同じでも全く問題ないです。
なぜなら、コンテナは独立しているためです。問題なのはホスト側のポートです。
あプロジェクト
# docker-compose.yml
version: "3"
services:
a-app:
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3000:3000" #同じ
いプロジェクト
# docker-compose.yml
version: "3"
services:
i-app:
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3000:3000" #同じ
docker compose up --build -d
で、あプロジェクト立ち上げ
docker compose up --build -d
で、いプロジェクト立ち上げ
エラーが出た。
Error response from daemon: driver failed programming external connectivity on endpoint react-app-i-app-1 (db68ac6f7ebfeacd3f3880f4e1afc03f88d2ba4f302e90d6391cc497aafb7fcf): Bind for 0.0.0.0:3000 failed: port is already allocated
「いプロジェクト」のビルドだけなら大丈夫だった。
つまり、どちらか一方のコンテナしか立ち上げない場合は、上手くいく
最終結論
- プロジェクト名は必ず変更する必要がある
- サービス名は同じでも大丈夫
- ホスト側のportは、変更を推奨
- コンテナ側のportは変更する必要はない
- Dockerfileは、全く同じで問題ない
再利用Dockerで変更するべき箇所まとめ
# docker-compose.yml
version: "3"
services:
react-app:
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3000:3000"
2回目以降作成する際は、
# docker-compose.yml
version: "3"
services:
react-app: #変更しなくて大丈夫!!!
build: .
volumes:
- ./:/usr/src/app
command: npm start
ports:
- "3002:3000" #"3002(こっちは被らないようにする):3000"