【初心者でもわかるDocker入門】Docker実践編（Docker Composeを使うLarevel環境構築）


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/19bd9e5d-2454-34d5-3f8b-f08cfc7b303e.png" width="70%">

## Docker Composeとは
Docker compose とは、複数のコンテナからなるサービスを構築・実行する手順を自動的にし、管理を容易にする機能です。（例えば、Laravelだと<strong>アプリケーションサーバー</strong>、<strong>ウェブサーバー</strong>、<strong>データベースサーバー</strong>）Docker compose では、compose ファイルを用意してコマンドを1回実行することで、そのファイルから設定を読み込んですべてのコンテナサービスを起動することができます。

## Docker Composeを使うまでの主なステップ
・　それぞれのコンテナのDockerfile を作成します(既にあるイメージを使う場合は不要)
・　docker-compose.yml を作成し、それぞれ独立したコンテナの起動定義を行います(場合によっては構築定義も含まれる)
・　"docker-compose up" コマンドを実行してdocker-compose.yml で定義したコンテナを開始します

## コンテナ構成
app、web、dbの3つのコンテナ構成の方がよろしいと思いますが今回はappとdbの２つのコンテナ構成でいきたいと思います。

```
docker ───app
           ├──000-default.conf
           ├──Dockerfile
           ├──php.ini
          db
           ├──data
           ├──my.cnf
 src ────
```


```
$ mkdir docker-laravel
$ cd docker-laravel
```

### Dockerfileの作成
 
```dockerfile
FROM php:7.4-apache

ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

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 \
libpng-dev \
libpq-dev \
&& docker-php-ext-install pdo_mysql


RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled
RUN /bin/sh -c a2enmod rewrite
```

### docker-compose.ymlの作成
```docker-compose.yml

version: '3'

services:

# ---------------------------------
# laravelを動かすコンテナ
# ---------------------------------
    app:
        ports:
            - "8000:80"
        build: ./docker/app
        container_name: laravel_app

        volumes:
            - ./src:/var/www/html

# ----------------------------------
# MySQLを動かすコンテナ
# ----------------------------------
    db:
        image: mysql:5.7
        container_name: laravel_db
        
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: laravel_db
            MYSQL_USER: laravel_user
            MYSQL_PASSWORD: laravel_pass
            TZ: 'Asia/Tokyo'

        command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
        
        volumes:
            - ./docker/db/data:/var/lib/mysql
            - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
        ports:
        - 3306:3306
```

### その他のファイルの記述

```000-default.conf
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/laravel/public
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    <Directory /var/www/html/laravel/public>
        AllowOverride All
    </Directory>
</VirtualHost>
```

```php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
```

```my.cnf
[mysqld]
character-set-server=utf8
```


### 1、イメージの作成

```
$ docker-compose build
```


### ２、コンテナの起動

```
$ docker-compose up -d
```

### ３、コンテナ内に入る

```
$ docker-compose exec app bash
```

### ４、laravelのプロジェクト作成

```
# composer create-project --prefer-dist laravel/laravel laravel "6.18.*"
# cd laravel
# chmod 777 -R storage/
# php artisan key:generate
```

http://localhost:8000/ にアクセスして下の画面が表示されたらOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1295942/0689fe75-ce88-5c6e-4f30-0d7fee99d538.png)

### ５、データベースに接続してmigrationを行う

```:.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass
```
に設定する。そしてマイグレーションを行う。

```
# php artisan migrate
```