はじめに
前回、「Dockerを何となく使っていたので改めて仕組みを調べてみた」という記事を書きました。
Dockerfile・Image・Containerの関係を整理したことで、Dockerそのものへの理解は以前より深まりました。
ただ、もう一つ気になったものがあります。
それが docker-compose.yml というものです。
普段は用意されているファイルをそのまま使うことが多く、
- services:
- ports:
- volumes:
- environment:
などの項目も、「何となく動いているから」という理由で深く理解していませんでした。
そこで今回は、普段よく目にする docker-compose.yml の項目について、自分なりに整理してみ用と思います。
docker-compose.ymlとは
前提として、docker-compose.yml は、複数のコンテナをまとめて管理するための設定ファイルです。
例えば Web アプリケーションを動かす場合、
- PHP
- Nginx
- MySQL
など、複数のコンテナが必要になります。
それらを一つずつ起動するのではなく、
docker compose up -d
だけでまとめて起動できるようにしてくれるのが docker-compose.yml の役割です。
services
最も重要な項目になります。
services:
- php:
- nginx:
- mysql:
services の中には、起動したいコンテナを定義します。
例えば、「php」「nginx」「mysql」の3つを書けば、3つのコンテナが起動します。
サービス名は自由に付けられますが、後述する depends_on や networks などでも利用されます。
image
既に存在するDockerイメージを利用する場合に指定します。
image: mysql:8.0
この例では、Docker Hub に公開されている MySQL 8.0 のイメージを利用してみました。
自分でDockerfileを書く必要がない場合は image を利用することが多いようです。
build
自分で用意した Dockerfile を使ってイメージを作成する場合はこちらです。
build: .
または
build:
context: .
dockerfile: Dockerfile
などと記述します。
前回の記事で整理した
Dockerfile
↓
Image
↓
Container
の最初の部分を担っているのが build になります。
ports
コンテナとPC(ホスト)の通信を行うための設定です。
ports:
- "8080:80"
これは、「ホスト側:8080番 コンテナ側:80番」を接続するという意味になります。
つまり「http://localhost:8080」 へアクセスすると、コンテナ内の80番ポートへ通信されます。
最初は数字が2つ並んでいて混乱しましたが、「ホスト : コンテナ」と覚えると分かりやすいです。
volumes
データを永続化するための設定です。
例えば、
volumes:
- .:/var/www/html
と書くと、
PC上のカレントディレクトリと、コンテナ内の /var/www/html が同期されます。
そのため、エディタでコードを保存すると、コンテナ側にもすぐ反映されます。
また、MySQLのデータなどもVolumeに保存することで、コンテナを削除してもデータを保持できます。
environment
環境変数を設定します。
environment:
MYSQL_ROOT_PASSWORD: root
この例では、MySQLのrootユーザーのパスワードを設定しています。
Laravelなどでも .env を利用しますが、こちらはコンテナに渡す環境変数という違いがあります。
depends_on
コンテナの起動順を指定します。
depends_on:
- mysql
この設定をすると、PHPコンテナより先にMySQLコンテナを起動してくれます。
ただし、「起動完了」まで保証するわけではないという点は注意が必要です。
restart
コンテナ終了時の動作を指定します。
restart: always
代表的な設定は、
no
always
unless-stopped
on-failure
などがあります。
開発環境ではあまり意識しませんが、本番環境では利用されることも多い設定です。
今回調べてみて分かったこと
今回調べてみて、docker-compose.yml は単なる設定ファイルではなく、
- どのコンテナを起動するか
- どのイメージを使うか
- ポートをどう公開するか
- データをどこへ保存するか
などをまとめて管理する、とても重要な役割を持っていることが分かりました。
今までは何となくコピペして使っていましたが、一つ一つ意味を理解すると設定ファイルも読みやすくなりますね。
まとめ
今回は docker-compose.yml の中でも、よく見かける項目を中心に整理してみました。
- services
- image
- build
- ports
- volumes
- environment
- depends_on
- restart
もちろん、まだ紹介しきれていない項目もありますが、普段の開発で触れる内容はかなり理解できたと思っています。
また次回で Dockerfile に書かれている命令(FROM・RUN・COPY・CMD など)についても、一つずつ整理してみたいなと思います。
今回の記事が、同じように「何となくdocker-compose.ymlを書いている」という方の参考になれば幸いです。
ありがとうございました。