こんにちは、おくやんです。
このブログでは、開発に役立つノウハウを実践的なコード例と共に紹介しています。
書かれている内容をいまいち理解していない。。。
設定を変えたいときにどのように変更していいかわからない。。。
今回は、このようなお悩みを解決します。
本記事の内容
今回はdocker-compose.ymlの書き方についてまとめました。
docker-compose.ymlの内容はなんとなく理解しているけど・・・という方は多いと思います。実際の設定例を見ながら解説していきますので理解を深めていきましょう。
docker-compose.ymlの中身を見てみよう
今回は下記の設定例をもとに解説を行っていきます。
docker-compose.yml
# ① バージョン設定
version: '3.8'
# ② サービス設定
services:
db:
image: postgres:14.4-alpine3.16
environment:
- TZ=Asia/Tokyo
volumes:
- db-data:/var/lib/postgresql/data
ports:
- 15432:5432
env_file:
- .env-dev
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
environment:
STAGE: local
DOMAINS: "${HTTPS_PORTAL_HOST} -> http://web:3000"
depends_on:
- web
web:
build:
context: .
target: development
environment:
- TZ=Asia/Tokyo
- BUNDLE_APP_CONFIG=/app/.bundle
env_file:
- .env-dev
ports:
- 3000:3000
volumes:
- .:/app
- bundle-data:/usr/local/bundle
command: bash -c "rm -f tmp/pids/server.pid && bin/dev"
stdin_open: true
tty: true
depends_on:
- db
# ③ ボリューム設定
volumes:
db-data:
driver: local
bundle-data:
driver: local
早速設定の内容を見ていきます。
① バージョン設定(version)
version: 3.8
versionはComposeファイルの文法バージョンを定義します。
ComposeファイルのバージョンとDockerバージョンのサポート状況に関してはCompose ファイル version 3 リファレンスを参照ください。
今回はバージョン 3.8を利用します。
② サービス設定(services)
services:
db:
・・・
https-portal:
・・・
web:
・・・
servicesは実行するサービス(コンテナ)の定義を記載していきます。サービスは複数定義でき、サービス名は任意に指定可能です。
今回はDBサーバ(db)、Webサーバ(https-portal)、APサーバ(web)の3つを定義しています。
続いてサービス設定の中身を見ていきましょう。
image
services:
db:
image: postgres:14.4-alpine3.16
・・・
https-portal:
image: steveltn/https-portal:1
・・・
imageでは起動するDockerイメージを指定します。Dockerイメージをもとに各コンテナが生成されます。
DockerイメージはDocker Hubで取得することができるため、サイトから必要なイメージを探して利用しましょう。
設定例ではDBサーバにpostgres:14.4-alpine3.16のイメージを、Webサーバにsteveltn/https-portal:1のイメージを指定しています。
build
web:
build:
context: .
target: development
buildではDockerfileをもとに作成した、独自のDockerイメージを利用します。
imageの記述しない場合はbuildの記述が必要です。
context
contextではDockerfileを含むフォルダパスか、GitリポジトリのURLが指定可能です。
相対パスで指定する場合はComposeファイルからの相対パスを指定します。
設定例ではカレントフォルダにあるDockerfileをもとにbuildが実行されます。
target
targetはマルチステージビルドを利用する場合に利用します。
ビルドするステージ名を選択したい場合は、targetで指定可能です。
設定例ではbuildステージをdevelopmentに指定しています。
dockerfile
dockerfileでは使用するDockerfileを指定できます。
省略された場合は、contextで指定したフォルダ配下の「Dockerfile」が読み込まれまれる仕様です。
設定例では省略しており、contextで指定した「.」配下のDockerfileが読み込まれます。
volumes
services:
db:
・・・
volumes:
- db-data:/var/lib/postgresql/data
・・・
web:
・・・
volumes:
- .:/app
volumesでは下記の指定が可能です。
volumesの種類
・ホスト側のフォルダをマウント
名前付きボリューム割り当て
volumes:
- db-data:/var/lib/postgresql/data
名前付きボリュームをコンテナ上のフォルダに割り当てます。名前付きボリュームの割り当て定義は下記フォーマットで記述します。
[volume名]:[コンテナの絶対パス]
記述例ではコンテナ上の/var/lib/postgresql/dataに名前付きボリュームdb-dataを割り当ています。
ホスト側のフォルダをマウント
volumes:
- .:/app
ホスト側のフォルダをコンテナ上のフォルダにマウントします。記述フォーマットは下記です。
[ホストのパス]:[コンテナの絶対パス]
ホスト側のパスを相対パスで指定する場合は、Composeファイルからのパスを指定します。
ports
ports:
- 15432:5432
portsはホスト側のポートとコンテナ側のポートの紐づけを行います。
設定例はホスト側の15432ポートにアクセスすると、コンテナ側の5432につないでくれる設定です。
environment
environment:
- TZ=Asia/Tokyo
environmentはコンテナ内で利用する環境変数の定義です。
DBサーバ用のコンテナでは環境変数TZを定義することで、コンテナ内のタイムゾーンをAsia/Tokyoに設定しています。
env_file
env_file:
- .env-dev
env_fileは外部に定義した環境変数ファイルを指定します。
下記フォーマットで定義されている設定を読み込むことができます。
[Key]=[Value]
複数のコンテナで共通で利用したい環境変数や環境ごとに値を変更した場合に、設定をファイルに書き出しておくと便利です。
depends_on
depends_on:
- web
depends_onはコンテナの起動順や停止順を制御する際に利用します。
設定例はDBサーバ→APサーバ→Webサーバの順に立ち上がり、Webサーバ→APサーバ→DBサーバの順で停止する設定です。
command
command: bash -c ""rm -f tmp/pids/server.pid && bin/dev""
commandではコンテナ起動時に実行するコマンドを指定します。
設定例ではrailsアプリケーションを立ち上げるためのコマンドを実行しています。
stdin_open
stdin_open: true
stdin_openはコンテナとホストの標準入力をつなぐ設定です。
trueを設定することでホストの入力がコンテナに送られるようになります。
tty
tty: true
ttyはコンテナに疑似TTYを割り当てる設定を行います。
trueに設定することで、コンテナを起動したままにすることが可能です。
③ ボリューム設定(volumes)
volumes:
db-data:
driver: local
bundle-data:
driver: local
ボリューム設定では名前付きボリュームの定義に関する記述をします。定義を追加することで、名前付きボリュームが作成されます。
今回はdb-dataとbundle-dataという名前のボリュームを作成しています。名前は任意に指定可能です。
driverにlocalを指定すると、PC上にデータが保存されます。
WSL2を利用している場合は\\wsl$\docker-desktop-data\data\docker\volumesに保存されます。
まとめ: docker-compose.ymlの書き方
今回はdocker-compose.ymlの書き方について調べた内容をまとめてみました。
各項目の役割はこちらです。
docker-compose.ymlの項目
① | version | Composeファイルの文法バージョンを定義 |
② | services | 実行するサービス(コンテナ)の定義 |
②-1 | image | 起動するDockerイメージを指定 |
②-2 | build | Dockerfileに記述した内容をもとに、独自のDockerイメージを作成し利用する場合に指定 |
②-2-1 | context | Dockerifleを含むフォルダパスか、GitリポジトリのURLを定義 |
②-2-2 | target | マルチステージビルドを利用する場合にbuildステージを指定 |
②-2-3 | dockerfile | 使用するDockerfile名を指定 |
②-3 | volumes | 下記を利用する場合に指定 ・名前付きボリューム割り当て ・ホスト側のフォルダをマウント |
②-4 | ports | ホスト側のポートとコンテナ側のポートの紐づけを定義 |
②-5 | environment | コンテナ内で利用する環境変数を定義 |
②-6 | env_file | 外部に定義した環境変数ファイルを指定 |
②-7 | depends_on | コンテナの起動順や停止順を制御する際に指定 |
②-8 | command | コンテナ起動時に実行するコマンドを指定 |
②-9 | stdin_open | コンテナとホストの標準入力をつなぐ設定を指定 |
②-10 | tty | 疑似TTYを割り当てる設定を指定 |
③ | volumes | 名前付きボリュームに関する定義 |
docker-compose.ymlを作成する際は参考にしてみてください。
最後まで読んでいただき、ありがとうございます。