Kyonと申します。
現在、ECサイトを管理している会社で業務しています。使用言語はPHP・Laravelです。
経歴を話すと、元々は高専の建築学科を卒業後、インフラ系企業で2D設計や構造計算・現場監督、その後、自動車企業で走行テスト・2D・3D設計に従事しており、今までITはほぼ未経験です。
ずっとvibe cording(AIプログラミング)できてしまい、中身をしっかりと読み込む機会がありませんでした。そのため、CursorでECサイトの構築を行いながら、構成ファイルの分析も行っています。
この記事はGPTも使用していますが、しっかりと内容は確認し、構築ファイルを7割以上は理解できていると自負しています。(10割理解しようとするのは勉強の対パが悪いと思っています...)
一緒に勉強していけば、ECサイトの全体像が見えてくると思うので、よければ頑張りましょう。
今回はDockerの中でも重要になる、docker-compose.ymlの解説を行います。
その前に軽くDockerについても触れていきましょう。
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データベース) |
ファイルの行ごとの解説
最初の行
version: '3.8'
Docker Composeファイルのバージョンを指定しています。
通常、3.x
系がよく使われます。新しい書式や機能を使えるようになります。
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環境構築が完了です。
後に他のファイルも解説予定です。