windowsでdockerとlaravelの構築の手順

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               NAMES

2.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.conf

default.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/storage

php.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 = 500M

Dockerの起動

# 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:link

http://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=root

Dockerコンテナの操作

コマンド一覧

# 起動
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;