独学エンジニアのメモ帳

得た知識のアウトプットとか日常のメモとか。ゆるくやる。

DockerでLaravel8(PHP7.4, Nginx, MySQL5.7)の最低限の環境構築

こちらを参考にさせていただきました。

qiita.com

Docker環境

ディレクトリ構成

project
┣ docker
┃ ┣ db
┃ ┣ nginx
┃ ┗ php
┣ server
┗docker-compose.yml

serverにlaravelプロジェクトが入る想定です。

各種ファイル作成

docker-compose.yml

version: '3'

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
    - ./server:/var/www/html

  nginx:
    image: nginx
    container_name: nginx
    ports:
    - 50080:80
    volumes:
    - ./server:/var/www/html
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
    - php

  db:
    image: mysql:5.7
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 53306:3306

ポートが絶対に被らないよう
nginx -> 50080
mysql -> 53306
に変更しています。

/nginx/default.conf

server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

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

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root/index.php;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }

php/Dockerfile

FROM php:7.4-fpm
COPY php.ini /usr/local/etc/php/


#Composer install
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer

RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim
RUN apt-get update \
    && docker-php-ext-install pdo_mysql

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

php/php.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

コンテナ起動

$ docker-compose up -d

mysqlが起動失敗したので、エラーを確認

$ docker-compose up

バックグラウンド起動を辞めると、途中のエラーが分かります。

エラー内容

Operating system error number 22 in a file operation.

ぐぐったところ
docker-compose.ymlに

  db:
    image: mysql:5.7
    ...中略
    command: --innodb-use-native-aio=0 #この1行追加

でOKそうです。

一度dbディレクトリのデータを削除し、再度コンテナ起動

$ docker-compose up -d

Starting php     ... done
Starting db-host ... done
Starting nginx   ... done

無事起動完了

Laravelプロジェクト作成

作業コンテナに入る

$ docker-compose exec php bash

/var/www# composer create-project --prefer-dist laravel/laravel .

しばらく待ちます。

Package manifest generated successfully.
73 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan key:generate --ansi
Application key set successfully.

成功文が出たら
http://localhost:50080にアクセス

f:id:nochio12:20201002012635p:plain

Laravelのトップ画面が表示されればOK

DB作成

一度コンテナから出て、DBコンテナに接続します。

$ docker-compose exec db bash

コンテナ

/# mysql -u root -p
// docker-compose.ymlのMYSQL_ROOT_PASSWORD
Enter password: root

// データベース作成
mysql> create database laravel;

mysql> quit;
/# exit;

次にLaravel側の設定をします。

.env

DB_CONNECTION=mysql
# DB_HOST=127.0.0.1
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel # さっき作ったDB名
DB_USERNAME=root
DB_PASSWORD=root

設定出来たら再びPHPコンテナへ

$ docker-compose exec php bash
/var/www# cd html
/var/www/html# php artisan migrate

無事マイグレーションが完了すればOK

まとめ

Laradock使ってて、重いし謎のエラー出るしで嫌になったので
今後はこの最小構成をベースにLaravel触っていきたい。