2023年11月の記事です。
windowsでdocker desktopを使用してdockerとlaravelの構築を行います。
LEMP(Linux、Nginx、Mysql、Php)環境で構築を行います。
システム要件
・x64システムの場合:バージョン 1903 以降、ビルド 18362 以上
・ARM64システムの場合:バージョン 2004 以降、ビルド 19041 以上。
・64 ビット SLAT (Second Level Address Translation 対応プロセッサ
・4GB システムメモリ
・BIOS レベルでのハードウェア仮想化が、BIOS 設定で有効にする必要。
手順
1.WSLとDocker Desktopのインストール
WSLとDocker Desktopのインストールの解説は割愛いたします。
沢山の参考サイトがありますので、リンクを貼っておきます。
WSLの参考サイト:
https://www.kagoya.jp/howto/it-glossary/develop/wsl2_linux/
https://chigusa-web.com/blog/wsl2-win11/
Docker Desktopの参考サイト:
https://chigusa-web.com/blog/windows%E3%81%ABdocker%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6python%E7%92%B0%E5%A2%83%E3%82%92%E6%A7%8B%E7%AF%89/
https://zenn.dev/longbridge/articles/d9f544f5b4cb82
まずはWSLをインストールします。
「WSL(Windows Subsystem for Linux)」とは、Windows上で動作するLinuxの実行環境です。
WSL1とWSL2がありますが、WSL2を使いましょう。
WSL2を使うための要件があり、下記の要件をクリアしているかを確認します。
・x64システムの場合:バージョン 1903 以降、ビルド 18362 以上
・ARM64システムの場合:バージョン 2004 以降、ビルド 19041 以上。
WSL2のインストールが完了したら、PowerShellで有効になっているかの確認を行います。
PS C:\Users\xxx> wsl -l -v
NAME STATE VERSION
* Ubuntu Running 2次にDocker Desktopのインストールを行います。
Docker Desktopにもシステム要件があります。
https://docs.docker.jp/docker-for-windows/install.html#win-system-requirements
・64 ビット SLAT (Second Level Address Translation 対応プロセッサ
・4GB システムメモリ
・BIOS レベルでのハードウェア仮想化が、BIOS 設定で有効にする必要。
最低限のスペックでは、かなり動作が重たいので、ある程度のスペックのあるパソコンでの作業をお勧めします。
WSL2のインストールが完了したら、PowerShellで有効になっているかの確認を行います。
PS C:\Users\xxx> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2.Dockerの構築
参考サイト:
https://qiita.com/hitotch/items/869070c3a9f474a358ea
https://qiita.com/hinako_n/items/f15646ea548bcdc8ac6c
下記のディレクトリで構築します。
C:\開発環境\laravel-blog\
├ docker
│ ├ mysql
│ │ └
│ ├ nginx
│ │ ├ logs
│ │ ├ default.conf
│ │ └ Dockerfile
│ └ php
│ ├ Dockerfile
│ └ php.ini
├ laravel(laravelのコード)
└ docker-compose.yml
それぞれのファイルにコードを記述していきます。
docker-compose.yml
# docker-composeのバージョン
version: '3'
# コンテナ定義
services:
# webサーバー(nginx)
nginx:
# コンテナ名
container_name: "nginx"
# コンテナの作成に使用するDockerfileのパス
build:
context: ./docker/nginx
# phpの次に起動させる
depends_on:
- php
# ホスト側のポート:コンテナ側のポート
ports:
- 80:80
volumes:
- ./:/src
- ./docker/nginx/default.conf:/etc/nginx/default.conf
# PHPサーバー
php:
container_name: "php"
build:
context: ./docker/php
depends_on:
- mysql
volumes:
- ./:/src
- /src/laravel/node_modules
- /src/laravel/vendor
- ./docker/php/php.ini:/usr/local/etc/php/php.ini
# MySQLサーバー
mysql:
image: mysql:8.0.33
command: --max_allowed_packet=32505856
container_name: "mysql"
volumes:
- ./docker/mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=laravel-blog
ports:
- 3306:3306・Webサーバーはnginxにしているので、PHPサーバーを別に立ち上げてます。
・Apacheの場合は、PHPと同じPHPサーバーにして問題ないです。
・「/src/laravel/node_modules」と「/src/laravel/vendor」のフォルダをボリュームマウントから外して、動作の高速化を行います。
nginxサーバーの設定
Dockerfile
FROM nginx:1.25
COPY ./default.conf /etc/nginx/conf.d/default.confdefault.conf
server {
listen 80;
listen [::]:80;
# ルートディレクトリを指定
root /src/laravel/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
error_page 404 /index.php;
location ~ \.php$ {
# PHPサーバーの指定
fastcgi_pass php:9000;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}default.confの設定は下記ページを参考にしています。
https://readouble.com/laravel/10.x/ja/deployment.html
PHPサーバーの設定
Dockerfile
FROM php:8.1-fpm
# php.ini(ローカル)をホスト【コンテナ】(/usr/local/etc/php/)にコピーする
COPY php.ini /usr/local/etc/php/
# gitやvimなどのパッケージ(コマンド)のインストール
# 必要なパッケージを記入する
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng-dev \
libfontconfig1 \
libxrender1
# PHP Extensionsのインストール
RUN apt install -y zlib1g-dev mariadb-client libzip-dev libonig-dev \
&& docker-php-ext-install zip pdo_mysql
# Composerのインストール & パス通す
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# nodeインストール
RUN apt install -y npm \
&& npm install n -g \
&& n stable
# RUN , CMD , ENTRYPOINT , COPY , ADD を実行する時のワーキングディレクトリを指定
WORKDIR /src
ADD . /src/laravel/storage
RUN chown -R www-data:www-data /src/laravel/storagephp.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
# mbstring.internal_encoding = "UTF-8"
default_charset = "UTF-8"
mbstring.language = "Japanese"
[PHP]
display_errors = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500MDockerの起動
# C:\開発環境\laravel-blog\に移動
docker compose up -d上記が完了すると、3つのコンテナが起動します。
写真
Webサーバーとして機能しているか確認するため、http://localhost/にアクセスしてみます。
写真
まだドキュメントルートに何もアップロードしてないので「File not found.」で正解です。
サーバーは正しく起動できました。
3.Laravelをインストールする
PHPサーバーのコンソールに入ります。
# C:\開発環境\laravel-blog\に移動
docker compose exec php bash
# 下記の表記になれば、成功です。
root@0000000:/src# ここからは「>」がホストOS(ここではWindows)、「$」がDockerコンテナ内のOSとして表記します。
ここからはコピペが「Shift + Insert」になります。
$ ls
ディレクトリ: C:\開発環境\laravel-blog\
docker laravel docker-compose.yml
# laravelディレクトリに移動して、laravel(10の最新)のインストール
$ cd laravel
$ composer create-project "laravel/laravel=10.*" . --prefer-dist
# composerとnpmのインストール
$ composer install
$ npm install
# シンボリックリンクの設置
chmod -R guo+w storage
php artisan storage:linkhttp://localhost/にアクセスしてみます。

データベースの接続
laravelの.envファイルの修正
# mysqlコンテナのサービス名
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
# docker-compose.ymlのMYSQL_DATABASEと合わせる
DB_DATABASE=laravel-blog
DB_USERNAME=root
DB_PASSWORD=rootDockerコンテナの操作
コマンド一覧
# 起動
docker compose up -d
# リビルドと起動
docker compose up -d --build
# 停止
docker compose down動作を高速にするために「/src/laravel/node_modules」と「/src/laravel/vendor」のフォルダをボリュームマウントから外してます。
Dockerコンテナ起動時に下記のコマンドを実行する必要があります。
> docker compose up -d
> docker compose exec php bash
$ cd laravel
$ composer install
$ npm installデータベースでユーザー追加と権限の付与
# docker exec -it データベースサーバー名 mysql -u root -p
docker exec -it mysql mysql -u root -p
password > root
# ユーザー名:laravel、パスワード:passwordで作成
CREATE USER 'laravel'@'localhost' IDENTIFIED BY 'password';
# laravel_blogデータベースに全権限の付与
GRANT ALL ON laravel_blog.* to 'laravel'@'localhost';
# 権限のリロード
FLUSH PRIVILEGES;