docker+Laravelをrailsエンジニアが使ってみる

こんにちは。
最近Laravelをたまたま触る機会があったので備忘録として残していこうと思います。

結構巷じゃ人気みたいですね〜、Laravel。
名前の響きが良い笑

phpもろくに触ったことがないのでLaravelも書いたことなかったんですが、、、。
感想としては結構書いてみて面白かったですね。
railsと同じMVCなので馴染みやすいです。

railsとか触ったことある人は割と理解しやすいのでは?

docker+Laravelをrailsエンジニアが使ってみる←今回はここ
Laravel: ログイン認証と管理画面 【voyager】
Laravel + docker で掲示板を作るチュートリアル
docker + Laravelアプリをherokuにデプロイする

Laravel + Docker環境構築

dockerを使ってLaravelの環境を作っていきます。

mkdir [プロジェクト名]
cd [プロジェクト名]

上記のコマンドをターミナルで叩いてプロジェクトディレクトリを作っておく

必要なファイルを作成

docker-compose.yml

touch docker-compose.yml

docker-compose.ymlの中

version: "3"
services:
  app:
    container_name: topic_app  # 任意で変更
    build:
      context: ./docker/php
      args:
        - TZ=${TZ}
    volumes:
      - ./src:/topic  # 任意で変更
      - ./logs:/var/log/php
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    working_dir: /topic  # 任意で変更
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_DATABASE=${DB_NAME}
      - DB_USERNAME=${DB_USERNAME}
      - DB_PASSWORD=${DB_PASSWORD}
      - TZ=${TZ}
  web:
    image: nginx:1.17-alpine
    container_name: topic_web  # 任意で変更
    depends_on:
      - app
    ports:
      - 8080:80
    volumes:
      - ./src:/topic # 任意で変更
      - ./logs:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}

  db:
    image: mysql:5.7
    container_name: topic_db  # 任意で変更
    volumes:
      - db-store:/var/lib/mysql
      - ./logs:/var/log/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - TZ=${TZ}
    ports:
      - "3388:3306"

volumes:
    db-store:

webappdbの3つのコンテナ構成でいきます。

.env

続いて.envを作ります。

touch .env

.envの中

DB_NAME=topic_db 任意で変更
DB_USERNAME=docker
DB_PASSWORD=secret
DB_ROOT_PASSWORD=root
TZ=Asia/Tokyo

タイムゾーンをAsia/Tokyoに指定します。
DBの情報は任意で変更してください。

Dockerfile

dockerディレクトリの中に作っていきます。

mkdir -p dokcer/php
touch docker/php/Dockerfile

Dockerfileの中

FROM php:7.3-fpm-alpine

ARG TZ
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer

RUN apk --no-cache update && \
    apk --no-cache upgrade && \
    apk --no-cache add \
    curl-dev \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev \
    libxml2-dev \
    libzip-dev \
    pcre-dev \
    g++ \
    make \
    autoconf \
    openssl \
    nodejs-npm \
    bash \
    vim \
    git \
  && docker-php-ext-install \
    pdo_mysql \
    zip \
    opcache \
  && docker-php-ext-configure gd \
    --with-freetype-dir=/usr/include/ \
    --with-jpeg-dir=/usr/include/ \
    --with-png-dir=/usr/include/ \
  && docker-php-ext-install gd \
  && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer \
  && chmod +x /usr/local/bin/composer \
  && rm -rf /var/cache/apk/*

FROMでphp:7.3-fpm-alpineイメージを取得します。

php.ini

phpの設定ファイルですね。

touch docker/php/php.ini

php.iniの中

error_reporting = E_ERROR | E_WARNING | E_PARSE | E_NOTICE
display_errors = stdout
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
upload_max_filesize = -1
memory_limit = -1
post_max_size = 100M
max_execution_time = 900
max_input_vars = 100000
default_charset = UTF-8

[Date]
date.timezone = ${TZ}

[mbstring]
mbstring.language = Japanese

default.conf

nginxの設定をします

mkdir docker/nginx
touch docker/nginx/default.conf

default.confの中

server {
    listen 80;
    root /[プロジェクト名]/public;
    index index.php;
    charset utf-8;

    location / {
            root /[プロジェクト名]/public;
            try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
            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;
    }
}

my.cnf

最後ですね。

mkdir docker/mysql
touch docker/mysql/my.cnf

my.cnfの中

[mysqld]
# character set / collation
character-set-server = utf8mb4
collation-server = utf8mb4_bin

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

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

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

# General Log
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

これで必要なファイルは揃いました!
最終的なファイル構成はこんな感じです。

ファイル構成

早速buildしていきましょう。

Laravelインストール

build

早速buildしましょう。

docker-compose build

build

ビルドが終わったら起動します

docker-compose up

Laravelのインストール

appコンテナに入る

ターミナルで新しくウインドウを開いてappコンテナに入ります

docker-compose exec app ash

プロジェクト作成

プロジェクトを作成します。
6系でいきます。

composer create-project --prefer-dist "laravel/laravel=6.0.*" .

インストール

バージョンを確認

php artisan -V
キーの中身はsrc/.envの中に書き込まれます

ローカルホストにアクセスしましょう
localhost:8080をブラウザで開く

ホーム画面

なんか洒落てますね。
Railsの賑やかなのになれてるので尚更笑

mysqlコンテナと接続

Laravelをインストールしてsrcディレクトリができていると思うので、そこの.envを書き換えます

./src/.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=topic_db
DB_USERNAME=docker
DB_PASSWORD=secret

またAPP_URLも書き換えます

APP_URL=http://localhost:8080

マイグレーションを実行

php artisan migrate

migrate

Sequel Proで確認してみる
sequelpro

ちょっとした設定

アプリケーションのタイムゾーンを変更

config/app.php

    'timezone' => 'Asia/Tokyo', //デフォルトはUTC
    'locale' => 'ja', //デフォルトはen

https対応

ローカルではhttp、
本番ではhttpsにしたいかと思います。
asset()関数をそのまま使うと、全てhttpになってしまいますし、
secure_asset()などに書き換えるのも面倒です。
そこで以下のファイルを書き換えることで、動的に対応されるようになります。
LaravelとDockerでプロジェクトを始めるときに見るメモ

app/http/Middlewares/TrustProxies.php

protected $proxies = '*';


ヘルパーを導入 

6系からヘルパーがなくなったらしいです。
composer require laravel/helpers

できましたね。
次回はログイン機能と管理画面を実装します。

コメント

  1. 匿名 より:

    Laravel良いですよね