Docker/Laravel環境構築の備忘録です。
ゴールは、Docker上でLaravelが動くまでです。Macで実施します。
##フォルダ構成/ファイルについて
今回は、以下のディレクトリ構成としました。
project
├── docker
│ ├── db
│ │ ├── Dockerfile ①
│ │ ├── conf.d
│ │ │ └── my.cnf ②
│ │ ├── data ③
│ │ └── initdb.d ④
│ ├── docker-compose.yml ⑤
│ └── web
│ ├── Dockerfile ⑥
│ ├── conf.d
│ │ └── 000-default.conf ⑦
│ └── ini
│ └── php.ini ⑧
└── laravel ⑨
順番に説明します。
###① project/docker/db/Dockerfile
Dockerコンテナの構成内容を記述します。
ここでは、Dockerイメージとして、MySQLを指定しています。
FROM mysql:5.7
###② project/docker/db/conf.d/my.cnf
MySQLの設定ファイルです。
⑤にて、/etc/mysql/conf.d にマウントします。
[mysqld]
character-set-server=utf8mb4
explicit-defaults-for-timestamp=1
[client]
default-character-set=utf8mb4
###③ project/docker/db/data
ディレクトリです。
⑤にて、/var/lib/mysql にマウントします。
/var/lib/mysql は、MySQLのデータディレクトリとなります。
(Dockerを停止しても消えないように)
###④ project/docker/db/initdb.d
こちらもディレクトリです。
⑤にて、/docker-entrypoint-initdb.d にマウントします。
現状、何も置いておりませんが、/docker-entrypoint-initdb.d にSQLやスクリプトを置くことで、初期データを設定可能です。
(そのうち使うかもということで用意しています)
###⑤ project/docker/docker-compose.yml
Dockerコンテナの起動オプションを記述するファイルです。
services:
web:
build: ./web/
volumes:
- ./web/ini/php.ini:/usr/local/etc/php/php.ini
- ./web/conf.d/000-default.conf:/etc/apache2/sites-available/000-default.conf
- ../laravel:/var/www/laravel
ports:
- 80:80
db:
build: ./db/
environment:
MYSQL_DATABASE: laravel_db
MYSQL_USER: user
MYSQL_PASSWORD: password
MYSQL_ROOT_PASSWORD: rootpassword
volumes:
- ./db/initdb.d:/docker-entrypoint-initdb.d
- ./db/conf.d:/etc/mysql/conf.d
- ./db/data:/var/lib/mysql
ports:
- "3306:3306"
以下、簡単ですが説明です。
- build:Dockerfileのあるディレクトリパスの指定
- environment:環境変数の指定(ここでは、MySQLに必要なものを定義)
- volumes:マウントの指定(ホスト:コンテナ)
- ports:ポートの指定(ホスト:コンテナ)
###⑥ project/docker/web/Dockerfile
①と同様、Dockerコンテナの構成内容を記述します。
ここでは、Dockerイメージとして、PHPを指定しています。
また、RUNで必要なモジュールを追加しています。
FROM php:7.3-apache
RUN set -x && \
pecl install xdebug && \
docker-php-ext-enable xdebug && \
a2enmod rewrite && \
docker-php-ext-install pdo_mysql
- xdebug:PHPStormでリモートデバッグしたかったので追加
- rewrite:laravelの認証機能を追加した時、上手く動かなかったので追加
###⑦ project/docker/web/conf.d/000-default.conf
Apacheの設定ファイルです。
⑤にて、/etc/apache2/sites-available/000-default.conf にマウントします。
Laravelの公開フォルダは、public のため、DocumentRoot を /var/www/laravel/public としています。
(laravelは、⑤で /var/www/laravel にマウントしています)
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/laravel/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
###⑧ project/docker/web/ini/php.ini
PHPの設定ファイルです。
⑤にて、/usr/local/etc/php/php.ini にマウントします。
ここでは、xdebugの設定を行なっています。
; xdebug
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_connect_back = Off
xdebug.remote_host = docker.for.mac.localhost
###⑨ project/laravel
project直下で、以下のコマンドを投入すると、laravelディレクトリが作成されます。
中には、プロジェクト一式揃っています。
$ composer create-project laravel/laravel --prefer-dist
※ composerの導入は割愛します。
##Dockerの起動
project/docker配下で実施します。まずは、buildから。
$ docker-compose build
Building web
Step 1/2 : FROM php:7.3-apache
---> 59d2cf691156
Step 2/2 : RUN set -x && pecl install xdebug && docker-php-ext-enable xdebug && a2enmod rewrite && docker-php-ext-install pdo_mysql
---> Using cache
---> bc81175279b3
Successfully built bc81175279b3
Successfully tagged docker_web:latest
Building db
Step 1/2 : FROM mysql:5.7
---> 7452c4ea4f17
Step 2/2 : RUN touch /var/log/mysql/mysqld.log
---> Using cache
---> 3c43b21359e9
Successfully built 3c43b21359e9
Successfully tagged docker_db:latest
次に起動します。
$ docker-compose up -d
Creating docker_db_1 ... done
Creating docker_web_1 ... done
念の為、起動していることを確認します。
$ docker-compose ps
Name Command State Ports
-----------------------------------------------------------------------------------------
docker_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp, 33060/tcp
docker_web_1 docker-php-entrypoint apac ... Up 0.0.0.0:80->80/tcp
ブラウザから
http://localhost
にアクセスすると、laravelの画面が表示されます。
##最後に
ここでは書いていないですが、この環境にLaravelの認証機能を追加してみたところ、ユーザ追加が出来ました。
MySQLにも追加したユーザのデータがありましたので、DBアクセスも問題なさそうです。