スポンサーリンク

【ハンズオン】Docker + nginx + PHP8.1でLaravel9の環境構築をする

当サイトではアフィリエイト広告を利用して商品を紹介しています。

Docker

本記事について

本記事は、以下の記事をM1Mac環境で自分もやってみた記録です。

【超入門】20分でLaravel開発環境を爆速構築するDoc...
前置きが長いので、Docker, Git, GitHubの設定が終わっ...

差別化としては、補足やテストなど、自分が必要ないなと思った部分は記載していないので、ミニマム構成になっています。そして、自分のための備忘録です。

プロジェクトフォルダ準備

mkdir docker-laravel
cd docker-laravel

リモートリポジトリの作成

echo "# docker-laravel8" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin gitリポジトリ
git push -u origin main

appコンテナの作成

docker-compose.ymlの作成

touch docker-compose.yml
version: "3.9"
services:
  app:
    build: ./infra/php
    volumes:
      - ./src:/data

.Dockerfileの作成

mkdir -p infra/php
touch infra/php/Dockerfile
#ベースイメージ。php DockerHub公式イメージをベースに。
FROM php:8.1-fpm-buster

# コンテナ内のサーバー環境変数の設定
# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#env
ENV COMPOSER_ALLOW_SUPERUSER=1 \
    COMPOSER_HOME=/composer

# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#copy
COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer

# apt関係
# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#run

    # インストール可能なパッケージ一覧更新
RUN apt-get update && \
    # Laravelに必要なパッケージインストール
    #  --no-install-recommends:不要なパッケージのインストール防止
    apt-get -y install --no-install-recommends git unzip libzip-dev libicu-dev libonig-dev && \
    # パッケージインストールで使用したキャッシュファイル削除
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    #  PHPの拡張ライブラリインストール
    docker-php-ext-install intl pdo_mysql zip bcmath

# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#copy
COPY ./php.ini /usr/local/etc/php/php.ini

# https://matsuand.github.io/docs.docker.jp.onthefly/engine/reference/builder/#workdir
WORKDIR /data

    PHP拡張ライブラリのインストール方法

    PECL拡張ライブラリのインストール方法

    php | Docker Hub公式イメージをベースイメージとして利用。

    php.iniの作成

    • php設定ファイル
      • PHPエラーメッセージの設定
      • PHPエラーログの設定
      • メモリ等の設定(お好みで)
      • タイムゾーン設定
      • 文字コード設定
    touch infra/php/php.ini

    srcディレクトリ作成

    mkdir src

    Docker起動

    build

    docker compose build

    Docker for Desktopを起動していないとエラーが出ますので注意

    [+] Building 77.0s (11/11) FINISHED   

    などと出ればOK。

    起動

    docker compose up -d
    • -d
      • デタッチモード。バックグラウンドで動作する。
    docker compose up -d
    [+] Running 2/2
     ⠿ Network docker-laravel-handson_default  Created                                  0.1s
     ⠿ Container docker-laravel-handson-app-1  Started                                  0.6s

    以上のように表示されればOK。

    コンテナの確認

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

    docker compose psでコンテナ一覧が確認できます。

    appコンテナの確認

    appコンテナに入る

    docker compose exec app bash

    以上を実行

    root@fd83e642cfe0:/data# 

    以上のようになればコンテナに入れました。(ユーザー名@コンテナID:ディレクトリ#)

    phpバージョン

    root@fd83e642cfe0:/data# php -v
    PHP 8.1.13 (cli) (built: Dec 21 2022 07:39:27) (NTS)
    Copyright (c) The PHP Group
    Zend Engine v4.1.13, Copyright (c) Zend Technologies

    Composerのバージョン

    root@fd83e642cfe0:/data# composer -V
    Composer version 2.2.18 2022-08-20 11:33:38

    php拡張機能一覧

    root@fd83e642cfe0:/data# php -m
    [PHP Modules]
    bcmath
    Core
    ctype
    curl
    date
    dom
    fileinfo
    filter
    ftp
    hash
    iconv
    intl
    json
    libxml
    mbstring
    mysqlnd
    openssl
    pcre
    PDO
    pdo_mysql
    pdo_sqlite
    Phar
    posix
    readline
    Reflection
    session
    SimpleXML
    sodium
    SPL
    sqlite3
    standard
    tokenizer
    xml
    xmlreader
    xmlwriter
    zip
    zlib
    
    [Zend Modules]

    コンテナから退出

    exit

    control+dでも退出可能

    gitにpush

    git push
    git status
    
    On branch main
    Your branch is up to date with 'origin/main'.
    
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            new file:   docker-compose.yml
            new file:   infra/php/Dockerfile
            new file:   infra/php/php.ini
    
    git commit -m "create app container"

    コンテナ破棄

    docker compose down

    Webコンテナの作成

    docker-compose.yml へ追記する

    version: "3.9"  #docker composeファイルのバージョン
    services:
      app:  #任意のサービス名
        build: ./infra/php  #ビルドコンテキスト。docker buildを実行する際の作業ディレクトリ
        volumes:   #ホスト側のディレクトリ等をコンテナ側にマウント
          - ./src:/data #srcディレクトリをappコンテナの/dataへマウント
      # 以下、追加
      web:
        image: nginx:1.20-alpine
        ports:
          - 8080:80
        volumes:
          - ./src:/data
          - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
        working_dir: /data

    default.confの作成

    mkdir infra/nginx
    touch infra/nginx/default.conf

    Laravel公式にnginxの設定例が用意されているので、こちらを流用します。
    https://readouble.com/laravel/8.x/ja/deployment.html

    server {
        listen 80;
        server_name example.com;
        root /data/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;
        }
    }

    Docker起動

    docker compose up -d
    
    [+] Running 7/7
     ⠿ web Pulled                                                                                          5.9s
       ⠿ 455c02918c45 Pull complete                                                                        1.4s
       ⠿ 08b6b842dcd7 Pull complete                                                                        2.3s
       ⠿ d49e54c17cd8 Pull complete                                                                        2.3s
       ⠿ 0263029b2ae8 Pull complete                                                                        2.4s
       ⠿ 7a15a92d87b8 Pull complete                                                                        2.4s
       ⠿ 9fed390110de Pull complete                                                                        2.5s
    [+] Running 3/3
     ⠿ Network docker-laravel-handson_default  Created                                                     0.1s
     ⠿ Container docker-laravel-handson-web-1  Started                                                     0.6s
     ⠿ Container docker-laravel-handson-app-1  Started                                                     0.6s
    docker compose ps
    
    NAME                           COMMAND                  SERVICE             STATUS              PORTS
    docker-laravel-app-1   "docker-php-entrypoi…"   app                 running             9000/tcp
    docker-laravel-web-1   "/docker-entrypoint.…"   web                 running             0.0.0.0:8080->80/tcp

    appコンテナは9000/tcp

    webコンテナは 0.0.0.0:8080->80/tcp

    ホスト上の8080番ポートをコンテナの80番ポートへ割り当てている。

    nginxのバージョン確認

    docker compose exec web nginx -v
    
    nginx version: nginx/1.20.2

    webコンテナの動作確認

    • webコンテナの動作確認
    • HTMLとPHPが表示されるか
    mkdir src/public
    echo "Hello World" > src/public/index.html
    echo "<?php phpinfo();" > src/public/phpinfo.php

    htmlの表示

    404 Not Found

    phpinfoの表示

    404 Not Found

    確認用ファイルの削除

    rm -rf src/*

    gitpush

    git add .
    git status
    
    On branch main
    Your branch is ahead of 'origin/main' by 1 commit.
      (use "git push" to publish your local commits)
    
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            modified:   docker-compose.yml
            new file:   infra/nginx/default.conf
    git commit -m "create web container"
    
     2 files changed, 45 insertions(+), 1 deletion(-)
     create mode 100644 infra/nginx/default.conf

    Laravelインストール

    appコンテナでインストール

    docker compose exec app bash
    composer create-project --prefer-dist "laravel/laravel=9.*" .
    chmod -R 777 storage bootstrap/cache
    php artisan -V
    Laravel Framework 9.45.1

    commit

    git add .
    git commit -m "first laravel install"
    git push

    コンテナを破棄

    docker compose down

    dbコンテナの作成

    docker-compose.yml へ追記

    version: "3.9"  #docker composeファイルのバージョン
    services:
      app:  #任意のサービス名
        build: ./infra/php  #ビルドコンテキスト。docker buildを実行する際の作業ディレクトリ
        volumes:   #ホスト側のディレクトリ等をコンテナ側にマウント
          - ./src:/data #srcディレクトリをappコンテナの/dataへマウント
      web:
        # https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#image
        image: nginx:1.20-alpine
        # https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#ports
        ports:
          - 8080:80
        # https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/#volumes
        volumes:
          - ./src:/data
          - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
        working_dir: /data
    
      # 以下、追記
      db:
        build: ./infra/mysql
        volumes:
          - db-store:/var/lib/mysql
    
    volumes:
      db-store:

    Dockerfileの作成

    mkdir infra/mysql
    touch infra/mysql/Dockerfile
    FROM mysql/mysql-server:8.0
    
    ENV MYSQL_DATABASE=laravel \
      MYSQL_USER=phper \
      MYSQL_PASSWORD=secret \
      MYSQL_ROOT_PASSWORD=secret \
      TZ=Asia/Tokyo
    
    COPY ./my.cnf /etc/my.cnf
    RUN chmod 644 /etc/my.cnf

    my.cnfを作成

    touch infra/mysql/my.cnf
    [mysqld]
    # default
    skip-host-cache
    skip-name-resolve
    datadir = /var/lib/mysql
    socket = /var/lib/mysql/mysql.sock
    secure-file-priv = /var/lib/mysql-files
    user = mysql
    
    pid-file = /var/run/mysqld/mysqld.pid
    
    # character set / collation
    character_set_server = utf8mb4
    collation_server = utf8mb4_ja_0900_as_cs_ks
    
    # 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

    Docker起動

    docker compose build
    docker compose up -d

    コンテナの確認

    docker compose ps
    
    NAME                           COMMAND                  SERVICE             STATUS               PORTS
    docker-laravel-app-1   "docker-php-entrypoi…"   app                 running              9000/tcp
    docker-laravel-db-1    "/entrypoint.sh mysq…"   db                  running (starting)   3306/tcp, 33060-33061/tcp
    docker-laravel-web-1   "/docker-entrypoint.…"   web                 running              0.0.0.0:8080->80/tcp

    mysql確認

    docker compose exec db mysql -V
    
    mysql  Ver 8.0.31 for Linux on aarch64 (MySQL Community Server - GPL)

    mysqlに接続できるよう設定

    DB_CONNECTION=mysql
    DB_HOST=db
    DB_PORT=3306
    DB_DATABASE=laravel
    DB_USERNAME=phper
    DB_PASSWORD=secret
    
    DB_CONNECTION=mysql
    DB_HOST=db
    DB_PORT=3306
    DB_DATABASE=laravel
    DB_USERNAME=phper
    DB_PASSWORD=secret

    マイグレーション実行

    docker compose exec app bash
    
    root@3b5cde3649d1:/data# php artisan migrate
    
    
       INFO  Preparing database.  
    
      Creating migration table ..................................................................... 49ms DONE
    
       INFO  Running migrations.  
    
      2014_10_12_000000_create_users_table ......................................................... 39ms DONE
      2014_10_12_100000_create_password_resets_table ............................................... 43ms DONE
      2019_08_19_000000_create_failed_jobs_table ................................................... 28ms DONE
      2019_12_14_000001_create_personal_access_tokens_table ........................................ 37ms DONE

    db参照

    新しいターミナルを起動

    docker compose exec db bash
    bash-4.4# mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE
    mysql> show databases;
    
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | laravel            |
    | performance_schema |
    +--------------------+
    3 rows in set (0.01 sec)
    
    
    
    mysql> show tables;
    +------------------------+
    | Tables_in_laravel      |
    +------------------------+
    | failed_jobs            |
    | migrations             |
    | password_resets        |
    | personal_access_tokens |
    | users                  |
    +------------------------+
    5 rows in set (0.01 sec)
    
    
    mysql> desc users;
    +-------------------+-----------------+------+-----+---------+----------------+
    | Field             | Type            | Null | Key | Default | Extra          |
    +-------------------+-----------------+------+-----+---------+----------------+
    | id                | bigint unsigned | NO   | PRI | NULL    | auto_increment |
    | name              | varchar(255)    | NO   |     | NULL    |                |
    | email             | varchar(255)    | NO   | UNI | NULL    |                |
    | email_verified_at | timestamp       | YES  |     | NULL    |                |
    | password          | varchar(255)    | NO   |     | NULL    |                |
    | remember_token    | varchar(100)    | YES  |     | NULL    |                |
    | created_at        | timestamp       | YES  |     | NULL    |                |
    | updated_at        | timestamp       | YES  |     | NULL    |                |
    +-------------------+-----------------+------+-----+---------+----------------+
    8 rows in set (0.01 sec)
    
    mysql> SELECT * FROM users;
    Empty set (0.01 sec)

    gitpush

    git add .
    git commit -m "create db container"
    git push

    コメント

    タイトルとURLをコピーしました