今まではLaravelのローカル開発環境はVagrant+VirtualBox+Homesteadを使ったが,Vagrant,VirtualBox,OSのバージョンアップにより、数時間をかけて環境を作り直したことがあります。今回は、Dockerを使ったので、下記の記事を参考しながら、環境構築をしてみました。
docker-composeでLaravelの開発環境を整える方法とその解説
とてもわかり易い記事ですが、開発に必要なhttps対応や、Mysql8とRedisなど必要な設定対応がなかったので、メモとしてを整理しました。
★ベストプラクティスかどうか分からないので、ご指摘ください。
読む対象:
- docker + laravel 開発者で、 HomesteadからDockerへ移行したい方
- nginxのhttps対応、Mysql8の設定、redisの設定、何れが必要な方
ホストマシンOS
Ubuntu18.0.4
全体目次:
手順
初期のフォルダー構造
docker-compose.yaml設定
phpコンテナのDockerfile設定
nginxのhttps対応
project source codeダウンロード
mysql8対応設定
redisコンテナと設定
動作確認
##手順
###初期のフォルダー構造
まず/home/user/の下に初期のフォルダー構造を作成します。
├── docker
│ └── web
│ └── default.conf
| └── php
| └── Dockfile
| └── mysql
├── docker-compose.yml
└── project
※ projectフォルダーはproject(laravel)source code を入れるところ
ファイル**~/docker/docker-compose.yaml**, ~/docker/web/default.conf, ~/php/Dockfileの設定は下記になります。
###docker-compose.yaml設定
version: '3'
services:
web:
image: nginx:1.18.0
container_name: web
ports:
- 443:443
depends_on:
- app
volumes:
- ./web/default.conf:/etc/nginx/conf.d/default.conf
- ./server.crt:/etc/nginx/server.crt
- ./server.key:/etc/nginx/server.key
- .:/var/www/html
app:
build: ./php
container_name: app
volumes:
- .:/var/www/html
depends_on:
- mysql
mysql:
build: ./mysql
image: mysql:8
container_name: mysql
environment:
MYSQL_DATABASE: databasename
MYSQL_USER: homestead
MYSQL_PASSWORD: secret
MYSQL_ROOT_PASSWORD: secret
ports:
- "3306:3306"
volumes:
- ./mysql/mysql-confd:/etc/mysql/conf.d
- ./mysql/data:/var/lib/mysql
redis:
image: redis:3.2.12-alpine # 以前はlatestだった
container_name: redis
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
restart: unless-stopped
volumes:
mysql-data:
###nginxのhttps対応
(1)~/docker/web/default.conf設定
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
server {
listen 80;
server_name localhost;
return 301 https://$host$request_uri;
}
server {
listen 443 ;
server_name localhost;
ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;
root /var/www/html/project;
index index.php index.html index.htm;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
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;
}
}
(2)sslキーを作成
自己署名証明書でhttpsアクセスができるコンテナを作るためにsslキーが必要になります。
$cd ~/docker
$openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365
を実行したら、server.keyとserver.crtを~/dockerの下に確認できました。
###phpコンテナのDockerfile設定]
FROM php:7.2-fpm
# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim
RUN docker-php-ext-install pdo_mysql
RUN apt-get update \
&& apt-get install -y libpq-dev \
&& docker-php-ext-install mysqli pdo pdo_pgsql
RUN pecl install -o -f redis \
&& rm -rf /tmp/pear \
&& docker-php-ext-enable redis
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
&& apt-get update \
&& apt-get install -y nodejs
#Add user for laravel application
RUN groupadd -g 1000 teiri && \
useradd -u 1000 -ms /bin/bash -g teiri teiri
# Install Node
RUN apt-get update &&\
apt-get install -y --no-install-recommends gnupg &&\
curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
apt-get update &&\
apt-get install -y --no-install-recommends nodejs &&\
npm config set registry https://registry.npm.taobao.org --global &&\
npm install --global gulp-cli
###project source codeダウンロード
※既に自分のPCにプロジェクトソースコード管理している場合は下記の部分をスキップできます。
projectソースコード用フォルダー作成
$mkdir ~/docker/projectname
$cd ~/docker/projectname
git初期化
$cd ~/docker
$git init
laravelプロジェクトのソースコード取得
$git remote add origin 追加したいリポジトリ
$git clone リポジトリのURL
~/docker/projectnameのフォルダーが作成されることが確認できます。
laravelインストール
composer installでcomposer.jsonに定義されているlaravel framesなど必要なパッケージをインストールします。
$composer install
※Homesteadの環境よりずっと速い!
###mysql8対応設定
.envファイルを設定
必要があれば、DBの設定をdocker-compose.yamlと一致するようにします
例:
DB_HOST="mysql"
DB_PORT=3306
DB_DATABASE="databasename"
DB_USERNAME="homestead"
DB_PASSWORD="secret"
MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルトなので、
もしmysql 5.* からmysql8に変更した場合は認証方式の設定を変更する必要があります。
(1)mysqlのコンテナに入る
コンテナを起動
$docker-composer up -d
$docker exec -it {mysql_container_name} bash
(2)rootユーザとしてログイン,passwordはdocker-compose.yamlの中の設定一致する必要があります。
$mysql -uroot -p
認証方式を変更
ALTER USER 'homestead'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';
注)↑のコマンドに使うユーザとパスワードはdocker-compose.yamlに設定された内容が一致する必要があります。
変更を反映するために、コンテナ再起動
$docker-compose down
$docker-compose up -d
プロジェクトのデータベーステーブル作成
appコンテナに入る
docker exec -it --user {username} app bash
cd project フォルダー
cd /var/www/html/project
$ php artisan migrate
必要なSeed data作成
$ php artisan db:seed
###redisコンテナと設定
redisのIPアドレス確認
docker inspect redis | grep "IPAddress"
.envでRedis設定
REDIS_HOST="172.23.0.2"
REDIS_PASSWORD="null"
REDIS_PORT="6379"
##動作確認
最後にブラウザで確認サイト確認
https://localhost