Windows10 Home + Docker + Laravel　構築メモ

## はじめに

この記事は、とりあえずDocker上にLaravelを構築する流れを記載しています。
各ファイルの設定内容などの詳細については、下記の記事を参照いただけたらと思います。

[【初心者向け】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)
[windows 10 home で docker を導入するメモ](https://qiita.com/idani/items/fb7681d79eeb48c05144)

### 導入環境
Windows10 Home 64bit
Intel(R) Core(TM) i7-4500U CPU

### 構築環境
PHP 7.3.12
nginx/1.17.6
mysql  Ver 8.0.18
Laravel Framework 6.0.4
DockerToolbox-19.03.1

# Docker
### windows10 HomeではDocker for Windowsはインストールできないので、Docker Toolboxをインストールする

## 1.「Docker Toolbox」のダウンロード
下記のURLにアクセスし、Toolbox Releases をクリック
https://docs.docker.com/toolbox/overview/
![toolbox_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/deeb0516-b6a9-f336-4fd2-a2f5a6133d7b.png)

DockerToolbox-19.03.1をダウンロードする
![toolbox_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/c60e8693-9ae9-2f3e-e503-107d2ae2f937.png)

## 2. ダウンロードしたファイルを実行
## 3. インストールが開始：「Next」を押して継続
![toolbox_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/4a34f952-7ebe-9ee0-cf00-e014aabf317a.png)

「Help Docker improve Toolbox」のチェックは外してContinueをクリックします。

## 4. インストール先の確認：「Next」を押して次画面に
![toolbox_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/124d3507-78bc-a9c0-0d36-225881b22df8.png)

## 5. インストールするコンポーネントの選択：「Next」を押して次画面に
virtualBoxがすでにインストールされている場合は、virtualBoxのチェックを外す。
![toolbox_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/d384a2a8-7421-6f10-5b35-7e4404939e40.png)

## 6. 追加設定：「Next」を押して次画面に
Install VirtualBox with NDIS5 driver[default NDIS6のチェックを外す。
![toolbox_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/9c9ace63-7e29-9ccd-daec-29759d8761d8.png)

※チェックを入れるとVirtualboxのバグで起動できない。

```
Error setting up host only network on machine start: The host-only adapter we just created is not visible. This is a well known VirtualBox bug. You might want to uninstall it and reinstall at least version 5.0.12 that is is supposed to fix this issue
```

## 7. インストールの開始：「Install」を押してインストールを開始
![toolbox_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/7123a830-dc5e-f78b-9661-77f9c1560d4c.png)

## 8. インストール：インストールが完了するまでお待ち下さい
![toolbox_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/c0751140-73fc-61a1-ecf9-55ac9a4363c1.png)

## 9. インストールが無事完了しましたので「Finish」を押してインストールを終了してください
![toolbox_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/e1df09b1-5183-0ae3-717d-9f890d50cca5.png)

## 10.「Docker」の起動確認
Docker Quickstart Terminalをクリック
![toolbox_10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/1bdf130f-48c4-f546-ea50-5603061cd442.png)

![toolbox_11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551600/f89345ff-72fc-8892-9f31-30970560905b.png)
完了！

# Laravel
## 1. 作業ディレクトリを作成
```
$ mkdir docker-laravel
$ cd docker-laravel
```
###  ディレクトリ構成

```txt:docker-laravel/
.
├── README.md
├── docker
│   ├── mysql
│   │   └── Dockerfile
│   │   └── my.cnf
│   ├── nginx
│   │   └── default.conf # nginxの設定ファイル
│   └── php
│       ├── Dockerfile
│       └── php.ini
├── docker-compose.yml
├── logs
│   ├── access.log       # nginxのアクセスログ
│   ├── error.log        # nginxのエラーログ
│   ├── mysql-error.log
│   ├── mysql-query.log
│   ├── mysql-slow.log
│   └── php-error.log
└── src # Laravelをインストールするディレクトリ
```

## 2. 環境ファイル(.env)を作成
```
$ vim .env
```
```text:.env
DB_NAME=homestead
DB_USER=homestead
DB_PASS=secret
TZ=Asia/Tokyo
```
※パスワードは適宜変更してください。

## 3. docker-compose.yml
```
$ vim docker-compose.yml
```
```yml:docker-compose.yml
version: "3"
services:
  app:                         # アプリケーションサーバ用コンテナ
    build:
      context: ./docker/php
      args:
        - TZ=${TZ}
    volumes:
      - ./src:/work
      - ./logs:/var/log/php
      - ./docker/php/php.ini:/usr/local/etc/php/php.ini
    working_dir: /work
    environment:
      - DB_CONNECTION=mysql
      - DB_HOST=db
      - DB_DATABASE=${DB_NAME}
      - DB_USERNAME=${DB_USER}
      - DB_PASSWORD=${DB_PASS}
      - TZ=${TZ}
  web:                       # Webサーバ用コンテナ
    image: nginx:1.17-alpine
    depends_on:
      - app
    ports:
      - 80:80
    volumes:
      - ./src:/work
      - ./logs:/var/log/nginx
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    environment:
      - TZ=${TZ}
  db:                           # DBサーバ用コンテナ
    build: ./docker/mysql
    volumes:
      - db-store:/var/lib/mysql-files
      - ./logs:/var/log/mysql
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}

volumes:
  db-store:
```
## 4. PHP
### Dockerfile
```
$ mkdir -p docker/php
$ vim docker/php/Dockerfile
```
```Dockerfile:Dockerfile
FROM php:7.3-fpm-alpine
LABEL maintainer "your-name"

ARG TZ
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer

RUN set -eux && \
  apk add --update-cache --no-cache --virtual=.build-dependencies tzdata && \
  cp /usr/share/zoneinfo/${TZ} /etc/localtime && \
  apk del .build-dependencies && \
  docker-php-ext-install bcmath pdo_mysql && \
  curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer && \
  composer config -g repos.packagist composer https://packagist.jp && \
  composer global require hirak/prestissimo
```
### php.ini
```
$ vim docker/php/php.ini
```

```ini:php.ini
error_reporting = E_ERROR | E_WARNING | E_PARSE | E_NOTICE
display_errors = stdout
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
upload_max_filesize = -1
memory_limit = -1
post_max_size = 100M
max_execution_time = 900
max_input_vars = 100000
default_charset = UTF-8

[Date]
date.timezone = ${TZ}

[mbstring]
mbstring.language = Japanese
```

## 5. MySQL
### Dockerfile
```
$ mkdir -p docker/mysql
$ vim docker/mysql/Dockerfile
```
```Dockerfile:Dockerfile
FROM mysql:latest
ADD ./my.cnf /etc/mysql/my.cnf
RUN chmod 644 /etc/mysql/my.cnf
```

### my.cnf

```
$ vim docker/mysql/my.cnf 
```
```cnf:my.cnf
[mysqld]
# character set / collation
character-set-server = utf8mb4
collation-server = utf8mb4_bin

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# MySQL8 caching_sha2_password to mysql_native_password
default-authentication-plugin = mysql_native_password

# Error Log
log-error = /var/log/mysql/mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4
```

## 6. nginx
```
$ mkdir -p docker/nginx
$ vim docker/nginx/default.conf
```
```conf:default.conf
server {
    listen 80;
    root /work/public;
    index index.php;
    charset utf-8;

    location / {
        root /work/public;
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
```


## 7. サービス用のコンテナの構築
```
$ docker-compose up -d --build
```
```
$ docker-compose ps
        Name                      Command              State          Ports
----------------------------------------------------------------------------------
docker-laravel_app_1   docker-php-entrypoint php-fpm   Up      9000/tcp
docker-laravel_db_1    docker-entrypoint.sh mysqld     Up      3306/tcp, 33060/tcp
docker-laravel_web_1   nginx -g daemon off;            Up      0.0.0.0:80->80/tcp
```
## 8. PHPのバージョン確認(コンテナの外からコマンド実行)
```
docker-compose exec app php -v
PHP 7.3.12 (cli) (built: Nov 22 2019 11:50:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.12, Copyright (c) 1998-2018 Zend Technologies
```
## 9. nginxのバージョン確認
```
docker-compose exec web nginx -v
nginx version: nginx/1.17.6
```
## 10.MySQLのバージョン確認
```
docker-compose exec db mysql -V
mysql  Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)
```


## 11. Laravelをインストールする
```
$ docker-compose exec app ash
/work # composer create-project --prefer-dist "laravel/laravel=6.*" .
/work # php artisan -V
Laravel Framework 6.0.4
/work # exit
```
## 12. マイグレーション実行
```
$ docker-compose exec app ash
/work # php artisan migrate

Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.05 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)

/work # exit
```
## 13. Laravel トップ画面の表示
```
$ docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
default   *        virtualbox   Running   tcp://192.168.xx.xxx:8000
```
http://192.168.xx.xxx　(URLのIPアドレス部を指定する)


Laravelのトップ画面が表示されることを確認できれば完了。


## おわりに
手順通りやれば、とりあえずDocker上にLaravelを構築出来るように書いたつもりですが、うまくいかないところや不足しているところはコメントなどで指摘してくださると助かります。
ひとまず構築し、参照記事を確認しながら、色々設定を変えることで理解が深まると思います。