DockerコンテナでのPostgreSQLの立ち上げを例にdocker-compose.ymlの書き方をまとめました。
この記事から得るもの
- docker-compose.ymlの基本的な書き方
前提知識
- dockerの基礎知識
- 何のためにdocker-compose.ymlが必要なのか知っていること
※この記事はdocker-compose.ymlの書き方を説明したものであり、docker-compose.ymlの役割や必要性については言及していません。
最終的な成果物
この記事を最後まで読むと、以下のdocker-compose.ymlを自分で理解しながら書けるようになります。
version: '3'
services:
db:
image: postgres:15-alpine
container_name: postgres-db-qiita
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
ports:
- "55001:5432"
volumes:
- ./data:/var/lib/postgresql/data
- ./init:/docker-entrypoint-initdb.d
"version"とは
version: '3'
docker-compose.ymlのバージョンを指定します。
※公式ドキュメントでは記述不要とありますが、実際のプロジェクトではversion指定している場合が多くあるので今回は説明のために記述しています。
"services"の中に書くもの
services:
<サービス名1>:
image: 使用するコンテナイメージ名
container_name: コンテナ名
environment:
コンテナで使用する環境変数
ports:
- localhostのポート番号:コンテナのポート番号
volumes:
- ホストOS内のパス:コンテナ内のパス
<サービス名2>:
...
...
servicesの中には起動するサービス群を記述します。サービス名の中にネストして詳細を記述していきます。
image
services:
db:
image: postgres:15-alpine
imageには使用するコンテナイメージ名を記述します。今回はpostgres:15-alpineを使用します。
コンテナイメージはdocker hubから探すことができます。
container_name
version: '3'
services:
db:
image: postgres:15-alpine
container_name: postgres-db-qiita
container_nameにはコンテナ名を記述します。
コンテナ名は自由に決めることができますが、何のコンテナかわかりやすい名前にしましょう。
記述していない場合は自動で名前が設定されます。
environment
services:
db:
image: postgres:15-alpine
container_name: postgres-db-qiita
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
environmentはコンテナ内で使用する環境変数を記述します。今回はPostgreSQLのユーザ名とパスワードを設定しています。
POSTGRES_USERやPOSTGRES_PASSWORDはコンテナイメージによって決まった環境変数ですが、独自の環境変数を設定することもできます。
ports
version: '3'
services:
db:
image: postgres:15-alpine
container_name: postgres-db-qiita
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
ports:
- "55001:5432"
portsではlocalhostで使用するポート番号(:の左側)とコンテナのポート番号(:の右側)を紐付けることができます。
PostgreSQLの場合はポート番号がデフォルトで5432になっています。localhostから接続するポート番号を指定したい場合に自分でポート番号を設定します。
volume
services:
db:
image: postgres:15-alpine
container_name: postgres-db-qiita
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
ports:
- "55501:5432"
volumes:
- ./data:/var/lib/postgresql/data
- ./init:/docker-entrypoint-initdb.d
volumesはホストOSのパス(:の左側)とコンテナ内のパス(:の右側
)で同期をとりたい場合に記述します。ボリュームやバインドマウントといいます。
PostgreSQLの場合データの永続化のためなどに使用することがあります。