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
- ルート権限
私たちが行うこと:
- DockerとDocker Composeをインストールする
- Laravelをダウンロードし、依存関係をインストールする
- LaravelプロジェクトをDocker化する - Laravelアプリサービスを定義する
- Nginx HTTPサービスを定義する
- MySQLデータベースサービスを定義する
- Laravel用のNginx仮想ホストを作成する
- Laravelアプリ用のDockerfileを作成する
- Laravelプロジェクトをビルドする
- 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 -yDockerとDocker Composeパッケージがシステムにインストールされているはずです。以下のコマンドを使用して確認します。
docker version
docker-compose versionその結果、システム上のDockerとDocker Composeのバージョンが表示されます。

次に、非ルートユーザーにDockerグループを割り当てて、非ルートユーザーがDockerコンテナを実行できるようにする必要があります。
この場合、以下のコマンドを実行して、’hakase’というユーザーをdockerグループに追加します。
usermod -a -G docker hakaseその後、’hakase’ユーザーシェルにログインし、dockerの’hello-world’コマンドを実行します。
su - hakase
docker run hello-worldこれで、Dockerからの’Hello World’メッセージが表示され、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の依存関係のインストールが完了したら、以下の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:
- mynetLaravelコンテナサービスの詳細:
- 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:
- mynetnginxコンテナサービスの設定詳細:
- ‘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.confserver {
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
次に、以下のコマンドを再度実行します。
docker-compose up -d必要なすべてのdockerイメージをダウンロードし、その後’docker-compose.yml’設定に基づいてコンテナサービスをビルドします。

完了したら、以下の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’状態であることがわかります。

ステップ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エラーがないことを確認します。

今、ウェブブラウザを開き、プロジェクトのドメイン名を入力します。
http://laravel.hakase-labs.io/
すると、安全なHTTPS接続にリダイレクトされ、以下のデフォルトのLaravelホームページが表示されます。

最後に、NginxウェブサーバーとMySQLデータベースを使用してLaravelプロジェクトのDocker化が正常に完了しました。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。