見出し画像

【Docker】手軽にLaravel11を構築する

Laravel11環境をDockerで作っていきます


動作環境

  • Windows11

  • VSCode(コマンド打てるなら何でも)

  • Docker Desktop v4.12.0

  • やる気

Laravel11のリリースノートはこちら

フォルダ構成

.
├─ docker
│   ├─ app
│   │   ├─ Dockerfile
│   │   └─ php.ini
│   └─ web
│       ├─ default.conf
│       └─ Dockerfile
├─ src ← コンテナ起動時に勝手に作られるやつ
└─ docker-compose.yml

PHPコンテナを作成

まずはLaravelの開発環境を構築するための、PHPのコンテナを作成します。

docker-compose.ymlの作成

PHPコンテナについての記述は以下の通り

version: "3.9"
services:
  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    volumes:
      - ./src/:/app

volumesに書いた「./src/:/app」のsrcが後々作成されるフォルダです
(コンテナ内にもappフォルダが作成されます)

Dockerfileの作成

FROM php:8.3-fpm

ENV TZ Asia/Tokyo

# ミドルウェアインストール
RUN apt-get update && \
	apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
	docker-php-ext-install intl pdo_mysql zip bcmath

COPY ./docker/app/php.ini /usr/local/etc/php/php.ini

# Composerインストール
COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer

# Node.jsインストール
COPY --from=node:18 /usr/local/bin/node /usr/local/bin/node
COPY --from=node:18 /usr/local/lib/node_modules /usr/local/lib/node_modules
# RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
# RUN apt-get install -y nodejs

WORKDIR /app

# ユーザーを作成
ARG DOCKER_UID=1000
ARG DOCKER_USER=docker
ARG DOCKER_PASSWORD=docker
ARG ROOT_USER=root
ARG ROOT_PASSWORD=root
RUN useradd -m --uid ${DOCKER_UID} --groups sudo ${DOCKER_USER} \
    && echo ${DOCKER_USER}:${DOCKER_PASSWORD} | chpasswd \
    && echo ${ROOT_USER}:${ROOT_PASSWORD} | chpasswd

# 作成したユーザーに切り替える
USER ${DOCKER_USER}
  • Laravel11はPHP8.2以上が必要なため最新版の8.3を入れました

  • ミドルウェアは個人的に必要なものを入れていますがbcmathは要らないと思います

  • ComposerとNode(任意)のインストールはマルチステージビルドを使用しています

  • 権限やらの関係でユーザーも作成しています

php.iniの作成

zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese

php.iniに関してはこちらのサイトの内容を丸々お借りして作成しています。

PHPコンテナのビルド&起動

PHPのコンテナの準備が出来たので、実際に起動してみます

docker-compose up -d --build

起動したコンテナを確認する

コマンドを打ってコンテナを確認します
「omochi」は今回作成するときのルートフォルダの名前です
このタイミングでsrcというフォルダが作成されています

> docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
omochi-app-1        "docker-php-entrypoi…"   app                 running             9000/tcp
> 

コンテナの中に入って諸々確認します

$ pwd
/app
$ php -v
PHP 8.3.7 (cli) (built: May 14 2024 12:46:30) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.7, Copyright (c) Zend Technologies
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.7.6 2024-05-04 23:03:15

~中略~

$ php -m
[PHP Modules]
bcmath
Core

~省略~

要らないって言ってたbcmathもしっかり入ってます

nginxコンテナを作成

webサーバーとなるnginxのコンテナを作成します

docker-compose.ymlの追記

version: "3.9"
services:
  app:
    ~ 中略 ~
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
      - 8000:80
    depends_on:
      - app
    volumes:
      - ./src/:/app

web:から下が追記した内容です

ホスト側とコンテナ間のポート番号の対応付けを設定します。
ホスト側のポート番号 : コンテナのポート番号 で記載します

Dockerfileの作成

FROM nginx:1.20-alpine

ENV TZ Asia/Tokyo

COPY ./docker/web/default.conf /etc/nginx/conf.d/default.conf

default.confの作成

server {
    listen 80;
    server_name example.com;
    root /app/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

以下のLaravel 11.xの公式サイトを基に設定しています
rootfastcgi_passは今回の構成に合わせて変更しています

nginxコンテナのビルド&起動

nginxのコンテナの準備が出来たので、また実際に起動してみます

docker-compose up -d --build

起動したコンテナを確認する

> docker-compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
omochi-app-1        "docker-php-entrypoi…"   app                 running             9000/tcp
omochi-web-1        "/docker-entrypoint.…"   web                 running             0.0.0.0:8000->80/tcp
> 

コンテナの中に入って諸々確認します

/ # nginx -v
nginx version: nginx/1.20.2

Laravelのインストール

appコンテナに入ってLaravelをインストールします

composer create-project laravel/laravel .

インストールが完了したらバージョンを確認してlocalhost:8000にアクセスし、しブラウザでLaravelのウェルカムページが表示できることを確認します

php artisan -v
Laravel Framework 11.7.0
Laravel v11.7.0 (PHP v8.3.7)

Laravel11ではデフォルトのデータベースがSQLiteとなっているためそのままSQLiteを使用します(なのでdbコンテナを作成していませんでした)
プロジェクト作成時にマイグレーションまで完了しています

databaseフォルダ内にdatabase.sqliteというファイルがあるのでこれをHeidi
やA5M2で読み込みます

おわり

なんかいい感じにできました(3回目)
特にエラーが出ることなくサクッと作ることができました
AdminLTEを入れて管理画面でも作ろうと思います

どこか間違っている個所などあればコメントで教えていただければ幸いです…!

おまけ

なぜユーザーを作成するのか

権限やらの関係でユーザーも作成しています

ユーザーを作成せずに作った結果

FROM php:8.3-fpm

ENV TZ Asia/Tokyo

# ミドルウェアインストール
RUN apt-get update && \
	apt-get install -y git unzip libzip-dev libicu-dev libonig-dev && \
	docker-php-ext-install intl pdo_mysql zip bcmath

COPY ./docker/app/php.ini /usr/local/etc/php/php.ini

# Composerインストール
COPY --from=composer:2.7 /usr/bin/composer /usr/bin/composer

# Node.jsインストール
COPY --from=node:18 /usr/local/bin/node /usr/local/bin/node
COPY --from=node:18 /usr/local/lib/node_modules /usr/local/lib/node_modules
# RUN curl -sL https://deb.nodesource.com/setup_14.x | bash -
# RUN apt-get install -y nodejs

WORKDIR /app

プロジェクト作成後localhost:8000にアクセスすると

簡潔に言うと権限エラー

パーミッション弄れば直せますがプロジェクト作った後にいじるのが面倒なのでコンテナ作成時にユーザーを作成しています
(というかユーザー作成はしておいた方がいいっておばーちゃんがいってた)

データベースにMySQLを使いたい

下記を追加して再ビルドするだけです

.
├─ docker
│   ├─ app
│   │   ├─ Dockerfile
│   │   └─ php.ini
│   ├─ db ← 追加
│   │   ├─ Dockerfile ← 追加
│   │   └─ my.conf ← 追加
│   └─ web
│       ├─ default.conf
│       └─ Dockerfile
├─ src
└─ docker-compose.yml ← 追記

docker-compose.yml

version: "3.9"
services:
  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    volumes:
      - ./src/:/app
  web:
    build:
      context: .
      dockerfile: ./docker/web/Dockerfile
    ports:
      - 8081:80
    depends_on:
      - app
    volumes:
      - ./src/:/app
  # 以下を追記
  db:
    build:
      context: .
      dockerfile: ./docker/db/Dockerfile
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: database
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
      TZ: 'Asia/Tokyo'
    volumes:
      - mysql-volume:/var/lib/mysql
volumes:
  mysql-volume:

Dockerfile

FROM mysql:8.4

COPY ./docker/db/my.conf /etc/my.conf

my.conf

[mysqld]
# character
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# Error Log
log-error = mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = mysql-general.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

ただ、デフォルトがSQLiteになったため、.envの内容やconfig諸々弄る必要があったと思います(未確認)

この記事が気に入ったらサポートをしてみませんか?