Dockerでlaravel・mysqlの環境構築　初心者向け（２０２３年ver)

dockerの特徴はなんといっても、ものの数時間で環境構築ができる！ということです。ですがdockerの知識がない人・プログラミング初心者はなかなか手こずると思います。

実際、私もdockerの環境構築に１０日間もかかりました笑
今回は初心者向けにdocker環境構築の方法を書きます。

とにかく、ポートフォリオを作ってみたい！という人は参考にしてください。

参考にしたサイト
https://maasaablog.com/development/backend/php/laravel/758/#toc7

https://salumarine.com/how-to-prepare-nginx-laravel-development-environment-using-docker-compose/


docker　コンテナ、イメージ等を知りたい方は以下の動画を一通り見てもらえば理解できます。

https://www.youtube.com/watch?v=DNnW4I43wyU

https://www.youtube.com/watch?v=kVuHdG50eh8&t=15s



<h1>環境構築手順<h1>

<h2>①docker desktopをインストール！<h2>

https://www.docker.com/products/docker-desktop
上のURLから、自身のosに合わせたものをダウンロードしてください。

<h3>②docker desktopを起動


<h2>③VScodeで以下のディレクトリ構造でファイルを作成。

　
![スクリーンショット 2023-04-26 160343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291381/69fc5dac-535f-ee5d-2684-35acf2c2c6c3.png)



<h2>④それぞれのファイルにコードを記入していく

/nginx/default.conf
```
server {
  listen 8000;
  root /var/www/my-app/public;
  error_log /var/log/nginx/error.log warn;
  index index.php index.html;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app-dl:9000; 
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }

```


/php/Dockerfile
```
# https://hub.docker.com/_/phpにあるイメージファイルを指定
FROM php:8.0-fpm

# RUNコマンドは、buildしたときに元となるdockerイメージに対して実行する処理を記述する。
# \（バックスラッシュ）を用いて、複数行に分けることが可能。
# パッケージ一覧を更新
RUN apt update \
    # zlibはデータの圧縮に関するアルゴリズムをライブラリ化したもの
    # vimをインストール
    # MariaDBデータベースのクライアントアプリケーションである「mysql」を使えるように「mariadb-client」をインストール
    # libzip-devはzip圧縮時に必要となるライブラリ(libzip は、zlib を使用する)
    && apt install -y zlib1g-dev mariadb-client vim libzip-dev \
    # docker-php-ext-installはPHPに標準で備わっている拡張パッケージのインストール＆有効化ができるコマンド
    # PDO_MYSQL は、PHP から MySQL データベースへのアクセスを可能にするための PHP Data Objects (PDO) インターフェイス を実装したドライバ。
    && docker-php-ext-install zip pdo_mysql \
    # gitのインストール
    && apt install -y git \
    # xdebugのインストール
    && pecl install xdebug \
    && docker-php-ext-enable xdebug
    
# Composerのインストール & パス通す
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# nodeインストール(aptだとNodejsは古いため、パッケージマネージャの n を使用してインストール)
RUN apt install -y npm \
    && npm install n -g \
    && n stable

# RUN , CMD , ENTRYPOINT , COPY , ADD を実行する時のワーキングディレクトリを指定
WORKDIR /var/www

```

/php/php.ini

```
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[PHP]
display_errors = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M

[xdebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = "host.docker.internal"
xdebug.client_port = 9012
xdebug.log = "/var/log/xdebug.log"
```

.env
```
IP=127.0.0.1
WEB=80
DB=3306
```
docker-compose.yml

このファイルは、インテンドも重要なので間違えないようにコピーしてください。
参考サイト

https://qiita.com/Nedward/items/ca8f2d7666e632f6659b
```
{
  "version": "3.8",
  "services": {
     "app-dl": {
      "container_name": "app-dl",
      "build": "./docker/php",
      "volumes": [
        "./:/var/www",
        "./docker/php/php.ini:/usr/local/etc/php/php.ini",
        "./log:/var/log"
      ]
    },
    "web-dl": {
      "container_name": "nginx-dl",
      "image": "nginx"
      ,
      "ports": [
        "${WEB:-80}:8000"
      ],
      "volumes": [
        "./:/var/www",
        "./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf"
      ]
    },
     
    "db-dl": {
      "image": "mysql:latest",
      "container_name": "db-dl",
      "environment": {
        "MYSQL_ROOT_PASSWORD": "root",
        "MYSQL_DATABASE": "sample_db",
        "TZ": "Asia/Tokyo"
      },
      "command": "mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci",
      "volumes": [
        "./docker/db/data:/var/lib/mysql",
        "./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf",
        ".R/docker/db/sql:/docker-entrypoint-initdb.d"
      ],
      "ports": [
        "${DB:-3306}:3306"
      ]
    },
    "phpmyadmin-dl": {
      "image": "phpmyadmin/phpmyadmin",
      "container_name": "phpmyadmin-dl",
      "environment": [
        "PMA_ARBITRARY=1",
        "PMA_HOST=db-dl",
        "PMA_USER=root",
        "PMA_PASSWORD=root"
      ],
      "links": [
        "db-dl"
      ],
      "ports": [
        "8580:80"
      ],
      "volumes": [
        "/sessions"
      ]
    },
    "mailcatcher-dl": {
      "image": "schickling/mailcatcher",
      "ports": [
        "1080:1080"
      ]
    }
  }
}
```

<h2>④docker imageをビルド

docker-compose.ymlファイルがあるディレクトリと同じ階層に行き、ターミナルにてビルドコマンドを実行します。

ディレクトリの移動には、LINUXのコマンドを使用します。今後も使用するのでぜひ覚えてください。

https://www.bold.ne.jp/engineer-club/linux-commands-getting-started


ディレクトリの移動
```
cd docker-laravel
```
docker imageのビルド
```
docker-compose build
```
<h2>⑤dockerコンテナの起動<h2>

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

<h2>⑥laravelプロジェクトの作成

laravelプロジェクトは、MVCモデルのアプリを作るのに必要なファイルがあるフォルダのことです。それを作成することによって、スムーズにアプリを作成することができます。

laravelプロジェクトについて参考サイト
https://nebikatsu.com/7452.html/


laravelプロジェクトを作るには、まずphpコンテナに入る必要があります。
```
docker-compose exec app-dl bash
```
コンテナに入ることができれば、ターミナルが以下のように変わります
```
root@～:/var/www#
```

ターミナルが変わったら、laravelのプロジェクトを作成するために以下のコマンドを入力します。
```
composer create-project laravel/laravel my-app
```

なかなか時間がかかるので、プロジェクトができるまで待ってください。

プロジェクトができたら、ブラウザからhttp://localhost:8000/or
http://localhost:80/　にアクセスをしてください。

laravelプロジェクトが正常にできた場合は以下のような画面になります。

![34-999.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291381/595dedfe-e3a7-ec98-efe9-39960d4d32f9.jpeg)


この画面が表示されたら、作成が完了しています。続いて、DBの接続を行います。

<h1>DBとの接続

<h2>①ワーキングディレクトリに移行

```
cd my-app
```

<h2>②.envファイルを修正

```
DB_CONNECTION=mysql
# mysqlコンテナのサービス名(✖︎container_name)
DB_HOST=db
DB_PORT=3306
# ymlファイルのMYSQL_DATABASEと合わせる
DB_DATABASE=test_db
DB_USERNAME=root
DB_PASSWORD=root
```
dockerで環境構築できたでしょうか？
ぜひ、手短にdockerで環境を作り、コードを書いていきましょう！