目的

laravel-admin使いたいだけの用途にLaradockは重すぎる……
ので、お勉強も兼ねて、docker-composeでLaravel&MySQLのみの環境を立てました。
その上でlaravel-adminの管理画面まで開けるようにしてみます。

構成

project_root_dir
├── docker-compose.yml
├── docker
│   ├── nginx
│   │   ├── Dockerfile
│   │   └── default.conf
│   ├── php
│   │   └── Dockerfile
│   └── db
│   │   ├── my.cnf
│       └── Dockerfile
└── laravel
        └── ...

手順

docker-compose.ymlを作成

# docker-compose.yml

version: "3.5"
services:
    app:
        build:
            context: .
            dockerfile: ./docker/php/Dockerfile
            args:
                PROJECT_NAME: app_admin
        volumes: 
            - ./:/var/www/html
        depends_on:
            - database
        links:
            - database
        ports: 
            - "4000:80"
            - "4001:8080"
        tty: true
    database:
        image: mysql:5.7
        restart: always
        env_file: .env_db
        ports:
            - "23306:3306"
        volumes:
            - "./docker/database/docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d"
            - "./docker/database/my.cnf:/etc/mysql/conf.d/my.cnf"
    web:
        build: ./docker/nginx
        ports:
            - 80:80
        depends_on:
            - app
        volumes:
            - ./:/var/www/html
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        links:
            - app

appコンテナ設定

composerはもうここに含めます。

# ./docker/php/Dockerfile

FROM php:7-fpm
COPY php.ini /usr/local/etc/php/
RUN apt-get update && apt-get install -y \
  libfreetype6-dev libjpeg62-turbo-dev libpng-dev libmcrypt-dev libonig-dev \
  git vim unzip \
  && docker-php-ext-install pdo_mysql mysqli gd iconv \
  && apt-get clean
# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

webコンテナ設定

# ./docker/nginx/Dockerfile

FROM nginx:latest
RUN apt-get update && apt-get install -y \
    vim \
    unzip \
    zip \
    git

後々laravelディレクトリを作るので、設定ファイルのルートは/var/www/html/laravel/~にしておきます。

# ./docker/nginx/default.conf

server {
    listen       80;
    index index.php index.html;
    server_name php-docker.local;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/laravel/public;  # ココ

    location / {
     try_files $uri $uri/ @laravel;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root /var/www/html;
    }

    location ~ \.php$ {
    try_files $uri $uri/ @laravel;
        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;
    }

    location @laravel {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /var/www/html/laravel/public/index.php;  // ココ
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

dbコンテナの設定

# docker/database/my.cnf

[mysql]
default-character-set=utf8mb4

[mysqld]
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

[mysqld_safe]
timezone = UTC
default-time-zone = UTC

後はHOST情報などを.enb_db(docker-compose.ymlで指定したファイル)に記述する。

MYSQL_DATABASE=[my_database_name]
MYSQL_USERNAME=root
MYSQL_PASSWORD=
MYSQL_HOSTNAME=127.0.0.1
MYSQL_ROOT_PASSWORD=
API_MYSQL_PORT=23306

起動&Laravelのインストール

# 起動
$ docker-compose up -d

# laravelプロジェクトの作成
$ docker-compose exec app /bin/bash  
app$ composer create-project --prefer-dist laravel/laravel laravel

http://localhost/ でwelcomページが見られるようになる。

Laravel環境変数ファイルの修正

laravel/.envを、DB情報を作成したdockerコンテナに合わせて修正。

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=[my_database_name]
DB_USERNAME=root
DB_PASSWORD=

laravel-adminをインストール

composerを使用してインストールし、有効化する。 公式ドキュメントがかなりまとまっていて素敵です。

$ docker-compose exec app /bin/bash 
app $ cd laravel
app/laravel $ composer require encore/laravel-admin
app/laravel $ php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
app/laravel $ php artisan admin:install

http://localhost/admin/に接続して、ログイン画面が出ればおk!
admin/adminで入れます。

補足:既にある開発環境のDBコンテナに接続する

なんらかの理由で、管理画面開発に使用したいDBコンテナが既存のdocker-compose.ymlにある場合。
(開発側はPythonでもりもり作業してるからLaravelのディレクトリ混ぜたくないとかそう言った場合)

前提として、以下であれば比較的簡単に繋げられます。

  • DBコンテナ側でなんらかのDockerNetworkを設定している
  • 開発環境の方でもdocker-compose up -dを実行している (直接でも良いし、もしくは開発環境のリポジトリをサブモジュール として引っ張ってきて叩くなどする)

例えばtest-appという名前のnetworkを設定している↓のであれば、

# 既存docker-compose.yml

version: "3.5"
services:
  database:
    hostname: database
    image: mysql:5.7
    ~~~
    networks:
      - default
networks:
  default:
    name: test-app

管理画面側のdocker-compose.ymlでそれを使用するように書き換える↓

# docker-compose.yml

version: "3.5"
services:
    app:
        build:
            context: .
            dockerfile: ./docker/php/Dockerfile
            args:
                PROJECT_NAME: recipe_app_admin
        restart: always
        volumes: 
            - ./:/var/www/html
        ports: 
            - "4000:80"
            - "4001:8080"
        tty: true
        networks:
            - default
    # dbコンテナの設定は不要になる
    web:
        build: ./docker/nginx
        restart: always
        ports:
            - 80:80
        depends_on:
            - app
        volumes:
            - ./:/var/www/html
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        links:
            - app
        networks:
            - default

networks:
  default:
    name: test-app
    external: true  # 外部ファイルで設定していることを指定

後はよしなに環境変数ファイルを更新し、開発環境→管理画面開発環境の順にdocker-compose up -dを叩くだけです。