導入
第5章で学んだ docker compose に、この章までのボリューム・ネットワーク・環境変数を組み込みます。「Web + DB + キャッシュ」のような本番構成を、1枚のファイルにすべて宣言できる——これが compose の真価です。長い docker run を何行も打つ代わりに、構成そのものをコードとして残せます。
説明
本番に近い compose ファイルは、こんな姿になります(読み解いてみましょう)。
services:
web:
build: .
ports:
- "3000:3000"
environment: # ← 環境変数(第27)
- DB_HOST=db
- DB_PASSWORD=secret
depends_on: # ← db が立ち上がってから web を起動
- db
restart: always # ← 再起動ポリシー(第28)
db:
image: postgres:16
environment:
- POSTGRES_PASSWORD=secret
volumes: # ← 名前付きボリューム(第6章)
- dbdata:/var/lib/postgresql/data
volumes: # ← 使うボリュームの宣言
dbdata:
この1枚に、これまで学んだ要素がすべて入っています。
flowchart TD
F["docker-compose.yml(1枚)"] --> W["web: build・ports・env・restart"]
F --> D["db: image・env・volume"]
F --> V["volumes: dbdata(データ永続化)"]
W -->|"depends_on"| D
D --> V
compose の嬉しいところは、ネットワークを自動で用意し、全サービスをそこに繋いでくれること。だから第7章で学んだ「サービス名で通信」が、設定なしで最初から使えます。実際に起動して確かめましょう。
docker compose up -d
docker compose ps
起動時の出力に Network myapp_default Created と出ます。これが compose の作った専用ネットワークです。docker network ls にも現れます。
docker network ls
そして、web から他のサービスへサービス名で ping が通ります(第7章の埋め込み DNS が、compose では最初から効いている)。
docker exec myapp-web-1 ping cache
environment:… サービスに渡す環境変数(docker run -eに相当)。depends_on:… 起動の順番(dbの後にweb)。volumes:(サービス内)… ボリュームのマウント(docker run -vに相当)。トップレベルのvolumes:で使う保管庫を宣言。restart:… 再起動ポリシー(docker run --restartに相当)。
つまり compose は、この章までに手で打ってきた docker run の長いオプションを、まるごとファイルに宣言し直したもの。片付けも docker compose down の一発です(第5章)。
やってみよう
docker compose up -dを実行し、Network myapp_default Createdと各コンテナのStartedを確認しましょう。docker network lsでmyapp_defaultが増えていること、docker exec myapp-web-1 ping cacheでサービス名の通信が通ることを見てください。docker compose downで、コンテナもネットワークもまとめて片付きます。