0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

docker-compose.ymlについて一緒に学ぼう

Last updated at Posted at 2025-05-06

Kyonと申します。

現在、ECサイトを管理している会社で業務しています。使用言語はPHP・Laravelです。 
経歴を話すと、元々は高専の建築学科を卒業後、インフラ系企業で2D設計や構造計算・現場監督、その後、自動車企業で走行テスト・2D・3D設計に従事しており、今までITはほぼ未経験です。

ずっとvibe cording(AIプログラミング)できてしまい、中身をしっかりと読み込む機会がありませんでした。そのため、CursorでECサイトの構築を行いながら、構成ファイルの分析も行っています。
この記事はGPTも使用していますが、しっかりと内容を確認し、学びがある記事にするように心がけています。
一緒に勉強していけば、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 (廃止) となりました。

✔️ 推奨される冒頭例

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環境構築が完了です。 
後に他のファイルも解説予定です。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?