1. services: volumes:
services:
web:
build:
context: ./web
dockerfile: Dockerfile
depends_on:
- app
ports:
- "8080:80"
environment:
APP_SERVER: http://app:80
app:
build:
context: ./app
dockerfile: Dockerfile
depends_on:
- db
environment:
REDIS_HOST: db
REDIS_PORT: 6379
REDIS_DB: 0
db:
image: redis:5.0.6-alpine3.10
volumes:
- c5kvs_redis_volume:/data
volumes:
c5kvs_redis_volume:
driver: local
-
services:
→実行したいコンテナ単位の論理サービス群を定義する。キー名(web,app,dbなど)がサービス名=Compose 内 DNS 名になる。 -
volumes:
→名前付きボリュームの宣言セクション。ここで定義したボリュームを任意のサービスでマウントする。
補足:プロジェクト名(デフォルトは「Compose ファイルがあるディレクトリ名」)でネットワークやボリュームの実体名に接頭辞が付き、他プロジェクトと衝突しにくくなる(
-pやCOMPOSE_PROJECT_NAMEで上書き可能)。
2. services:web(フロント/プロキシ)
web:
build:
context: ./web
dockerfile: Dockerfile
depends_on:
- app
ports:
- "8080:80"
environment:
APP_SERVER: http://app:80
-
build:
→context:ビルドの基準ディレクトリ
→dockerfile:使用するDockerfileのファイル名を明示する。 -
depends_on:
→webをappより後に起動するように指定。 -
ports: "8080:80"
→ホスト:コンテナの順でポートを公開する。
→ローカルの8080に来た HTTP はコンテナの80に届く。 -
environment:
→コンテナ内の環境変数。例ではAPP_SERVER=http://app:80を注入し、サービス名appを DNS 名として参照する。Compose はデフォルトで単一ネットワークを作り、各サービスは互いをサービス名で解決できる。
補足:同一ネットワーク内での相互通信は expose の有無に関係なく可能。ホスト公開はportsのみ
3. services:app(Flask API)
app:
build:
context: ./app
dockerfile: Dockerfile
depends_on:
- db
environment:
REDIS_HOST: db
REDIS_PORT: 6379
REDIS_DB: 0
-
build:
→web:と同様。 -
depends_on: - db
→appをdb(Redis)より後に起動するように指定。 -
environment:
→コンテナ内の環境変数。例ではREDIS_HOST=dbのようにサービス名で接続する(db:6379)。Compose の同一ネットワーク内で自動解決される。
4. services:db(Redis)
db:
image: redis:5.0.6-alpine3.10
volumes:
- c5kvs_redis_volume:/data
-
image:
→公開イメージをタグ固定で使用する。 -
volumes:
→名前付きボリュームc5kvs_redis_volumeをコンテナの/dataにマウントする。
補足:redis:5.0.6-alpine3.10 は学習用としては問題ないが、実用では**現行のサポートタグ(例:redis:7-alpine)**などを使う方が安全