LoginSignup
2

More than 3 years have passed since last update.

DockerにLaravel環境を構築する

Last updated at Posted at 2019-07-19

Docker/Laravel環境構築の備忘録です。

ゴールは、Docker上でLaravelが動くまでです。Macで実施します。

フォルダ構成/ファイルについて

今回は、以下のディレクトリ構成としました。

tree
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を指定しています。

project/docker/db/Dockerfile
FROM mysql:5.7

② project/docker/db/conf.d/my.cnf

MySQLの設定ファイルです。
⑤にて、/etc/mysql/conf.d にマウントします。

project/docker/db/conf.d/my.cnf
[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コンテナの起動オプションを記述するファイルです。

project/docker/docker-compose.yml
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で必要なモジュールを追加しています。

project/docker/web/Dockerfile
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 にマウントしています)

project/docker/web/conf.d/000-default.conf
<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の設定を行なっています。

project/docker/web/ini/php.ini
; 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アクセスも問題なさそうです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2