docker-compose.ymlについて一緒に学ぼう
Kyonと申します。
現在、ECサイトを管理している会社で業務しています。使用言語はPHP・Laravelです。
経歴を話すと、元々は高専の建築学科を卒業後、インフラ系企業で2D設計や構造計算・現場監督、その後、自動車企業で走行テスト・2D・3D設計に従事しており、今までITはほぼ未経験です。
ずっとvibe cording(AIプログラミング)できてしまい、中身をしっかりと読み込む機会がありませんでした。そのため、CursorでECサイトの構築を行いながら、構成ファイルの分析も行っています。
この記事はGPTも使用していますが、しっかりと内容は確認し、構築ファイルを7割以上は理解できていると自負しています。(10割理解しようとするのは勉強の対パが悪いと思っています...)
一緒に勉強していけば、ECサイトの全体像が見えてくると思うので、よければ頑張りましょう。
2025/05/19 追記
Compose ファイル名の最新推奨
-
推奨:
compose.yaml
-
仕様に含まれる:
compose.yml
-
後方互換:
docker-compose.yaml
,docker-compose.yml
ポイント:
docker compose
(v2+) コマンドを使う場合はcompose.yaml
を置けば自動検出してくれます。
version
トップレベル要素は廃止
Compose Spec ではトップレベルの version
キーは obsolete (廃止) となりました。書くと docker compose
実行時に警告が出ます。
✔️ 推奨される冒頭例
services:
# ここに各サービスを記述
❌ 旧来の例(警告が出る)
version: '3.8' # ← もう不要
services:
# ...
既存の環境で
docker-compose
(v1) を使っている場合はまだ動きますが、今後はdocker compose
(v2) へ移行し、version
行を削除することを推奨します。
以下の記事本文は、学習用に旧来の記述を残したまま解説していますが、実運用では上記追記を踏まえてファイル名と version
行を調整してください。
Dockerとは?
Dockerとは、アプリを「コンテナ」と呼ばれる箱に入れて動かす仕組みです。
-
従来の方法
プログラムを動かすには、自分のパソコンに色々なソフトウェア(PHPやMySQLなど)を入れます。
→ 環境構築が複雑で、エラーが起きやすい。 -
Dockerを使うと?
コンテナという「箱」の中に必要なソフトウェアや設定をまとめて入れ、それごと動かします。
→ 簡単に環境構築ができ、エラーが起きにくい。
例えると:
-
従来
自炊するためにキッチンを一から準備する。 -
Docker
「レンジでチンすればOKな弁当」を買ってくるイメージ。
コンテナとは?
コンテナとは「プログラムを動かすために必要な環境をまるごと閉じ込めた箱」です。
具体例:
- PHPが動く箱(コンテナ)
- MySQLが動く箱(コンテナ)
Dockerを使うことで、これらの箱を自由に組み合わせたり、簡単に作ったり壊したりできます。
Dockerのメリット
- どんな環境でも同じ動作(自分のパソコンでも、本番サーバーでも)
- 環境構築が簡単(コマンド一つで完了)
- 環境の管理が楽(複数のアプリを別々の箱で動かせる)
Docker関連の用語整理(簡単版)
用語 | 意味 |
---|---|
イメージ | コンテナを作るための「設計図」。レシピのようなもの。 |
コンテナ | 実際に動いている箱(イメージをもとに作られる) |
Dockerfile | イメージを作るための手順書(レシピそのもの) |
Docker Compose | 複数のコンテナを一度に管理できるツール |
docker-compose.ymlについて
複数のDockerコンテナをまとめて起動・管理するために使用されます。
今回はLaravel(PHPフレームワーク)を使ったECサイトを構築するために、以下の3つのコンテナを使っています。
- appコンテナ (PHP/Laravelアプリ本体)
- webコンテナ (Nginxサーバー)
- dbコンテナ (MySQLデータベース)
それぞれの役割を整理すると:
コンテナ名 | 役割 |
---|---|
app | Laravelアプリのコード実行 (PHP処理) |
web | Webブラウザとの通信 (HTTPサーバー) |
db | データの保存・管理 (MySQLデータベース) |
ファイルの行ごとの解説
最初の行(※2025/05/19追記:現在は省略推奨)
# version: '3.8' # ← 旧来はここでComposeファイルのバージョンを指定していました
- 以前は
3.x
系を指定して新しい書式や機能を使っていましたが、2025年現在は トップレベルversion
キーは不要 です。 -
docker compose
v2 以降では書かなくても自動判定されるため、行ごと削除するのが推奨です。
servicesセクション(実行する各コンテナを定義)
services:
ここから実際に立ち上げるDockerコンテナを指定します。
appコンテナ (PHPアプリケーション)
app:
app
という名前のコンテナを作成する指定です。Laravelアプリ本体を動かします。
build:
context: .
dockerfile: docker/php/Dockerfile
-
build
: Dockerfileからイメージをビルド(作成)します。 -
context
: Dockerfileを探す基準となるフォルダを指定します。.
は現在のフォルダを指します。 -
dockerfile
: 実際のDockerfileがある場所を指定します。(今回はdocker/php/Dockerfile
です)
volumes:
- ./src:/var/www/html
-
volumes
: ローカル(あなたのPC)のフォルダとコンテナ内のフォルダを同期します。 -
./src:/var/www/html
とは、あなたのPCのsrc
フォルダが、コンテナ内の/var/www/html
という場所に繋がります。 - これにより、ローカルでソースコードを編集すると即座に反映されます。
depends_on:
- db
-
depends_on
: appコンテナがdbコンテナに依存しているという意味です。 - dbコンテナを先に起動してからappコンテナを立ち上げます。
networks:
- laravel-network
-
networks
: ネットワークを指定します。コンテナ同士が通信するために同じネットワークに入ります。
webコンテナ(Nginxウェブサーバー)
web:
- webサーバー用のコンテナを作ります。Webブラウザからの通信を受け付けます。
image: nginx:alpine
- Nginxの軽量版(alpine)イメージをDocker Hubから直接ダウンロードして使います。
ports:
- "8080:80"
- コンテナの80番ポートをあなたのPC(ホスト)の8080番ポートとつなげます。
- ブラウザから
http://localhost:8080
にアクセスすると、このNginxコンテナに接続できます。
volumes:
- ./src:/var/www/html
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- NginxもPHPコードを見る必要があるため、
./src
を共有します。 - Nginxの設定ファイルもローカルから指定します(
default.conf
という設定ファイルを共有)。
depends_on:
- app
- Nginxはappコンテナ(Laravelアプリ)に依存します。Laravelが起動してからNginxを起動します。
networks:
- laravel-network
- 同じネットワークで通信できるように指定しています。
dbコンテナ(MySQLデータベース)
db:
- データベース用のコンテナを作ります。
image: mysql:8.0
- MySQLバージョン8.0の公式イメージを使います。
environment:
MYSQL_DATABASE: laravel_ec
MYSQL_USER: laravel_user
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
- MySQLの環境変数を設定し、データベース名、ユーザー名、パスワードを指定します。
- LaravelからMySQLに接続する時に必要な情報です。
項目 | 의미 |
---|---|
MYSQL_DATABASE | 作成するデータベースの名前 |
MYSQL_USER | Laravelから接続するユーザー名 |
MYSQL_PASSWORD | Laravelの接続ユーザーのパスワード |
MYSQL_ROOT_PASSWORD | MySQL管理者(root)のパスワード |
ports:
- "3306:3306"
- コンテナの3306(MySQLデフォルト)ポートをホストの3306ポートにつなげます。
- PCのMySQL管理ツールなどから接続できます。
volumes:
- mysql-data:/var/lib/mysql
- MySQLのデータをDockerが管理する場所(ボリューム)に保存します。
- コンテナを停止・再起動してもデータが消えません。
networks:
- laravel-network
- 他のコンテナと通信するために同じネットワークを使います。
ネットワークの設定
networks:
laravel-network:
driver: bridge
- コンテナ間通信のためのネットワークを定義しています。
- Dockerのデフォルトのネットワーク形式(bridge)を使っています。
ボリュームの設定
volumes:
mysql-data:
- MySQLデータベースの保存用のボリュームを定義します。
- Dockerが自動的に場所を作って管理します。
コンテナの起動方法(参考)
docker compose up -d
- Docker Composeで各コンテナをバックグラウンドで起動します。
- ファイルを変更したら再度実行すると、変更内容が適用されます。
停止する場合は:
docker compose down
これでLaravelアプリのためのDocker環境構築が完了です。
後に他のファイルも解説予定です。
Discussion