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について一緒に学ぼう

Posted at

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

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?