Laravel + Dockerで環境構築


<h1>【書いた理由】</h1>
<p>　Lravelの環境構築でいつもつまづいていたので、とにかくサクッとできたやつをメモとして書いておきたかった。私の書いたのは、参考URLのほとんどコピペになります。<br>　参考にしたURL貼ってあるので詳しく知りたい方はそちらを参考にしてください。一部違う箇所は、phpmyadminを使いたかったのでそちらの設定をこっそり入れています。<br><br>
参考URL<br>
<a href>https://zenn.dev/kafeine/articles/d3d60d983555d5</p>

<h1　>【記事の目次】</h1>
<ul>
<li>dockerのインストール
<li>ディレクトリとファイルの構図
<li>ディレクトリとファイルの作成
<li>ファイル内の記入
<li>環境を接続する
<li>documentrootを変更
<li>Lravelを導入する
<li>apacheのドキュメントルートを変更とリライトを有効にする
<li>artisan migrateできるようにする
<li>Mysqlをターミナルで確認する
<li>完了
</ul>


<h1>【ローカル環境に構築していきます】</h1>
<br><p>ちょっと長いですが頑張りましょう。＾＾；

<h2>01 : dockerのインストール
<br><p>下記からdockerをインストールしてください<br>
※M1=>download for mac  --apple chip　でインストール

https://www.docker.com/get-started/

<h2>02 : ディレクトリとファイルの構図
<br><p>最終的にはこのような構図になります。</p>

```	
  xxx_folder_name *
	  ├── docker-compose.yml
	  │
      ├── apache
	  │    └── sites-available
	  |         └── 000-default.conf
      |         └── Default-ssl.conf
      │
      ├── env
	  │    └── .env.mysql
	  │
      ├── php
	  │    └── Dockerfile
   	  │
      └── src
		   └── index.php
           └── xxx_project
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　└── laravelのファイルとディレクトリ
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　└── .env
```
<p>
※記号の説明
<br>「*」 任意の記入　
</p>


<h2>03 : ディレクトリの作成
<br><p>ターミナルでひたすらディレクトリとファイルの作成<br>
数字の手順通りに行ってください。
</p>

```:ターミナル
// 1 : 作成する場所に移動
$ cd workspace *

// 2 : ディレクトリを作成
$ mkdir xxx_project_name *

// 3 : ディレクトリを移動
$ cd xxx_project_name *

// 4 : ディレクトリを作成
$ mkdir apache
$ mkdir env
$ mkdir php
$ mkdir src

// 5 : ファイルを作成
$ touch docker-compose.yml 
$ touch env/.env.mysql
$ touch php/Dockerfile
$ touch src/index.php 
```

<p>
※記号の説明
<br>「$」 これは記入しない
<br>「//」 　この行は記入しない、ただのコメント
<br>「*」 任意の記入　
</p>


<h2>04 : ファイル内の記入
<br><p>docker-compose.yml に関してはインデントがずれているとエラーになるので注意してください。

```ターミナル:./docker-compose.yml
version: "3.9"
services:
  web:
    build: 
      context: .
      dockerfile: ./php/Dockerfile
    container_name: xxx_project_web *
    volumes:
      - ./src:/var/www/html
    ports:
      - 8080:80
    env_file: env/.env.mysql

  db:
    platform: linux/x86_64
    image: mysql:8.0.26
    container_name: xxx_project_db *
    environment:
      MYSQL_HOST: db
      MYSQL_DATABASE: xxx_project_db *
      MYSQL_USER: xxx_user *
      MYSQL_PASSWORD: xxx_password *
      MYSQL_ROOT_PASSWORD: xxx_password *
    volumes:
      - db-data:/var/lib/mysql

  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin:latest
    ports:
      - 8180:80
    restart: always
    environment:
      PMA_USER: xxx_password *
      PMA_PASSWORD: xxx_password *

volumes:
  db-data:
```

※こちらの設定を変えた場合は、一度コンテナを作り直す必要があるので下記コマンドを実行してくだい
$ docker container prune -f

また、このファイルの設定についてこちらを参考にすると良さそう！

https://qiita.com/yuta-ushijima/items/d3d98177e1b28f736f04

<br>
<br>
<p>php/Dockerfile　は、一部PHPのバージョンを記入してください。
<br>確認方法は下記URLを参考にしてくだい。

https://codelikes.com/php-version/#:~:text=%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88,%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B%E3%81%A0%E3%81%91%E3%81%A7%E3%81%99%E3%80%82

```ターミナル:./php/Dockerfile
FROM php:8.1.5-apache //8.1.5はお使いのPHPのバージョンになります。確認方法は上記のURL
	
RUN rm /etc/apt/preferences.d/no-debian-php
	
# Install git
RUN apt-get update && \
	apt-get upgrade -y && \
	apt-get install -y git net-tools vim \
	zip unzip libzip-dev && \
	apt-get clean
	
# Set apache mod_rewrite
RUN a2enmod rewrite
	
# Install php extension
RUN docker-php-ext-install mysqli pdo pdo_mysql zip
	
# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
	
# Install NPM & node
RUN curl -sl https://deb.nodesource.com/setup_14.x | bash -
RUN apt-get install -y nodejs build-essential
```
<br>
<br>
<p>.env/.env.mysqlファイルについては、docker-compose.ymlの17~21行目と同じ記入してください</p>

```ターミナル:./env/.env.mysql
MYSQL_HOST=db
MYSQL_DATABASE=xxx_project_db *
MYSQL_USER=xxx_user *
MYSQL_PASSWORD=xxx_password *
MYSQL_ROOT_PASSWORD=xxx_password *
```
<br>
<br>
<p>
ここはコピペでOK
</p>

```php:./src/index.php
<?php
	
  echo 'Docker Local';
	
  $dsn = 'mysql:host='.$_ENV['MYSQL_HOST']
    .';dbname='.$_ENV['MYSQL_DATABASE'];
	
  $dbh = new PDO($dsn, $_ENV['MYSQL_USER'], $_ENV['MYSQL_PASSWORD']);
	
  foreach($dbh->query('SHOW databases') as $row) {
    echo '<pre>';
	print_r($row);
	echo '</pre>';
  }
	
  phpinfo();

?>
```


<p>
※記号の説明
<br>「//」 　この行は記入しない、ただのコメント
<br>「*」 任意の記入　
</p>
<h5>05 : 環境を接続する

<p>ここは、下記を実行するだけ
<br>うまくいかなかなかったら、MYSQL_HOST: db　こういったところの記述が間違っていること多いです。

```:ターミナル
$ docker-compose up -d

//　下のようなのが表示されたら完了
Starting xxx_project_db ・・・done
Starting xxx_project_web ・・・done
Starting xxx_project_phpmyadmin_1 ・・・done
```

<a href>localhost:8080</a>に接続して、エラーとか出てないか確認ください。
エラー表示されていたら、他にもdocker-compose buildを試した後でdocker-compose up -d　で直ることもある
<p>
※記号の説明
<br>「//」 　この行は記入しない、ただのコメント
</p>

<h5>06 : documentrootを変更
<p>
下記を入力

```terminal:ターミナル
docker cp xxx_project_web:/etc/apache2/sites-available/ ./apache/sites-available/
```
　
<h5>07 : Lravelを導入する</h5>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2260961/648d9854-f92f-2a6b-f6b7-db735450e9b0.png)
	docker exec -it sample_web bash <=ターミナルで記入
	root@7e0fs9402a24:/var/www/html# <=こんな表記に切り替わる
	
	Laravelを導入する
	composer create-project laravel/laravel xxxproject
	Application key set successfully. <=これが出たら完了
※sampleの箇所がディレクトリの名前になる

<h5>　ここの処理が必要

docker-compose.yml
```
version: "3.9"
services:
  web:
    build: 
      context: .
      dockerfile: ./php/Dockerfile
    container_name: xxx_project_web <=【これ追加】
    volumes:
      - ./src:/var/www/html
      - ./apache/sites-available:/etc/apache2/sites-available　　<=【これ必要】　
    ports:
      - 8080:80
    env_file: env/.env.mysql
```

<h5>08 : apacheのドキュメントルートを変更とリライトを有効にする

次はこのlocalhost:8080にアクセスしたら、Laravelのwelcomeページになるようします。
	
apache/sites-available/000-default.confのDocumentRootを変更する
	
```000-default.conf
<VirtualHost *:80> 
	~~~ 略 ~~~ 
	ServerAdmin webmaster@localhost 
	DocumentRoot /var/www/html/xxxproject/public
```
	
リスタートしないと表示しないので注意

```terminal
Docker-compose up -d
```

Laravelのホーム画面が出たらOK
	



<h5>09 : artisan migrate　できるようにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2260961/431c73b7-9f24-64a0-982b-15ce9a6b2c13.png)
root@7e0fs9402a24:/var/www/html/xxxproject# php artisan migrate　＜＝実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2260961/60e15f9c-b44c-9937-2142-3a04bd94709a.png)
	下記のようなエラーが出るらしい
	Illuminate\Database\QueryException SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')
	
	src/sample-docker/.env
	上記のファイルにmysqlの設定をする
	DB_CONNECTION=mysql
	DB_HOST=db 
	DB_PORT=3306 
	DB_DATABASE=local_db 
	DB_USERNAME=local_user 
	DB_PASSWORD=local_password
	
	キャッシュをクリアする
	root@7e0fs9402a24:/var/www/html/laravel-docker# php artisan cache:clear
	Application cache cleared!
	
	root@7e0fs9402a24:/var/www/html/laravel-docker# php artisan  config:clear
	Configuration cache cleared!
	
	再度migrateをするとできるらしい
	root@7e0fs9402a24:/var/www/html/laravel-docker# php artisan migrate



<h5>10 : Mysqlをターミナルで確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2260961/24d39eda-ac6a-fd10-f3bc-1d9d4bd4f1f5.png)
	・dbコンテナのチェック
	kafeine@Bean-Mac web_tutorial % docker exec -it sample_db bash
	root@376e3b3ad241:/# 
	※ここでエラーが出ていた
	tarting match-app-db ... Done　＜＝名前をよく見よう！！　Match-app-dbまでが名前！
	Starting match_web    ... done
	
	・既にMysqlが入っているので下記を入力してパスワードを記入
	root@376e3b3ad241:/# mysql -u sample_user -h db -p
	
	・下記を入力したら先ほどのmigrateしたテーブルがあるはず
	mysql> use sample_db
	
	・下記でデータベースを見る
	SHOW databases; 
	・下記でデータのテーブルを見る
	SHOW tables; 


<h5>11 : 完了

使ってみてください


```php:ファイル名


```