未経験者がLaravel共同開発での詰まりポイントの「メモ」をまとめてみた【環境構築編】

#はじめに
タイトルの通り、共同開発講座を受講中に起きたトラブルや詰まりポイントをまとめたメモ（約50記事）をジャンル別に全て公開します。
ジャンルは以下の通りなので、気になるものがあればぜひご覧ください。
###【ジャンル一覧】
・[GitHub関連](https://qiita.com/kei_Q/items/1e421eef9b3bdbcdd9e9)
・[Laravel関連](https://qiita.com/kei_Q/items/79ef7679b28bb3c9738e)
・[データベース（migration/seeding）関連](https://qiita.com/kei_Q/items/cf13f486628bb5662089)
・[環境関連](https://qiita.com/kei_Q/items/412a9695f26aad25a99c)
・[総まとめ集](https://qiita.com/kei_Q/items/e197268fc29fdd664b64)

下記の点を、ご了承ください。
・ジャンルで統一しているため、内容に関しては統一性はありません。
・メモの難易度もバラバラです。
・初学者向けの内容となっております。
・自分用のメモを転用しておりますので、表現が稚拙な部分があるかと思います。
**・あくまで僕のメモです！！**


#環境
・vagrant-docker-laravel
・docker-compose version 1.25.0
・PHP 7.2.34
・Laravel Framework 5.8.38
・mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper
・phpmyadminを使用


#・【docker】down と stop  の使い分け

**docker-compose build **
を行って
**・ファイルの修正を反映させたい時**は

```
docker-compose down  //コンテナの削除？シャットダウン
```

を行って

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

で、新たにコンテナを立ち上げる


**・そのままのコンテナで、再起動のみ行いたい場合は**

```
docker-compose stop
```

でコンテナを止めてから

```
docker-compose start
```

で、既存のコンテナを開始させる


#・Docker 起動時にapacheがすぐに落ちる

####不具合詳細

Docker 起動時にapacheがすぐに落ちる不具合
その他ブラウザでLaravelにアクセスできない等

原因は、DockerとVagrantの適切なシャットダウンをしていなかったから(?)

```
【メンターさんの回答】
以前の操作で適切なシャットダウンが出来ていないと、ガベージファイルというゴミファイルが悪さをしているのかも知れません。

docker ps -a
で現在できているコンテナをみて、

docker rm コンテナID
でガベージファイルを全削除してから、

再度
docker-compose build
docker-compose up -d
等を試していただけますか？
```

参考リンク
https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae

####対処方法

**①適切なシャットダウン**
**Docker 停止**

```
docker-compose stop
```

**Vagrant 停止**

```
vagrant suspend
```

**②ガベージファイルの削除方法**
既存のコンテナを確認する

```
docker ps -a
```

不要と思われるコンテナを削除する

```
docker rm コンテナ名
```


####シャットダウンからの復帰

**suspendからの復帰**

```
vagrant resume
```

**dockerの開始**

```
docker-compose start
```

#・Docker立ち上げまでの流れ（インストール後）
**<font color="red">※こちら私が使用していたディレクトリ名なのでわかりにくいかもです</font>**


ターミナルにて
・cdコマンドでプロジェクトディレクトリに移動
・cdコマンドでdocker-on-vagrantに移動
・vagrantにログイン

```
kei@Mac-Pro docker-on-vagrant % vagrant ssh
Last login: Sat Nov 14 16:32:03 2020 from 10.0.2.2
```

ls   cdコマンドでdocker-laravelまで移動

```
[vagrant@local-docker ~]$ ls
docks
[vagrant@local-docker ~]$ cd docks/
[vagrant@local-docker docks]$ ls
docker-laravel
[vagrant@local-docker docks]$ cd docker-laravel/
[vagrant@local-docker docker-laravel]$ ls
README.md  apache-php  docker-compose.yml  index.php  lara-d
```

docker-laravel上で「docker-compose start」(既存のコンテナをスタートさせる)

```
[vagrant@local-docker docker-laravel]$ docker-compose start
Starting db         ... done
Starting web        ... done
Starting phpmyadmin ... done

//3つ全て立ち上がったらOK！
```

lara-dに移動

```
[vagrant@local-docker docker-laravel]$ ls
README.md  apache-php  docker-compose.yml  index.php  lara-d
[vagrant@local-docker docker-laravel]$ cd lara-d
```

--ここから開発スタートできる--


#・Laravelとmysqlが接続できないエラー(環境構築)

####エラー詳細
→php artisan migration ができない

root@86b16371b02f html]# php artisan migrate

**エラー文**

```
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [1045] Access denied for user 'root'@'172.23.0.3' (using password: NO) (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')
```

####原因

①Laravelの.envファイルのmysqlパスワード　と　docker-compose.yml内に記載されているmysqlパスワードが不一致であった。
ちなみに、docker-compose.yml内のパスワードに全て合わせなければならない！！

②そもそも、migrationをする前にテーブルが入るための箱（データベース）をphpmyadminに作っておかなければならなかった。これは.envファイルのDB_DATABASE=●●●で指定されている名前のdbを作っておくこと

③migrationファイル内の構文が間違っていた
今回はtimestamps()とtimestamp()で引数の取り方が変わるため、構文エラーとなっていた。


####Mysqlとの接続方法

以前まとめた記事があります↓↓
https://qiita.com/kei_Q/items/f3422b34afbe094119cb


#・vagrant docker 新しいコンテナを立ち上げる（新規プロジェクトを立ち上げる）方法


コンテナを新しく立ち上げたい！！！
という時の方法

####laravelの環境を動かすことができるdockerファイルをクローン
この時に名前を変更しておくと良い

```
[vagrant@local-docker docks]$ git clone https://github.com/****/docker-laravel.git **lara-review**　←ここで名前変更
```

**vagrantにログインした状態でdocksディレクトリの中にクローンする**

```
[vagrant@local-docker docks]$ git clone https://github.com/****/docker-laravel.git lara-review
Cloning into 'lara-review'...
remote: Enumerating objects: 23, done.
remote: Counting objects: 100% (23/23), done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 23 (delta 5), reused 22 (delta 4), pack-reused 0
Unpacking objects: 100% (23/23), done.
```

これでファイルをクローンしてきてlara-reviewと言う名前でvagrantの中においた。

**イメージの作成**

```
docker-compose  build
```

を行ってイメージを作成した

**いざコンテナの作成**

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

でコンテナを新しく作成しようとしたらエラーが出た
それが以下のエラー

```
[vagrant@local-docker lara-review]$ docker-compose up -d
Creating network "lara-review_default" with the default driver
Creating mysql5.7 ... error
ERROR: for mysql5.7  Cannot create container for service db: Conflict. The container name "/mysql5.7" is already in use by container "76d4ee80c5a2d3f73636dcd29e6ac736470617f02ee7e36148599f15d8fea51a". You have to remove (or rename) that container to be able to reuse that name.
```

訳）
コンテナを作成しようとしたけど、コンテナを作る時に使用するファイルに記載してある名前はすでに他のコンテナで使われているから作れませんよ？
って怒られてる。。
↓
つまり、今取り組んでるプロジェクトであるlara-dというlaravelプロジェクトのために作ったコンテナで、名前使っちゃってるから、同じ名前で二つは作成できないよと言う意味。

####解決策
解決策としては以下の3つが考えられる?

①既存のコンテナの削除
②既存のコンテナの名前変更
③ymlファイルの名前を変更してbuildした後にコンテナ作成

現行のプロジェクトであるlara-dを消すのは不可能だから答えは③になるので
lara-reviewでクローンしてきたものの中にあるdocker-compose.ymlファイルに書いてある3つの名前を全て変更する
①Apache
②phpmyadmin
③web bash
の3つのこと。

**docker-compose.ymlファイル**

```
[vagrant@local-docker lara-review]$ cat docker-compose.yml 
version: "3"
services:
  web:
    build:
      context: ./apache-php
    ports: 
      - 80:80
    privileged: true
    links:
      - db
    volumes:
      - "./:/var/www/html"
      - "./apache-php/apache.conf:/etc/httpd/conf/httpd.conf"
    container_name: "apache-php"   //←この名前を変更
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
    container_name: "mysql5.7"  //←この名前を変更
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    links:
      - db
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=root
    container_name: "phpmyamin-la"   //←この名前を変更
[vagrant@local-docker lara-review]$ 
```

####ymlファイルの編集

```
sudo vi docker-compose.yml
```

で編集

3つの名前を適当に変更した後、

```
docker-compose build
docker-compose up -d
```

を行うとコンテナが作成できた！！（この時既存のコンテナはストップしておかないといけない）


--------ここまでがコンテナの立ち上げ-----------


---------以下、Laravelの導入-----------

**コンテナを立ち上げ、web  bash　に入る**

```
[vagrant@local-docker lara-review]$ docker-compose exec web bash
```

**laravel本体をインストールする**

```
[root@4b2a1b935301 html]# composer create-project --prefer-dist laravel/laravel laravel-review "5.8.*"
```

ちなみに最後の5.8の後の「＊」は「5.8系のなかで最新のものをインストールしてね」という意味

laravelインストール画面

```
Creating a "laravel/laravel" project at "./laravel-review"
Installing laravel/laravel (v5.8.35)
  - Downloading laravel/laravel (v5.8.35)
  - Installing laravel/laravel (v5.8.35): Extracting archive
Created project in /var/www/html/laravel-review
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
Lock file operations: 86 installs, 0 updates, 0 removals
  - Locking beyondcode/laravel-dump-server (1.3.0)
  - Locking dnoegel/php-xdg-base-dir (v0.1.1)
  - Locking doctrine/inflector (1.4.3)
  - Locking doctrine/instantiator (1.4.0)
  - Locking doctrine/lexer (1.2.1)
・・・・・
・・・・
・・続く
```

####ymlファイルを編集する

```
[vagrant@local-docker lara-review]$ cat docker-compose.yml 
```


```
version: "3"
services:
  web:
    build:
      context: ./apache-php
    ports: 
      - 80:80
    privileged: true
    links:
      - db
    volumes:
      - "./laravel-review:/var/www/html"　　//変更箇所
      - "./apache-php/apache.conf:/etc/httpd/conf/httpd.conf"　//変更箇所
    container_name: "apache-php-2"
  db:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=root
    container_name: "mysql5.7-2"
  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    links:
      - db
    ports:
      - 8080:80
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=db
      - PMA_USER=root
      - PMA_PASSWORD=root
    container_name: "phpmyamin-la-2"
```


####apache  conf　をbuildする

```
[vagrant@local-docker apache-php]$ docker-compose build
```

####ちなみに

コンテナを起動させておけるのは多分一つだけなので、、
lara-reviewのコンテナを立ち上げる際はdocker-laravelのコンテナは停止しておく必要がある。


停止とスタートのコマンドは以下の通り

```
docker-compose stop     コンテナを停止　
（docker-compose downはシャットダウンなので注意）
docker-compose start     コンテナを再開させる
```

<font color="red">**docker-laravel（既存プロジェクト）　もしくは　lara-review（新規プロジェクト）　の停止もしくは開始したい方のディレクトリに移動してから上記コマンドを叩いて、使わないプロジェクトを停止させ、これから使用する方を立ち上げる。**</font>

こんな感じに↓↓↓

```
[vagrant@local-docker lara-review]$ docker-compose stop
Stopping phpmyamin-la-2 ... done
Stopping apache-php-2   ... done
Stopping mysql5.7-2     ... done
[vagrant@local-docker lara-review]$ 
[vagrant@local-docker lara-review]$ 
[vagrant@local-docker lara-review]$ cd ..
[vagrant@local-docker docks]$ cd docker-laravel/
[vagrant@local-docker docker-laravel]$ docker-compose start
Starting db         ... done
Starting web        ... done
Starting phpmyadmin ... done
```


#・vagrantの停止と再起動の流れ（パソコンの再起動したい時に超有用です）

パソコンを再起動するときはvagrantをシャットダウンさせるか、スリープモードにしておくべきだそう。

**vagrantを一時停止する（スリープさせる）**

```
vagrant suspend
```


```
kei@Mac-Pro docker-on-vagrant % vagrant suspend
==> vagrant: A new version of Vagrant is available: 2.2.14 (installed version: 2.2.13)!
==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html
==> default: Saving VM state and suspending execution...
```

####vagrantが止まったかどうかの確認（状態確認）

```
vagrant status
```

ちなみにdefaultの状態は
<font color="green">
**Power off**
**Running**
**Saved**
</font>

の三つがある。

vagrant status実行

```
kei@Mac-Pro docker-on-vagrant % vagrant status
Current machine states:

default                   saved (virtualbox) 　　　　//savedならOK！

To resume this VM, simply run `vagrant up`.
oourakeisuke@Mac-Pro docker-on-vagrant % 
```

――ここでパソコンを再起動する――

――パソコンの再起動が完了したら――

####状態確認

```
vagrant status
```

```
Last login: Sun Nov 22 15:25:57 on console
kei@Mac-Pro docker-on-vagrant % vagrant status
Current machine states:

default                   saved (virtualbox)     //savedのままならOK！

To resume this VM, simply run `vagrant up`.
```

####vagrantを再起動する（suspendからの復帰）

```
vagrant resume
```

```
kei@Mac-Pro docker-on-vagrant % vagrant resume
==> default: Resuming suspended VM...
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2200
    default: SSH username: vagrant
    default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.
```

####vagrantにログインする

```
kei@Mac-Pro docker-on-vagrant % vagrant ssh
Last login: Thu Nov 19 11:14:13 2020 from 10.0.2.2
[vagrant@local-docker ~]$ 
```

**ログイン成功！！(再起動成功！！)**