１．DOCKERを理解したい - 1day

こんにちは🦎  
あかはら。と申します。  
この分野は本業であり、いわゆる趣味副業に効果的なものではありませんが、一般的なエンジニアが一日30分から1時間がんばろうという心意気とその記録のためのページです

# ◆今回の目的：Dockerの理解
## ▼参考
・https://qiita.com/kouta222/items/6bcfcd261cfea62238bc  
・https://salumarine.com/how-to-prepare-nginx-laravel-development-environment-using-docker-compose/  
## ▼作業内容
### ➀docker desktop をインストール
普通にexeファイルを開くだけですね🦎
### ➁Nginxを動作させる
参考のサイトの手順が不十分っぽいので、ここからは試行錯誤
- まずは開発環境を置くディレクトリを作成

 mkdir docker-Laravel
 cd docker-Laravel

- 下記のようなディレクトリを構築
docker/conf/default.conf
docker-compose.yml
index.html
docker-compose.yml の内容を下記のように作成
```
version: '3'
services:
  web: 
    image: nginx:1.27.0
    ports:
      - '8000:80'
    volumes:
      - ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
```

 - default.conf の設定をする
default.conf はNginxの設定ファイル
```
server {
    listen 80;
    root /var/www/html;
    index index.html;
    access_log /var/log/nginx/access_log;
    error_log /var/log/nginx/error_log;
}
```
 - 表示確認用のindex.htmlも作成
 ```
<!DOCTYPE html> 
<html lang="en">
    <head>
        <meta charset="UTF-8"/>
        <title>index</title>
    </head>
    <body>
        <h1>トップページ</h1>
        <p>docker-composeで作成したlaravel環境トップです。</p>
    </body>
</html>
```
 - サーバーを起動する
```
 docker-compose up -d
```
 - 表示確認
``` 
http://127.0.0.1:8000/
```
### ➂NginxでPHPを動作させる

docker-compose.yml を編集してservicesにphpを追加して動作させるPHPを指定
```
version: '3'
services:
  # services欄のweb:コンテナ名(nginxをおく場所)
  web: 
    # dockerhubにあるNginxのイメージのバージョン
    image: nginx:1.27.0
    # ホスト側のポート8000にアクセスすると、作成されるnginxのポート80にアクセスできる設定
    ports:
      - '8000:80'
    # ./docker/conf/default.conf : 「ホストマシン」のファイルパス。現在のディレクトリからみて、docker/conf/というフォルダの中にあるdefault.confファイルを指す。
    # /etc/nginx/conf.d/default.conf : コンテナ内のファイルパス。Nginxコンテナ内の/etc/nginx/conf.d/ディレクトリにあるdefault.confファイルを指す
    # このマッピングによって、ホストマシン上のdefault.confファイルがコンテナ内のNginxの設定ファイルとして使用される
    volumes:
      - ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
    # . : 「ホストマシン」のカレントディレクトリ（docker-compose.ymlが置かれているディレクトリ)
    #  /var/www/html : 「ホストマシン」の現在のディレクトリにあるファイルやフォルダがコンテナ内の'var/www/html'に対応。ホストマシン上で作業しているファイルがそのままコンテナ内のウェブサーバーで利用されている
      - .:/var/www/html
  php:
    # PHPのバージョン記載
    image: php:8.3-fpm
    volumes:
      - .:/var/www/html
```
 - Nginxの設定もPHPを動作させることができるように編集
```
server {
    listen 80;
    # サーバールートディレクトリの設定 サーバーがリクエストを処理する際に使用するドキュメントルートを指定
    root /var/www/html;
    # インデックスファイルの指定
    index index.html;
    access_log /var/log/nginx/access_log;
    error_log /var/log/nginx/error_log;
    # URLパスに基づいて特定のリクエストを処理する方法を指定->`/`に一致するリクエストに対して処理する
    location / {
        # try_files: 指定された順序でファイルまたはディレクトリが存在するかを確認->存在するなら使用
        # $uri: リクエストされたURIに対応するファイルを探す
        # $uri/ リクエストされたURIに対応するディレクトリを探す
        # /index.php$is_args$args: 上記のいずれも存在しない場合、リクエストを`/index.php`に渡し、クエリ文字列(`$is_args$args`)も渡す。
        try_files $uri $uri/ /index.php$is_args$args;
        # PHPファイルのリクエストをFastCGIサーバー(PHP-FPM)に渡す設定
        location ~ \.php$ { # リクエストURIが`.php`で終わる場合にこのブロック内の設定を使用する
            fastcgi_split_path_info ^(.+\.php)(/.+)$; # リクエストされたパスを分割するための正規表現（`SCRIPT_FILENAME`/`PATH_INFO`に分割)
            fastcgi_pass php:9000; # phpという名称のコンテナで実行されているFastCGIサーバーにポート9000で接続->Docker Composeで定義されているPHP-FPMサービスに対応する
            fastcgi_index index.php; # デフォルトのインデックスファイルを指定。ディレクトリがリクエストされた場合、`index.php`がデフォルトで使用される
            include fastcgi_params; # Nginx の標準FastCGIパラメータ設定ファイルをインクルード
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # `SCRIPT_FILENAME`パラメータを設定。$document_root はドキュメントルート/ $fastcgi_script_name はリクエストされたスクリプトのパスを指す
            fastcgi_param PATH_INFO $fastcgi_path_info; # `PATH_INFO` パラメータを設定。スクリプトに渡す追加のパス情報を含む
        }
    }
}
```
<details>
<summary>補足-作成時に補填した知識</summary>
<blockquote>
<p style="color:gray;>

- ▼プロトコル
  - プロトコルは、コンピューターネットワークで通信を行うための一連の規則や手順のことを指す
  - 異なるコンピュータ間で情報を交換するための「ルール」といった感じ
  - 例）HTTP,FTP,SMTP,FascCGI
</p>
</blockquote>
</details>

- index.phpを作成
    default.confの中で`/`にアクセスされたときにindex.phpを優先的に表示するようにしたので、PHPで作成する
```
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8"/>
        <title>index</title>
    </head>
    <body>
        <h1>トップページ(PHP記述)</h1>
        <p><?php echo "docker-composeで作成したLaravel環境トップです。";?></p>
    </body>
</html>
```
 - 動作確認
 一度docker-compose downで停止してから再度docker-compose up -dで立ち上げ
 
 ### ➃ Laravelをインストールする
 laravelをcomposerというパッケージ管理システムを利用する。
 その際、環境作成時に動作設定をDockerfileに記述する
 docker/phpディレクトリを作成し、そこにDockerfileを作成する.
 ```
├── docker
│   ├── conf
│   │   └── default.conf
│   └── php
│       └── Dockerfile
├── docker-compose.yml
├── index.html
└── index.php
```
- docker-compose.yml を改修する
```
version: '3'
services:
  # services欄のweb:コンテナ名(nginxをおく場所)
  web: 
    # dockerhubにあるNginxのイメージのバージョン
    image: nginx:1.27.0
    # ホスト側のポート8000にアクセスすると、作成されるnginxのポート80にアクセスできる設定
    ports:
      - '8000:80'
    # ./docker/conf/default.conf : 「ホストマシン」のファイルパス。現在のディレクトリからみて、docker/conf/というフォルダの中にあるdefault.confファイルを指す。
    # /etc/nginx/conf.d/default.conf : コンテナ内のファイルパス。Nginxコンテナ内の/etc/nginx/conf.d/ディレクトリにあるdefault.confファイルを指す
    # このマッピングによって、ホストマシン上のdefault.confファイルがコンテナ内のNginxの設定ファイルとして使用される
    volumes:
      - ./docker/conf/default.conf:/etc/nginx/conf.d/default.conf
    # . : 「ホストマシン」のカレントディレクトリ（docker-compose.ymlが置かれているディレクトリ)
    #  /var/www/html : 「ホストマシン」の現在のディレクトリにあるファイルやフォルダがコンテナ内の'var/www/html'に対応。ホストマシン上で作業しているファイルがそのままコンテナ内のウェブサーバーで利用されている
      - .:/var/www/html
  php:
    # PHPのバージョン記載
    # image: php:8.3-fpm
    build: ./docker/php #Dockerfileがあるディレクトリを指定して、そのDockerfileにどんな環境を作成するかを定義する
    volumes:
      - .:/var/www/html
```
 - Dockerfile を作成する

ここまでやりました。
次回はDockerfileの内容を確認し、理解を試みるところからですね。。。
RUN で実行するコマンドに関して何を実行させるのかを理解するのがちょっと時間かかりそうで( ﾟДﾟ)
明日も10分でもやりたい！
よしなに