🐷

公式イメージでLaravelを動かすDocker環境構築

に公開

☕ はじめに

UbuntuベースDocker構築記事 を書いたら、

次は "公式イメージ" だけで動かすDocker構築も体験したい

と思いました。

この記事は、Laravelを「公式Dockerイメージだけ」で動かす構成方法を解説します!

🔰 そもそも「公式イメージ」とは?

Dockerでは、コンテナを作るために「イメージ」という設計図のようなものを使います。
この設計図(イメージ)は、自分でゼロから作ることもできるし、すでに用意されたテンプレートを使うこともできます🔥

公式イメージとは、Docker Hub というプラットフォームで提供されている、信頼性の高いテンプレートのことです。例えば、以下のようなものがあります👇

  • APサーバー(PHP-FPM)なら → php:8.3-fpm

  • Webサーバー(nginx)なら → nginx:1.29

誰でも無料で使うことができ、環境構築の手間を大幅に減らせます

🔍 Ubuntuベースと公式イメージの違い

項目 Ubuntuベース 公式イメージ
作成自由度 高い (すべて自分で入れる) Composer等は自分で入れる
学び システム理解に最適 使いこなせると生産性高い
設定量 多い 少なめ
速度 遅め 早い

🚀 ゴール

Laravelを公式イメージのDocker構成だけで簡潔に動かす

  • nginx (web)
  • php-fpm (app)
  • mysql (db)

📂 ディレクトリ構成

laravel-app/
├── docker/
│   ├── app/
│   │   └— Dockerfile
│   └— web/
│       └— default.conf
├── docker-compose.yml
└— src/  (実際のLaravelプロジェクト)
  • DockerfileはAPサーバーのみ作成する。
    (公式イメージにはLaravelに必要な拡張が含まれていないため、Dockerfileで別途インストールをする)
  • それ以外は公式イメージをymlファイルに書いて指定する。

⚙️ docker-compose.yml

設定の意味を詳しく知りたい方はUbuntuベースDocker構築記事 をご覧ください🙇‍♀️

services:
  app:
    build:
      context: ./docker/app
      dockerfile: Dockerfile
    volumes:
      - ./src:/var/www/html
    working_dir: /var/www/html

  web:
    image: nginx:1.29.0-alpine # 公式イメージを指定
    ports:
      - "8080:80"
    volumes:
      - ./src/public:/var/www/html/public:ro
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on:
      - app

  db:
    image: mysql:8.0 # 公式イメージを指定
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: laravel_db

volumes:
  db-data:

💡 image: を指定したらどうなるのか
Dockerは以下の動きを自動でやってくれます ✅
① Docker Hub からイメージを pull
② それをもとにコンテナを作成・起動

💡 どの公式イメージを使ったらいいか?
Docker Hubから環境に合ったものを選びましょう👇
nginx
php-fpm
mysql

📁 Dockerfile (php-fpm)

# 公式イメージを指定
FROM php:8.3-fpm-bullseye

RUN apt-get update && \
  apt-get -y install --no-install-recommends git unzip libzip-dev libicu-dev libonig-dev && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  docker-php-ext-install intl pdo_mysql zip bcmath

WORKDIR /var/www/html

COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer

CMD ["php-fpm", "-F"]

📁 nginxの設定ファイル

docker/web/default.conf

server {
    listen 80;
    server_name localhost;
    index index.php index.html;
    root /var/www/html/public;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass app:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/html/public$fastcgi_script_name;
    }
}

🛎 Laravelプロジェクトを作成

composer create-project laravel/laravel ./src

src ディレクトリを作成し、そこに Laravel アプリケーションを展開する。

イメージ作成とコンテナの起動

docker compose up -d --build

Laravel の welcome 画面が localhost:8080 に表示されたら成功!

.envの設定

# DBの設定
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=password

*DB_HOST=db の db は、docker-compose.yml に書いたサービス名を指します。
これにより、コンテナ間で「名前解決」ができるようになっています。

マイグレーションでmysqlの確認

## appコンテナの中に入る
docker compose exec app bash

# appコンテナの中で
php artisan migrate

📈 まとめ

やはり、公式イメージを使うとサクサク環境構築できて便利ですね🌟

Dockerは最初こそ難しく感じますが、テンプレートをうまく活用すれば、一気に効率が上がります。

他の言語やフレームワークにも応用できるので、ぜひいろいろ試してみてください☺️

参考記事

https://zenn.dev/idapan/articles/bd2a5ecfae255d

Discussion