DockerでLaravel環境構築

業務でVirtualBox利用したので、仮想環境ついでにやってみることに。
以前からDockerに興味はあったが壁が高いかなと思っててできていませんでした。ちなみに自分のエンジニアレベルは初級です。

# Docker for Macのインストール
下記にアクセス。
https://docs.docker.com/desktop/mac/install/
![Install Docker Desktop on Mac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/1572a475-920f-86b4-56d4-fd767f627899.png)
￼docker.dmgファイルをダウンロード。
少し待つ。

終わったらダブルクリックで展開。検証される。
![Pasted Graphic 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/174b59a6-75ea-d4c5-4374-a493adaca404.png)
Applicationsフォルダへ、ドラック＆ドロップする。
![drag and drop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/7f2586e9-126f-de0c-5893-157751b02d45.png)
![Pasted Graphic 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/a86f8f6a-f10e-5a53-94a4-10165206f78c.png)￼
が終わると、インストール完了。

Dockerを開く。
![Pasted Graphic 7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/7bb41151-18b4-995d-7a7f-d367455b666c.png)￼
開いてもいいですかと聞かれる。開く。
![Pasted Graphic 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/3a5209fe-bc9e-4a1c-6c50-0b0af8d30d7e.png)
![Docker Desktop needs privileged access.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/b9b7cfa9-bcd8-79bd-36d3-417a6c6cfaec.png)
![Pasted Graphic 9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/7744a5e8-8346-9f6f-fad6-a9bc4d75f2c1.png)￼
右下の「I accept the terms」
![Our Service Agreement has Changed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/0b8ec317-7477-ec4c-4f78-c1f58588f2f5.png)
![No containers running.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/04f638fa-a587-6214-85d1-da169903617e.png)
起動できているか確認。
ターミナルで下記表示されればOK。
[machidaryo ~]$ docker version
Client:
 Cloud integration: v1.0.22
 Version:           20.10.12
 API version:       1.41
 Go version:        go1.16.12
 Git commit:        e91ed57

# Docker Hubのアカウント作成
アカウントがないとイメージのpullに制限がかかるらしいので、作成する。

https://hub.docker.com アクセス。
ID、メールアドレス、passを入力。
![Build and Ship any.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/60c043b6-dca7-0828-d70e-3ea767c507ef.png)
￼![Pasted Graphic 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/feb9ade5-ef0a-6fa5-83a8-c23e9b5f6487.png)
![Enter Your Password.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/91a3fe42-5fe8-eb53-7714-442a75e374b1.png)
1番左のPersonalを選択する。
![Business.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/22072cd5-286a-5c87-04c6-65961f460e65.png)
![Please verify your email address.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/a78838fc-53b3-62b0-31b0-02720ba85991.png)
メールが飛んでくるので、verifyする。
![(Docker) Please confirm your email address.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/f221caf6-3f03-1940-697a-3ceb1efbb013.png)
このページが表示されればOK。
![Download the desktop application.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/e611d6db-3a3a-c57f-b794-d6da88447a9f.png)

# インストールしたDockerでDockerHubアカウントにログイン

Mac上部にあるDockerアイコン(くじら)＞Sign inを押す
![Docker Desktop is running.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/5c24265a-5681-f6e6-7ad4-9e3deb97e63c.png)
￼
許可押すとログイン状態に。
![You're Almost Done!.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/21c61971-3b2e-c0cf-652b-a4c41ce7e02b.png)
￼
ターミナルで確認は下記。
```
[machidaryo ~]$ docker login
Authenticating with existing credentials...
Login Succeeded
```
# docker-compse.yamlを作る
```yaml:docker-compose.yaml
version: "3"
services:
  db:
    image: mariadb:10.4
    container_name: "laravel-db"
    volumes:
      - ./data:/var/lib/mysql
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: laravel
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    ports:
      - "3306:3306"
  php:
    build: ./php
    container_name: "laravel-php"
    volumes:
      - ./source:/var/www/html
      - ./php/vhost.conf:/etc/apache2/conf-enabled/vhost.conf
    ports:
      - "8080:80"
```
# Dockerfileの作成
```dockerfile:./php/Dockerfile
FROM php:7.4.28-apache　#FROMでベースのDockerイメージを決める。
RUN apt-get update \
  && apt-get install -y zlib1g-dev \
  && apt-get install -y zip unzip \
  && apt-get install -y libonig-dev \
  && apt-get -y install libzip-dev \
  && docker-php-ext-install pdo_mysql mysqli mbstring zip \
  && docker-php-ext-enable mysqli \
  && a2enmod rewrite

# composerのインストール
RUN curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer \
  && chmod +x /usr/local/bin/composer

WORKDIR /var/www/html

ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
#タイムゾーン設定
ENV TZ=Asia/Tokyo
```
# フォルダ構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1007978/7dd9cf03-9f3f-f5e4-ee61-298f3af37016.png)

# 他設定ファイル
```conf:vhost.conf
NameVirtualHost *:80
<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName localhost
  DocumentRoot /var/www/html/public
  <Directory "/var/www/html/public">
    Options Indexes FollowSymLinks
    DirectoryIndex index.php
    AllowOverride All
    Require all granted
    Order allow,deny
    Allow from all
  </Directory>
</VirtualHost>
```
```my.cnf
空
※任意でDB設定を
```

# コンテナを立ち上げる
No package 'oniguruma' found　エラー発生。下記参考で解決。
[php7.4-apacheイメージのビルド時に "No package 'oniguruma' found" エラーが発生する際の対処](https://qiita.com/June8715/items/1df5958b95c1ff2d4c1b)

```
[machidaryo laravel]$ docker-compose run php composer create-project --prefer-dist laravel/laravel . "6.*"
:
:
Application key set successfully.

[machidaryo laravel]$ docker-compose up -d
[+] Running 13/13
 ⠿ db Pulled

[machidaryo laravel]$ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED          STATUS          PORTS                  NAMES
ce8a3a9d0645   laravel_php   "docker-php-entrypoi…"   14 seconds ago   Up 12 seconds   0.0.0.0:8080->80/tcp   laravel-php
```
コンテナ起動しない
→設定ファイルの記述ミスのためやった。
　phpが起動しなかったのは、vhost.confのミス。
　dbが起動しなかったのは、yamlのミス。
　→いけた！
```
[machidaryo laravel]$ docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS                  PORTS                    NAMES
31faf0174549   mariadb:10.4   "docker-entrypoint.s…"   3 hours ago   Up 3 hours              0.0.0.0:3306->3306/tcp   laravel-db
8fdb020651e1   laravel_php    "docker-php-entrypoi…"   3 hours ago   Up 3 hours              0.0.0.0:8080->80/tcp     laravel-php
```
ちなみにこれで、なにがおかしいのか分かった。logs重要。
```
[machidaryo laravel]$ docker logs laravel-php
```

phpコンテナからdbコンテナに接続できるようにする。
```.source/.envファイルの修正
：
DB_CONNECTION=mysql
DB_HOST=db　←修正
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=docker　←修正
DB_PASSWORD=docker　←修正
：
```
phpコンテナに入って接続確認。migrate成功すればOK。
```
[machidaryo laravel]$ docker exec -it laravel-php bash
root@8fdb020651e1:/var/www/html# php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
:
:
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.04 seconds)
```

# その他気になったこと
laravel開発していくのははsource/を触ればよい？
→そう

db見るには？
```
[machidaryo laravel]$ docker exec -it laravel-db bash
root@31faf0174549:/# mysql -u root -p         
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.4.24-MariaDB-1:10.4.24+maria~focal mariadb.org binary distribution
:
:
MariaDB [(none)]>
```
# 参考
[udemy 駆け出しエンジニアのためのDocker入門](https://www.udemy.com/share/1050ZC3@gnfaxq6gl47yx-aMWi-ih4Tf1_zlZfqwIFvkxn3wT_5B-44myfNn4BGWs-RoM6gWbg==/)