LoginSignup
0
0

More than 1 year has passed since last update.

【備忘録】DockerでのLaravel環境の構築

Posted at

今更ながら、Dockerを使ってみようと思ったので友人が使っているというLaravelの環境をDockerで構築して使い方を学習しました。

環境

実行環境

・Windows10 Home WSL2
・Docker Desktop
使用イメージ(すべて公式イメージ)
・PHP
・composer
・nginx
・mysql
Dockerのイメージは

DockerHubで入手できます。

docker pull nginx
docker pull php
docker pull composer
docker pull mysql

Dockerが実行できる環境であれば、これらのコマンドでイメージの入手ができます。

実行環境の準備

WSLとDockerの環境構築はMicrosoft Docを参照

WSLはデフォルトで入っているっぽいので環境構築というよりもLinuxの種類の選択みたいな感じ
Dockerに関してはDocker Desktopをインストールすれば問題ない。(アカウントも作らなくて大丈夫)

ディレクトリの構造

いくつかの参考ページをもとに以下のような形にしました。
フォルダイメージ

ディレクトリ:php

PHPの設定とLaravelのインストールを行う設定を記述するファイルを置いているディレクトリです。

php.iniの設定

ディレクトリの構造と同様にこちらも、いくつかの参考ページをもとに以下のように作成しました。

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[opcache]
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

前半は何となくわかるが、後半のopcaheについては、勉強不足でわかりません。
ただ、opcacheはPHPの処理を高速にするものらしい

Dockerfile

FROM php:fpm

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

RUN apt-get update \
    && apt-get install -y zlib1g-dev \
    && apt-get install -y libzip-dev \
    && docker-php-ext-install zip pdo_mysql opcache

WORKDIR /var/www

COPY --from=composer /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

RUN composer global require "laravel/installer"

Dockerfileについては上記のようにしました。
といっても参考サイトをほぼコピーしたようなものですが...

以下、Dockerfileの内容の考察 解説となります。
興味がない場合は次の項目までスキップしてください。

コンテナのベースとなるイメージにはPHPの公式イメージを使っています。

FROM php:fpm

/etcという文言があるため、php.iniの設定で書いたphp.iniを適用しているのはこの箇所だと思われます。

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

ubuntuのパッケージ管理aptがあるため、必要なパッケージのインストールを行っている。
composerの使用に必要なパッケージだそうです。

RUN apt-get update \
    && apt-get install -y zlib1g-dev \
    && apt-get install -y libzip-dev \
    && docker-php-ext-install zip pdo_mysql opcache

WORKDIRは名前から考えるにコンテナ内でコマンドを実行するディレクトリのするデフォルトの場所だと思われる。

WORKDIR /var/www

下記のコマンドでコンテナのshellに入るとWORKDIRで指定した箇所になっている。

docker-compose exec php bash

composerは普通ならコマンドでインストールするが、コンテナのイメージから使えるらしい。
composerのイメージからcomposerを取り出しの設定はおそらくここ

COPY --from=composer /usr/bin/composer /usr/bin/composer

EMVは環境変数の設定らしい

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin

最後のRUNはcomposerでLaravelをインストールするコマンド

RUN composer global require "laravel/installer"

ディレクトリ:nginx

webサーバはnginxで行いました。
Apacheの資料より、こっちの資料のが多かったのでnginxにしました。
nginxに置いているファイルはdefault.confのみ

default.conf

内容は下記のような感じ

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

    location / {
        root /var/www/app/public;
        index index.php;
        try_files $uri $uri/ /index.php?$query_string;
    }

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

以下、default.confの内容の考察 解説となります。
興味がない場合は次の項目までスキップしてください。
私はnginxは使ったことがないためApacheの設定ファイルの知識の範囲で推測できることになります

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

この箇所はwebサーバの基本的な設定だと思われます。
上から、アクセスリクエストを受け付けるポートの番号、自動で読み込むファイルの名前、表示するファイルの場所であると思われます。(少なくとも上2つはほぼ確実)

location / {
        root /var/www/app/public;
        index index.php;
        try_files $uri $uri/ /index.php?$query_string;
    }

ここの設定はドメイン名やipアドレスでアクセスした際の設定
http://locahlhost:80 でアクセスする際の設定)
最後の行だけは勉強不足でわかりません。後で調べようと思います。

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

この箇所も勉強不足でほとんどわかりません。
何となくの推測ではCGIの設定だと思われます。最初のtry_files $uri =404;の箇所と上から読み込みすると考えると、もしかしたらindex.phpにアクセスできなかった際の設定である可能性もある。

docker-compose.ymlの設定

docker-compose.yml
version: '3'

services:
  app:
    container_name: app
    build: ./docker/php
    volumes:
      - .:/var/www
  nginx:
    image: nginx
    container_name: "laravel-nginx"
    ports:
      - "8080:80"
    volumes:
      - .:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
  mysql:
    image: mysql
    container_name: "laravel-mysql"
    restart: always
    environment:
      MYSQL_DATABASE: root
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    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: 
      - 3306:3306

以下、docker-compose.ymlの内容の考察 解説となります。
興味がない場合は次の項目までスキップしてください。

app:nginx:mysql:の箇所がコンテナ1つ1つの設定の開始であると思われます。

image:は使用するイメージ。設定している箇所はnginxmysqlの2つ

container_nameはコンテナの名前です。後述するlaravelの.envファイルのホスト名がここで設定した名前になることから、コンテナのホストネームもcontainer_nameで設定した値になると思われます。

valumes:はデータのマウント元を設定する箇所であると思われる。おそらく:の左側に書かれたものがマウントするDockerのホスト側のディレクトリやファイル名、右側がコンテナのマウント先のディレクトリやファイルである。

portsも同様に:の左側がDockerのホスト側のポート番号、右側が転送するコンテナ側ポート番号であると思われます。

mysqlで設定されているenvironment:はデータベース側の設定で、MYSQL_DATABASE: rootMYSQL_ROOT_PASSWORD: rootが管理ユーザーの設定、MYSQL_USER: userMYSQL_PASSWORD: passwordが一般ユーザーの設定である。
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ciはコンテナ内で実行するコマンドである。

コンテナの作成

作成するコンテナの設定が完了したため、このコマンドでコンテナを作成します。

docker-compose up -d

実行後にこのコマンドでコンテナが無事に立ち上がっているかが確認できます。

docker-compose ps

正常に起動した場合はこのようになります。
image.png

Laravelの設定

コンテナが立ち上がったところで、LaravelのインストールとMySQLとLaravelの接続の設定を行う。
このコマンドでappコンテナのシェルに入る。

docker-compose exec app bash

次に、このコマンドでLaravelのインストールが行える。laravelの部分がインストールするLaravelのフォルダ名となる。

composer create-project --prefer-dist laravel/laravel laravel

MySQLとLaravelの接続の設定を行います。
インストールしたlaravelの直下に配置されている.envファイルを編集する。
Linuxシステムにおいて先頭に.が付くファイルは隠しファイルとなるため、lsコマンドでは表示されません。ls -aオプションを追加することで隠しファイルも含めたファイルの一覧を表示することができます。(VSCodeだと普通に表示されていましたが...)

.env
DB_CONNECTION=mysql
DB_HOST=laravel-mysql
DB_PORT=3306
DB_DATABASE=laravel_database
DB_USERNAME=user
DB_PASSWORD=password

.envの中で書き換えるのはこの箇所
上から接続するデータベースの種類(PostgreSQLの場合は、ここの値を書き換える)
DB_HOSTはデータベースのホスト名を指定する箇所です。docker-compose.ymlで設定したmysqlのcantainer_nameの値に書き換える。
'DB_PORT'も同様にmysqlのportsで指定した値を設定する。
DB_USERNAMEDB_PASSWORDも同様にenvironment:で設定した値に書き換える。
普通なら管理者ユーザーではなく一般ユーザーで作成するほうがベター

私の環境では一般ユーザーでのマイグレーション時に権限不足で実行することができませんでした。
MySQLのクライアントを入れていない場合は、

docker-compose exec mysql mysql -uroot -p

で管理者ユーザーとしてMySQLにログインし、Laravel用のデータベースを作成と一般ユーザーに作成したデータベース内での権限を与えればマイグレーションの実行ができました。

履歴

2022年4月3日:新規作成

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0