スポンサーリンク

【ハンズオン】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をコピーしました