目次
はじめに
Laravel環境をDockerを使って構築してみたので、そのご紹介をします。
環境はweb、app、dbと、メールも使用したかったのでsmtpを用意したいと思います。
今回の環境はこちらになります。急ぎの方はファイルをダウンロードしてご利用ください。
環境構成
| # | app | ver |
|---|---|---|
| 1 | Apache | 2.4.38 |
| 2 | MariaDB | 5.5 |
| 3 | PHP | 7.4 |
| 4 | Laravel | 6.20.16 |
| 5 | MailHog | latest |
ディレクトリ構成
各ファイルはこれから作成していきますが、
まずはディレクトリを下記のように作成します。
.
├── docker
│ ├── app
│ │ ├── 000-default.conf ・・・ Apacheの設定ファイル、ドキュメントルートを設定する
│ │ ├── Dockerfile
│ │ └── php.ini ・・・ PHPの設定ファイル
│ └── db ・・・ 必要であれば、sqlファイルを配置
├── src ・・・ ここにソースを配置
├── docker-compose.yml
└── Makefile
000-default.conf
では、まずはApacheの設定ファイルを下記のように作成します。
コンテナ内の/var/www/html/webapp/publicをドキュメントルートとする設定をここでは書いています。
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/webapp/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/webapp/public>
AllowOverride All
</Directory>
</VirtualHost>
php.ini
次は、PHPの設定ファイルです。
タイムゾーンと文字コード、言語設定を行っています。
必要に応じて、設定を書き加えてください。
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
Dockerfile
次に、Apache+PHP+LaravelのDockerイメージを作成するため、Dockerfileを作成していきます。
ここでは、先ほど作成したApacheとPHPの設定ファイルを読み込みます。
Dockerイメージは、php:7.4-apacheを使用します。
FROM php:7.4-apache
#Composerのインストール
COPY --from=composer /usr/bin/composer /usr/bin/composer
# ミドルウェアのインストール
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql
# 設定ファイルの読み込み
COPY php.ini /usr/local/etc/php/
COPY 000-default.conf /etc/apache2/sites-enabled/
少しだけ説明します。
Laravelを使用するためには、composerと呼ばれるPHPのパッケージ管理システムをインストールする必要があります。
公式の手順はこちらです。この手順に従うと、以下のようにDockerfileに記載することになります。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
その場合、ハッシュ値が変更される度に、Dockerfileも変更する必要があります。
そこで、dockerのマルチステータスビルドの機能を使って、composerのイメージから必要な部分のみをコピーしてきます。
そうすることで、シンプルにでき、イメージサイズも抑えることができます。
COPY --from=composer /usr/bin/composer /usr/bin/composer
docker-compose.yml
あとは、docker-composeを使って、複数のコンテナを作っていきます。
Laravelコンテナは先ほど作成したDockerfileを利用します。
Laravelコンテナ以外は、mariadb、phpmyadmin、mailhogのコンテナを作成します。
version: '3'
services:
# laravel
app:
build: ./docker/app
container_name: web_app
ports:
- 8080:80
volumes:
- ./src:/var/www/html
# mariadb
db:
image: mariadb:5.5
container_name: web_db
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=webapp
ports:
- 3306:3306
volumes:
- ./docker/db:/var/lib/mariadb
- ./docker/db:/docker-entrypoint-initdb.d
# phpMyAdmin
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: web_phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=db
- PMA_USER=root
- PMA_PASSWORD=password
ports:
- 8081:80
# mailhog
mailhog:
container_name: web_smtp
image: mailhog/mailhog
ports:
- 8025:8025
- 1025:1025
Makefile
ここまで、作ったら、あとはビルドしていくだけですが、
長いコマンドを何度も打つのは大変なので、Makefileを作っておきます。
コマンド名は好みに合わせて変更してください。
projectのコマンドで、Laravelのプロジェクトを作成しています。
バージョンの指定や、プロジェクト名をwebappというものに指定しています。
.PHONY: build up stop down show
NAME=web_app
VERSION=1.0
#imageの作成
build:
docker-compose build
#起動
up:
docker-compose up -d
#停止
stop:
docker-compose stop
#削除
down:
docker-compose down --volumes
#コンテナ一覧
show:
docker container ls -a
#イメージの削除
rmi:
docker image prune
#Laravelプロジェクトの作成
project:
docker exec $(NAME) composer create-project "laravel/laravel=~6.0" --prefer-dist webapp
#Laravel環境へのログイン
login:
docker exec -it $(NAME) /bin/bash
ビルド
では、実際、ビルドしていきます。
Makefileを作ったので、簡単にビルドができるはずです。
make buildでイメージを作成します。make upでコンテナを起動します。make projectでLaravelプロジェクトを作成します。- http://localhost:8080 に接続するとLaravelのWelcomeページが表示されます。
ここまでできたら、Laravel環境は構築できているので、
あとはsrcディレクトリ内を編集すれば、自分のLaravelアプリができるはずです。
コンテナの停止は、make stopで、
Laravelのコンテナ内にログインする場合は、make loginを使います。
さいごに
dockerを使うことで、簡単にLaravel環境を作ることができましたね。
次回は、Laravelの使い方を紹介したいと思います。
