LARADOCK で LARAVEL を開発しよう（Part 2）

#1. はじめに

前回、
https://qiita.com/nguyenngocpfievk56/items/8974e21daab795efc60e
パーツ１で、皆さんにDOCKERとLARADOCKを少し紹介しました。が、LARADOCKの設定手順についてはまだ書いてないので、今回、この記事で具体的にLARADOCKを設定しかた、使いかたを紹介したいと思います。
#2. LARADOCK設定方法

例えば、NgCMusicというプロジェクトに参加しますが、NgCMusicの仕様が決められて、これから最初から開発します。
とりあえず、ngcmusicというフォルダーを作成します。ngcmusicの保存される場所はどこでも構いません。次、ngcmusicに遷移して、githubから、LARADOCKのソースコードをCLONEしましょう。
> git clone https://github.com/Laradock/laradock.git

そうすると、ngcmusic/laradockの中にLARADOCKのソースコードが入るはずです。次のステップにいく前に、LARADOCKの構築について少し説明いただきます。
###2.1: LARADOCKの構築
とりあえず、下の方のdocker-compose.ymlというファイルを見ましょう。

```ruby:docker-compose.yml
version: '3'

networks:
  frontend:
    driver: ${NETWORKS_DRIVER}
  backend:
    driver: ${NETWORKS_DRIVER}

volumes:
  mysql:
    driver: ${VOLUMES_DRIVER}
  percona:
    driver: ${VOLUMES_DRIVER}
  mssql:
    driver: ${VOLUMES_DRIVER}
  postgres:
    driver: ${VOLUMES_DRIVER}
  memcached:
    driver: ${VOLUMES_DRIVER}
  redis:
    driver: ${VOLUMES_DRIVER}
  neo4j:
    driver: ${VOLUMES_DRIVER}
  mariadb:
    driver: ${VOLUMES_DRIVER}
  mongo:
    driver: ${VOLUMES_DRIVER}
  minio:
    driver: ${VOLUMES_DRIVER}
  rethinkdb:
    driver: ${VOLUMES_DRIVER}
  phpmyadmin:
    driver: ${VOLUMES_DRIVER}
  adminer:
    driver: ${VOLUMES_DRIVER}
  aerospike:
    driver: ${VOLUMES_DRIVER}
  caddy:
    driver: ${VOLUMES_DRIVER}
  elasticsearch:
    driver: ${VOLUMES_DRIVER}

services:

### Workspace Utilities ##################################
    workspace:
      build:
        context: ./workspace
        args:
        ------省略-----
      extra_hosts:
        - "dockerhost:${DOCKER_HOST_IP}"
      ports:
        - "${WORKSPACE_SSH_PORT}:22"
      tty: true
      environment:
        - PHP_IDE_CONFIG=${PHP_IDE_CONFIG}
      networks:
        - frontend
        - backend
   php-fpm:
      build:
        context: ./php-fpm
        args:
          - PHP_VERSION=${PHP_VERSION}
          - INSTALL_XDEBUG=${PHP_FPM_INSTALL_XDEBUG}
          - INSTALL_BLACKFIRE=${INSTALL_BLACKFIRE}
          - ------省略--------
   nginx:
      build:
        context: ./nginx
        args:
          - PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
          - ------省略--------
```

docker-compose.ymlの内容は長いんですが、だいたい上記と同じです。
この記事を書いてる時点に、LARADOCKの最新バージョンは３なんですが、一番上に
> version: '3'

と書いてあります。
次は、ネットワークの定義部分です：

```ruby:ネットワーク部分
networks:
  frontend:
    driver: ${NETWORKS_DRIVER}
  backend:
    driver: ${NETWORKS_DRIVER}
```

DOCKERの基本知識なんですが、DOCKERのネットワークはNONE, HOST, BRIGDEと分けられますが、一番よく使ってるのは　BRIDGEです。
詳細は、
https://docs.docker.com/network/
ここで参考してください。
ですげ、上記のソースコードに　{NETWORKS_DRIVER}　と書いてあります。これは、変数です。
docker-compose.ymlの中に、${〇〇}という書き方が結構でるが、全ては変数です。それらの値は、.envというファイルで代入されます。が、デフォルトで、CLONEされたLARADOCKに.envの代わりに、.env-exampleが入ります。その「.env-example」の内容をちょっと見ましょう。21,22行目に

```ruby:.env-example
# All Networks driver
NETWORKS_DRIVER=bridge
```

と書いてあります。それを見ると、networksはBRIDGEタイプを使うのがわかります。

次に行きましょう。

```ruby:docker-compose.yml
volumes:
  mysql:
    driver: ${VOLUMES_DRIVER}
  percona:
    driver: ${VOLUMES_DRIVER}
  mssql:
    driver: ${VOLUMES_DRIVER}
  postgres:
    driver: ${VOLUMES_DRIVER}
  memcached:
    driver: ${VOLUMES_DRIVER}
  redis:
    driver: ${VOLUMES_DRIVER}
  neo4j:
    driver: ${VOLUMES_DRIVER}
  mariadb:
    driver: ${VOLUMES_DRIVER}
  mongo:
    driver: ${VOLUMES_DRIVER}
  minio:
    driver: ${VOLUMES_DRIVER}
  rethinkdb:
    driver: ${VOLUMES_DRIVER}
  phpmyadmin:
    driver: ${VOLUMES_DRIVER}
  adminer:
    driver: ${VOLUMES_DRIVER}
  aerospike:
    driver: ${VOLUMES_DRIVER}
  caddy:
    driver: ${VOLUMES_DRIVER}
  elasticsearch:
    driver: ${VOLUMES_DRIVER}
```

ここで、VOLUMESを定義されます。VOLUMESは何かというと、基本にDOCKERのCONTAINERにはデータが保存できないので、HOST（サーバー、ローカル）のどこかと連携して、そこにデータを保存しないといけません。そんな連携はVOLUMESと呼びます。
上記のソースコードを見ると、実行されるCONTAINERは全て同じなVOLUMESを使うのがわかります。なぜかというと、一つのシステムなので各CONTAINERは他のCONTAINERとデータを共有したいからです。　{NETWORKS_DRIVER}　と同じく、.env-exampleを見たら、${VOLUMES_DRIVER}の値がわかります。

docker-compose.ymlの残る部分は、全ての使えるCONTAINERの定義です。それらの中に、workspaceというCONTAINERも入ってます。このCONTAINERで、他のCONTAINERを管理できます。

ここまで、docker-compose.ymlのことがなんとなくわかるでしょうか。
LARADOCKの中に、たくさんのフォルダーも入ってますね、nginx, php-fpm, mysql, phpmyadmin などです。それぞれの中に、DockerfileとDockerのimgのconfigファイルが入ります。

###2.2: LARADOCKの設定を続きます
laradockフォルダの中に、
>cp env-example .env

を実行して、.envを作成します。
LARAVELの開発するため、workspace, nginx, mysqlが必要で、
>docker-compose up -d nginx mysql workspace 

で起動できます。
phpmyadminを使いたい場合、
>docker-compose up -d nginx mysql workspace phpmyadmin

を実行します。
そうしたあとで、
http://localhost:8080/
でphpmyadminにアクセスできるようになります。

次は、LARAVELのソースコードを作成しましょう。
workspaceに入るため、
>docker-compose exec workspace bash

を実行します。
workspaceに、もうPHPとCOMPOSERが入ってるので、
>composer create-project laravel/laravel --prefer-dist ngcmusic_project

で、プロジェクトを作成できます。
そうしたあとで、ngcmusicのしたに、laradockだけでわなく、ngcmusic_projectというフォルダも入ります。ngcmusic_projectにLARAVELのソースコードがちゃんと入るはずです。

次、プロジェクトを実行できるように、.envを開いて、８行目を
> APP_CODE_PATH_HOST=../ngcmusic_project/

に修正します。
一回、RUNしてるCONTAINERを
> docker-compose down

で全てSTOPして、

> docker-compose up -d workspace nginx mysql phpmyadmin

で再起動しましょう。
そうすると、今
http://localhost/
でLARAVELのソースコードを確認できます。

今回は、ここにおしまいいただきたいと思います、次のパーツで、LARADOCKのカスタマイズについて説明します。
#３. 結論

LARADOCKでたくさん便利なDOCKERのIMAGEを集めて、DOCKER-COMPOSEで簡単に管理して、使うことができます。