Docker Laravel · 3 min read · Nov 25, 2025

Ubuntu 18.04 LTSでNginx MySQLとDocker Composeを使用してLaravelをDocker化する

Laravelは、MVC(Model-View-Controller)デザインパターンを実装した無料のオープンソースPHPフレームワークです。使いやすさを考慮して設計されており、開発者が短時間でシンプルなアプリケーションから複雑なアプリケーションまで作成できるようにします。Laravelは2011年にテイラー・オトウェルによって作成され、CodeIgniter(CI)フレームワークの高度な代替手段を提供する試みとして誕生しました。2011年にLaravelはバージョン1とバージョン2をリリースし、最新のバージョン5.6では、’artisan’と呼ばれるコマンドライン(CLI)サポート、異なるデータベースシステムのサポート、ルートの改善など、より多くの機能が追加されています。

このガイドでは、Ubuntu Server 18.04上でDocker Composeを使用して、PHP-FPM、MySQLデータベース、Nginxウェブサーバーを使用してLaravelプロジェクトをDocker化する方法を示します。Laravelプロジェクトの新しいDockerイメージを作成し、App/Laravel自体、Nginxウェブサーバー、MySQLデータベースなどのサービスを含むdocker-compose.ymlスクリプトを作成します。

前提条件

  • Ubuntu 18.04
  • ルート権限

私たちが行うこと:

  1. DockerとDocker Composeをインストールする
  2. Laravelをダウンロードし、依存関係をインストールする
  3. LaravelプロジェクトをDocker化する - Laravelアプリサービスを定義する
  • Nginx HTTPサービスを定義する
  • MySQLデータベースサービスを定義する
  • Laravel用のNginx仮想ホストを作成する
  • Laravelアプリ用のDockerfileを作成する
  1. Laravelプロジェクトをビルドする
  2. Laravelのポストインストール

ステップ1 - DockerとDocker Composeをインストールする

まず、UbuntuシステムにDockerとDocker Composeパッケージをインストールします。公式のUbuntuリポジトリからDockerパッケージを使用します。

さらに進む前に、Ubuntuシステムのリポジトリを更新する必要があります。以下のコマンドを実行するだけです。

sudo apt update

次に、以下のaptコマンドを使用してDockerとDocker Composeパッケージをインストールします。

sudo apt install docker.io -y  
sudo apt install docker-compose -y

DockerとDocker Composeパッケージがシステムにインストールされているはずです。以下のコマンドを使用して確認します。

docker version  
docker-compose version

その結果、システム上のDockerとDocker Composeのバージョンが表示されます。

Dockerのバージョンを確認

次に、非ルートユーザーにDockerグループを割り当てて、非ルートユーザーがDockerコンテナを実行できるようにする必要があります。

この場合、以下のコマンドを実行して、’hakase’というユーザーをdockerグループに追加します。

usermod -a -G docker hakase

その後、’hakase’ユーザーシェルにログインし、dockerの’hello-world’コマンドを実行します。

su - hakase  
docker run hello-world

これで、Dockerからの’Hello World’メッセージが表示され、Dockerのインストールが完了しました。

Dockerユーザーを追加

ステップ2 - Laravelをダウンロードし、依存関係をインストールする

このステップでは、’hakase’ホームディレクトリにLaravelウェブフレームワークをダウンロードし、PHP ‘composer’ Dockerイメージを使用してLaravelの依存関係をインストールします。したがって、非ルートユーザーとしてサーバーにログインしていることを確認してください。

‘myapp’ディレクトリにLaravelプロジェクトをダウンロードし、その中に移動します。

git clone https://github.com/laravel/laravel.git myapp/  
cd myapp/

次に、Laravelの依存関係をインストールするために以下のdockerコマンドを実行します。

docker run --rm -v $(pwd):/app composer install

上記のコマンドで、新しい一時的なdockerコンテナを実行し、’myapp’プロジェクトディレクトリをコンテナ内の’/app’ディレクトリにマウントします。コンテナは’composer’ Dockerイメージに基づいており、その一時的なコンテナ内で’composer’コマンドを使用してLaravelの依存関係をインストールしています。

Laravelフレームワークを取得

Laravelの依存関係のインストールが完了したら、以下のsudoコマンドを使用して’myapp’ディレクトリの所有者を自分のユーザーに変更する必要があります。

sudo chown -R $USER:$USER ~/myapp

アプリディレクトリの所有者を変更

ステップ3 - LaravelプロジェクトをDocker化する

Laravelをダウンロードし、その依存関係をインストールした後、新しいdocker-compose.ymlスクリプトを作成し、Laravelプロジェクト用の新しいDockerfileを作成します。

cd myapp/  
vim docker-compose.yml

- Laravelアプリサービスを定義する

まず、Laravelプロジェクト自体を定義し、Dockerfileを使用してLaravelプロジェクトのdockerイメージをビルドします。

docker composeスクリプトを貼り付けます。

version: '3'  
services:  
  
  #Laravelアプリ  
  app:  
    build:  
      context: .  
      dockerfile: Dockerfile  
    image: hakase-labs/laravel  
    container_name: app  
    restart: unless-stopped  
    tty: true  
    environment:  
      SERVICE_NAME: app  
      SERVICE_TAGS: dev  
    working_dir: /var/www/html  
    volumes:  
      - ./:/var/www/html  
    networks:  
      - mynet

Laravelコンテナサービスの詳細:

  • Laravelコンテナサービスは’app’という名前になります。これは、私たちの’Dockerfile’で作成されるカスタムdockerイメージに基づいており、新しいイメージは’hakase-labs/laravel’という名前になります。
  • ‘myapp’プロジェクトディレクトリをコンテナサービス内の’/var/www/html’にマウントします。
  • 私たちのセットアップのためにカスタムdockerネットワークを使用し、そのネットワークは’mynet’という名前になります。

- Nginx HTTPサービスを定義する

次に、nginxコンテナサービスを定義します。

‘app’コンテナサービスの行の後に以下の設定を貼り付けます。

  #Nginxサービス  
  nginx:  
    image: nginx:alpine  
    container_name: nginx  
    restart: unless-stopped  
    tty: true  
    ports:  
      - "80:80"  
      - "443:443"  
    volumes:  
      - ./:/var/www/html  
      - ./nginx/conf.d/:/etc/nginx/conf.d/  
      - ./nginx/ssl/:/etc/nginx/ssl/  
    networks:  
      - mynet

nginxコンテナサービスの設定詳細:

  • ‘nginx:alpine’ Dockerイメージに基づいて、’nginx’という名前の新しいコンテナを作成します。
  • コンテナサービスはHTTPおよびHTTPSポートを開きます。
  • コンテナは3つの異なるボリュームをマウントします。’myapp’プロジェクトディレクトリを’/var/www/html’ディレクトリに、nginx仮想ホスト設定’nginx/conf.d/‘を’/etc/nginx/conf.d’ディレクトリに、証明書ファイル’nginx/ssl/‘をコンテナ内の’/etc/nginx/ssl’ディレクトリにマウントします。
  • コンテナサービスは’mynet’という同じネットワークを使用します。

- MySQLデータベースサービスを定義する

最後に、MySQLデータベースサービスを定義します。

‘nginx’コンテナサービスの行の後に以下の設定を貼り付けます。

  #MySQLサービス  
  db:  
    image: mysql:5.7  
    container_name: db  
    restart: unless-stopped  
    tty: true  
    ports:  
      - "3306:3306"  
    environment:  
      MYSQL_DATABASE: laraveldb  
      MYSQL_USER: laravel  
      MYSQL_PASSWORD: laravelpassworddb  
      MYSQL_ROOT_PASSWORD: rootpasswordmysql  
    volumes:  
      - mysqldata:/var/lib/mysql/  
    networks:  
      - mynet  
  
#Dockerネットワーク  
networks:  
  mynet:  
    driver: bridge  
#ボリューム  
volumes:  
  mysqldata:  
    driver: local

設定を保存して閉じます。

MySQLコンテナサービスの詳細:

  • MySQLコンテナサービスは’db’という名前になり、’mysql:5.7’ Dockerイメージに基づきます。
  • ‘db’サービスはデフォルトのMySQLポート’3306’を開きます。
  • Laravelプロジェクトは、’db’サービスの環境変数に基づいてデータベース、ユーザー、およびパスワードを使用します。
  • MySQL ‘db’サービスは’mysqldata’というボリュームをマウントし、同じネットワーク’mynet’を持ちます。
  • ‘bridge’ドライバーを使用してカスタムネットワーク’mynet’を定義し、’mysqldata’ボリュームは’local’ドライバーを使用します。

以下は完成した’docker-compose.yml’設定です:

version: '3'
services:

  #Laravelアプリ
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: hakase-labs/laravel
    container_name: app
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www/html
    volumes:
      - ./:/var/www/html
    networks:
      - mynet

  #Nginxサービス
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./:/var/www/html
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet

  #MySQLサービス
  db:
    image: mysql:5.7
    container_name: db
    restart: unless-stopped
    tty: true
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: laraveldb
      MYSQL_USER: laravel
      MYSQL_PASSWORD: laravelpassworddb
      MYSQL_ROOT_PASSWORD: rootpasswordmysql
    volumes:
      - mysqldata:/var/lib/mysql/
    networks:
      - mynet

#Dockerネットワーク
networks:
  mynet:
    driver: bridge
#ボリューム
volumes:
  mysqldata:
    driver: local

- Laravel用のNginx仮想ホストを作成する

‘myapp’プロジェクトディレクトリ内に、’conf.d’と’ssl’の2つのディレクトリを含む新しい’directory’を作成します。そして、’conf.d’ディレクトリ内に新しいnginx仮想ホスト設定’laravel.conf’を作成します。

以下のコマンドを実行します。

mkdir -p nginx/{conf.d,ssl}  
vim nginx/conf.d/laravel.conf
server {
    listen 80;
    server_name laravel.hakase-labs.io;

    return 301 https://laravel.hakase-labs.io$request_uri;
}


server {
    listen 443 ssl http2;
    server_name laravel.hakase-labs.io;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # デバッグ用のログファイル
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # Laravelのウェブルートディレクトリ
    root /var/www/html/public;
    index index.php index.html;

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

    # NginxがPHP-FPMにリクエストを渡す
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

保存して閉じます。

その後、SSL証明書ファイルを’nginx/ssl/‘ディレクトリにコピーします。

sudo cp /path/to/ssl/fullchain.pem nginx/ssl/  
sudo cp /path/to/ssl/privkey.pem nginx/ssl/

- Laravelアプリ用のDockerfileを作成する

次に、Laravelプロジェクト用の新しいDockerfileを作成します。

以下のコマンドを実行します。

vim Dockerfile

以下の設定を貼り付けます。

# マスターイメージを設定
FROM php:7.2-fpm-alpine

# composer.lockとcomposer.jsonをコピー
COPY composer.lock composer.json /var/www/html/

# 作業ディレクトリを設定
WORKDIR /var/www/html

# 追加の依存関係をインストール
RUN apk update && apk add --no-cache \
    build-base shadow vim curl \
    php7 \
    php7-fpm \
    php7-common \
    php7-pdo \
    php7-pdo_mysql \
    php7-mysqli \
    php7-mcrypt \
    php7-mbstring \
    php7-xml \
    php7-openssl \
    php7-json \
    php7-phar \
    php7-zip \
    php7-gd \
    php7-dom \
    php7-session \
    php7-zlib

# PHP-PDO拡張を追加して有効化
RUN docker-php-ext-install pdo pdo_mysql
RUN docker-php-ext-enable pdo_mysql

# PHP Composerをインストール
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# キャッシュを削除
RUN rm -rf /var/cache/apk/*

# UID '1000'をwww-dataに追加
RUN usermod -u 1000 www-data

# 既存のアプリケーションディレクトリの権限をコピー
COPY --chown=www-data:www-data . /var/www/html

# 現在のユーザーをwwwに変更
USER www-data

# ポート9000を公開し、php-fpmサーバーを起動
EXPOSE 9000
CMD ["php-fpm"]

設定を保存して閉じます。

これで、’myapp’ Laravelプロジェクトをビルドし、定義したコンテナサービスを実行する準備が整いました。

ステップ4 - NginxとMySQLサービスを使用してLaravelをビルドする

以下のコマンドを使用して、Laravelプロジェクトのカスタムdockerイメージをビルドします。

docker-compose build

NginxとMySQLサービスを使用してLaravelをビルド

次に、以下のコマンドを再度実行します。

docker-compose up -d

必要なすべてのdockerイメージをダウンロードし、その後’docker-compose.yml’設定に基づいてコンテナサービスをビルドします。

Dockerイメージをダウンロード

完了したら、以下のdocker-composeコマンドを使用して確認します。

docker-compose ps

その結果、3つのコンテナサービスが稼働していることがわかります。デフォルトポート’9000’で稼働している’app’、HTTPおよびHTTPSポートで稼働している’nginx’サービス、デフォルトのMySQLポート’3306’で稼働しているMySQL ‘db’サービスです。

その後、システム上のすべての利用可能なdockerイメージとオープンポートを再度確認します。

docker-compose images  
netstat -plntu

カスタムdockerイメージ’hakase-labs/laravel’がリストに表示され、HTTPおよびHTTPSポートが’LISTEN’状態であることがわかります。

netstatでDockerセットアップを確認

ステップ5 - Laravelのポストインストール

この段階まで、LaravelプロジェクトはDockerコンテナとして稼働しています。これから新しい’.env’ファイルを作成し、キーを生成し、Laravelコマンドライン’artisan’を使用してLaravelデータを移行します。

‘.env’ファイルの例をコピーし、コンテナ内で編集します。

cp .env.example .env  
docker-compose exec app vim .env

データベース設定を以下のように変更します。

DB_CONNECTION=mysql  
DB_HOST=db  
DB_PORT=3306  
DB_DATABASE=laraveldb  
DB_USERNAME=laravel  
DB_PASSWORD=laravelpassworddb

保存して閉じます。

次に、Laravelアプリケーションキーを生成し、キャッシュ設定をクリアします。

docker-compose exec app php artisan key:generate  
docker-compose exec app php artisan config:cache

その後、以下のコマンドを使用してデータベースを移行します。

docker-compose exec app php artisan migrate

エラーがないことを確認します。

Laravelのポストインストール

今、ウェブブラウザを開き、プロジェクトのドメイン名を入力します。

http://laravel.hakase-labs.io/

すると、安全なHTTPS接続にリダイレクトされ、以下のデフォルトのLaravelホームページが表示されます。

DockerでLaravelが正常にインストールされました

最後に、NginxウェブサーバーとMySQLデータベースを使用してLaravelプロジェクトのDocker化が正常に完了しました。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。