nkimraの日記

技術的なメモのブログ。

Docker用のLaravelテンプレート

Laravelでプロジェクトを作成する機会が増えたので、できるだけ自動化できるようにテンプレートを作成してみました。

環境

Nginx:Latest
PHP:7.3.0
Laravel:5.7
MariaDB:Latest

ディレクトリ構成

docker-laravel-template
├── data
│   ├── db
│   └── logs
├── docker-compose.yml
├── init.sh(初回起動バッチ)
├── src(配下にLaravelプロジェクトを作成)
└── web
    ├── app.docker
    ├── default.txt(defaut.confの雛形)
    └── php.ini

基本的にinit.shに必要な情報を記載する。

init.sh

#!/bin/bash

# Laravel Project Name
export LARAVEL_PROJECT_NAME=sample

# nginx setting for docker-compose.yml
export CONTAINER_NAME_NGINX=laravel_nginx

# php setting for docker-compose.yml
export CONTAINER_NAME_PHP=laravel_php

# mariadb setting for docker-compose.yml
export CONTAINER_NAME_DB=laravel_db
export ROOT_PASSWORD=password
export DB_NAME=db_laravel

# replace default.conf
cat web/default.txt | sed -e "s/laravel/${LARAVEL_PROJECT_NAME}/g" > web/default.conf

# run docker-compose
docker-compose up -d

# create laravel project
docker-compose exec php composer create-project --prefer-dist laravel/laravel ${LARAVEL_PROJECT_NAME} "5.7.*"

# create env
cd src/${LARAVEL_PROJECT_NAME}
cat .env.example | sed -e "s/DB_HOST=127.0.0.1/DB_HOST=${CONTAINER_NAME_DB}/g"\
 -e "s/DB_DATABASE=homestead/DB_DATABASE=${DB_NAME}/g"\
 -e "s/DB_USERNAME=homestead/DB_USERNAME=root/g"\
 -e "s/DB_PASSWORD=secret/DB_PASSWORD=${ROOT_PASSWORD}/g" > .env

# generate laravel key
docker-compose exec php php ${LARAVEL_PROJECT_NAME}/artisan key:generate

docker-compose.yml

version: '3'
services:
    nginx:
        container_name: ${CONTAINER_NAME_NGINX}
        image: nginx:latest
        ports:
            - "80:80"
        volumes:
            - ./web/default.conf:/etc/nginx/conf.d/default.conf
            - ./src:/var/www/html
            - ./data/logs/:/var/log/nginx/
        depends_on:
            - php
        external_links:
            - db
        restart: always

    php:
        container_name: ${CONTAINER_NAME_PHP}
        build:
            context: ./web
            dockerfile: app.docker
        volumes:
            - ./src:/var/www/html
        restart: always

    db:
        image: mariadb
        container_name: ${CONTAINER_NAME_DB}
        environment:
            MYSQL_ROOT_PASSWORD: ${ROOT_PASSWORD}
            MYSQL_DATABASE: ${DB_NAME}
        volumes:
            - ./data/db:/var/lib/mysql
        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
        restart: always

app.docker

FROM php:7.3.0-fpm

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

RUN apt-get update -y && apt-get upgrade -y && apt-get install mysql-client git vim unzip zip -y
RUN docker-php-ext-install mysqli pdo pdo_mysql 

# install composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

default.txt

server {
    listen 80;
    server_name _;

    root  /var/www/html/laravel/public;
    index index.php index.html;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

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

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

php.ini

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

今回のソースはGithubにあげてます。
github.com