docker
docker-compose
LaraDock

LaradockでLaravel開発環境構築

公式サイトを参考にして、DockerでLaravel開発環境構築手順をなぞってみましたので、そのメモを残します。
かなり基本的なこともメモしているつもりなので、これからやってみようという方の参考になればと思います。

環境

  • Docker for Mac

Docker for Macをインストールしています。

$ docker --version
Docker version 17.09.0-ce, build afdb6d4
$ docker-compose --version
docker-compose version 1.16.1, build 6d1ac21

Laradockについて

ここから引用します。

Laradock is well known in the Laravel community, as the project started with single focus on running Laravel projects on Docker. Later and due to the large adoption from the PHP community, it started supporting other PHP projects like Symfony, CodeIgniter, WordPress, Drupal…

Laravelだけでなく、Symfonyなどの他フレームワーク環境もサポートするとのことです。(今となっては名前が少々紛らしい気もしますが。。)

Getting Started

それではGetting Startedの手順をなぞっていきます。
今回はA.2) Don’t have a PHP project yet:を参考にしていきます。

任意のフォルダでLaradockをclone

$ git clone https://github.com/laradock/laradock.git

環境設定ファイルを編集

この後の手順でdocker-composeを実行することになりますが、その際にdocker-composeが参照する環境設定ファイルを用意します。
雛形がリポジトリ内に用意されていますので、これをコピーします。

$ cp env-example .env

.envファイルについての説明は以下。

The “.env” file

コピーしたファイル内にApplication Pathを設定する箇所があるので、手順に従って編集します。
以下の場合、laradockディレクトリと同じ階層にproject-zという名前でディレクトリを用意することになります。

.env
APPLICATION=../project-z/

以降の手順でnginxやMySQLの環境をビルドしますが、ホスト側のポートを設定する箇所がありますので、お使いの環境で利用可能なポートを設定するようにしてください。
私はnginxのポートを変更しました。

.env
NGINX_HOST_HTTP_PORT=18080

docker-composeで環境構築

ここではUsageに記載されている例に従って、Webサーバとしてnginx、データベースにMySQLを導入します。
nginx/sites以下の設定雛形を編集します。
私はnginx配下にコピーしてから編集しました。

$ cp nginx/sites/laravel.conf.example nginx/laravel.conf

そして、rootの設定を変更します。
今回は以降の手順でmyappという名前でlaravelのプロジェクトを作成するので、そのプロジェクトのpublicディレクトリをrootに設定します。

nginx/laravel.conf
root /var/www/myapp/public;

また、nginx/Dockerfileを編集して、laravel.confを反映するようにします。

nginx/Dockerfile
ADD laravel.conf /etc/nginx/conf.d/

docker-composeでnginxとMySQLの環境をビルドし、さらにコンテナをバッググランドで起動します。
(私の環境では、nginxのビルドでエラーが発生しましたので、対処方法を後述します。)

$ docker-compose up -d nginx mysql

ビルドに成功していれば、コンテナがそれぞれ起動しているはずです。

$ docker-compose ps
         Name                        Command              State                       Ports                   
--------------------------------------------------------------------------------------------------------------
laradock_applications_1   /true                           Exit 0                                              
laradock_mysql_1          docker-entrypoint.sh mysqld     Up       0.0.0.0:3306->3306/tcp                     
laradock_nginx_1          nginx                           Up       0.0.0.0:443->443/tcp, 0.0.0.0:18080->80/tcp
laradock_php-fpm_1        docker-php-entrypoint php-fpm   Up       9000/tcp                                   
laradock_workspace_1      /sbin/my_init                   Up       0.0.0.0:2222->22/tcp  

なお、workspaceおよびphp-fpmについては、依存関係が設定されているため、docker-composeの引数に指定していなくても実行されるようになります。

Note: The workspace and php-fpm will run automatically in most of the cases, so no need to specify them in the up command.

workspace上でプロジェクト生成

workspaceコンテナ上で作業をしていきます。
workspaceコンテナに入るには、以下のコマンドを実行します。

$ docker-compose exec --user=laradock workspace bash

laradockというユーザでログインしていますが、workspaceを構築する際に作成されたユーザです。(workspaceディレクトリ配下のDockerfileを参照)
また、Composerもすでにインストール済みですので、これを使ってプロジェクトを生成します。

$ pwd
/var/www
$ composer create-project laravel/laravel myapp

なお、/var/wwwは、.envに指定したAPPLICATIONのパスをマウントしています。(docker-compose.ymlで確認できます)
つまり、この例ではproject-zディレクトリが相当します。
よって、上記コマンドで生成されたLaravelのプロジェクトは、ホスト側のproject-zディレクトリ配下に作成されることになります。

Macのhostsを編集

上記手順で作成したlaravel.confでは、バーチャルホストの設定でserver_nameにlaravel.devと設定していました。
ということで、/etc/hostsに以下の設定を追加しておきます。

127.0.0.1       laravel.dev

ブラウザからlaravel.dev:18080に接続して、Laravelの初期画面が表示されれば目標達成です。

補足:nginxのビルドエラー

プロキシ未設定のためapkコマンドでこけました。
docker-compose.yml内nginxのビルドパラメータ(args)にHTTP_PROXYを渡すようにします。

docker-compose.yml
nginx:
  build:
    context: ./nginx
    args:
      - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
      - PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT}
      - HTTP_PROXY=${HTTP_PROXY}