目的
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
を叩くだけです。