Ubuntu上Docker(docker-compose)を使ってmysql8,https対応、redis使用のngnix+Laravel環境構築

今まではLaravelのローカル開発環境はVagrant+VirtualBox+Homesteadを使ったが,Vagrant,VirtualBox,OSのバージョンアップにより、数時間をかけて環境を作り直したことがあります。今回は、Dockerを使ったので、下記の記事を参考しながら、環境構築をしてみました。
[docker-composeでLaravelの開発環境を整える方法とその解説](https://www.membersedge.co.jp/blog/laravel-development-environment-with-docker-compose/)
とてもわかり易い記事ですが、開発に必要なhttps対応や、Mysql8とRedisなど必要な設定対応がなかったので、メモとしてを整理しました。
★ベストプラクティスかどうか分からないので、ご指摘ください。

**読む対象：**
* docker + laravel 開発者で、 HomesteadからDockerへ移行したい方
* nginxのhttps対応、Mysql8の設定、redisの設定、何れが必要な方

**ホストマシンOS**
Ubuntu18.0.4

全体目次：
[手順](#手順)
[初期のフォルダー構造](#初期のフォルダー構造)
[docker-compose.yaml設定](#docker-compose.yaml設定)
[phpコンテナのDockerfile設定](#phpコンテナのdockerfile設定])
[nginxのhttps対応](#nginxのhttps対応)
[project source codeダウンロード](#project-source-codeダウンロード)
[mysql8対応設定](#mysql8対応設定)
[redisコンテナと設定](#redisコンテナと設定)
[動作確認](#動作確認)


##手順

###初期のフォルダー構造
まず/home/user/の下に初期のフォルダー構造を作成します。

```
├── docker
│   └── web
│       └── default.conf
|   └── php
|       └── Dockfile
|   └── mysql
├── docker-compose.yml
└── project
```
※ projectフォルダーはproject(laravel)source code を入れるところ
ファイル**~/docker/docker-compose.yaml**, **~/docker/web/default.conf**, **~/php/Dockfile**の設定は下記になります。

###docker-compose.yaml設定

```~/docker/docker-compose.yaml設定
version: '3'
services:
  web:
    image: nginx:1.18.0
    container_name: web
    ports:
      - 443:443
    depends_on:
      - app
    volumes:
      - ./web/default.conf:/etc/nginx/conf.d/default.conf
      - ./server.crt:/etc/nginx/server.crt
      - ./server.key:/etc/nginx/server.key
      - .:/var/www/html
  app:
    build: ./php
    container_name: app
    volumes:
      - .:/var/www/html
    depends_on:
      - mysql
  mysql:
    build: ./mysql

 image: mysql:8
    container_name: mysql
    environment:
      MYSQL_DATABASE: databasename
      MYSQL_USER: homestead
      MYSQL_PASSWORD: secret
      MYSQL_ROOT_PASSWORD: secret
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/mysql-confd:/etc/mysql/conf.d
      - ./mysql/data:/var/lib/mysql

  redis:
    image: redis:3.2.12-alpine # 以前はlatestだった
    container_name: redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    restart: unless-stopped
volumes:
        mysql-data:
```



###nginxのhttps対応

**(1)~/docker/web/default.conf設定**

```ruby:default.conf設定
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

server {
    listen 80;
    server_name localhost;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ;
    server_name localhost;

    ssl on;
    ssl_certificate /etc/nginx/server.crt;
    ssl_certificate_key /etc/nginx/server.key;

    root  /var/www/html/project;
    index index.php index.html index.htm;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        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;
    }
}
```
**(2)sslキーを作成**
自己署名証明書でhttpsアクセスができるコンテナを作るためにsslキーが必要になります。

```
$cd ~/docker
$openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365
```
を実行したら、server.keyとserver.crtを~/dockerの下に確認できました。

###phpコンテナのDockerfile設定]
```
FROM php:7.2-fpm

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN docker-php-ext-install pdo_mysql

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install mysqli pdo pdo_pgsql

RUN pecl install -o -f redis \
    &&  rm -rf /tmp/pear \
    &&  docker-php-ext-enable redis

RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - \
    && apt-get update \
    && apt-get install -y nodejs

#Add user for laravel application
RUN groupadd -g 1000 teiri && \
    useradd -u 1000 -ms /bin/bash -g teiri teiri


# Install Node
RUN apt-get update &&\
    apt-get install -y --no-install-recommends gnupg &&\
    curl -sL https://deb.nodesource.com/setup_10.x | bash - &&\
    apt-get update &&\
    apt-get install -y --no-install-recommends nodejs &&\
    npm config set registry https://registry.npm.taobao.org --global &&\
    npm install --global gulp-cli

```

###project source codeダウンロード
※既に自分のPCにプロジェクトソースコード管理している場合は下記の部分をスキップできます。
projectソースコード用フォルダー作成

```
$mkdir ~/docker/projectname
$cd ~/docker/projectname
```
git初期化

```
$cd ~/docker
$git init
```
**laravelプロジェクトのソースコード取得**

```
$git remote add origin 追加したいリポジトリ
$git clone リポジトリのURL

```
~/docker/projectnameのフォルダーが作成されることが確認できます。
**laravelインストール**

composer installでcomposer.jsonに定義されているlaravel framesなど必要なパッケージをインストールします。

```
$composer install
```
※Homesteadの環境よりずっと速い！

###mysql8対応設定
**.envファイルを設定**

必要があれば、DBの設定をdocker-compose.yamlと一致するようにします
例：

```
DB_HOST="mysql"
DB_PORT=3306
DB_DATABASE="databasename"
DB_USERNAME="homestead"
DB_PASSWORD="secret"
```

MySQL8.0.4以降 のログイン認証方式は caching_sha2_password がデフォルトなので、
もしmysql 5.* からmysql8に変更した場合は認証方式の設定を変更する必要があります。

(1)mysqlのコンテナに入る

コンテナを起動

```
$docker-composer up -d
```

コンテナ一覧を確認する
docker-compose ps
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529234/85694a48-58ba-0c6e-69d2-5c47c50f070e.png)


```
$docker exec -it {mysql_container_name} bash
```

(2)rootユーザとしてログイン,passwordはdocker-compose.yamlの中の設定一致する必要があります。

```
$mysql -uroot -p
```
認証方式を変更

```
 ALTER USER 'homestead'@'%' IDENTIFIED WITH mysql_native_password BY 'secret';
```
注）↑のコマンドに使うユーザとパスワードはdocker-compose.yamlに設定された内容が一致する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529234/ef9db16d-49c8-a97e-ebcf-3ad4fb9d38b0.png)

変更を反映するために、コンテナ再起動

```
$docker-compose down
$docker-compose up -d
```
プロジェクトのデータベーステーブル作成
appコンテナに入る

```
docker exec -it --user {username} app bash
```

cd project フォルダー

```
cd /var/www/html/project
```


```
$ php artisan migrate
```
必要なSeed data作成

```
$ php artisan db:seed
```

###redisコンテナと設定
**redisのIPアドレス確認**
docker inspect redis | grep "IPAddress"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529234/a6b705f0-cc4f-8d62-a872-6f23961843fd.png)

**.envでRedis設定**

```
REDIS_HOST="172.23.0.2"
REDIS_PASSWORD="null"
REDIS_PORT="6379"
```
##動作確認
最後にブラウザで確認サイト確認
https://localhost