💡

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