初心者がDockerのLaravelでHTTPS化してみた（Windows、Mac両方可）

つい４日ほど前にDockerを勉強し始めたのですが、「何をやってるかわからん」と毎日思っています。

色々調べてメリットを探ってみたのですが、初心者の内はどうも実感できそうにないです。

とまぁこんな感じの初心者がDockerで立ち上げたプロジェクト（ローカルホスト）をHTTPS化することに成功したので、ぜひ皆さんにも参考にして頂けたらなと思います。

ディレクトリ構造は以下のようになります。

```
project/
└─backend
│    ├─laravel
└─infra
│    ├─mysql
│    │      Dockerfile
│    │      my.cnf
│    │
│    ├─nginx
│    │      default.conf
│    │      Dockerfile
│    │      localhost-key.pem
│    │      localhost.pem
│    │
│    └─php
│            Dockerfile
│            php.ini
docker-compose.yml
```

プロジェクトを作成するにあたり、以下の記事を参考にさせて頂きました。とても分かりやすいのでぜひご覧ください！

[【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン](https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4)
[Docker × Laravel ローカル環境でHTTPS(SSL)通信する](https://qiita.com/ucan-lab/items/c7f0690227ce7da4a172)

また、このようなディレクトリ構造でない方でも適時変えて頂ければできます。

それでは一緒に説明を見ていきましょう！！

#mkcertのインストール#

まずは、``infra/nginx``に``.pem``という拡張子のファイルを作成していきます。

これは証明書というものです。

HTTPS化するにはこの**証明書**が必要なわけです。

とりあえず「mkcert」をインストールをしていない方は下記の記事参考にインストールしてください。

・Windows：[Windows10にmkcertをインストールする](https://qiita.com/dai-andy1976/items/b179ef6e56087ad1943d)

・マックの方は以下のコマンドで実行

```
brew install mkcert
mkcert -install
```

#証明書の発行#

Windowsの方は``Powershell``で行ってくださいね。

```
cd infra\iginx
mkcert -cert-file localhost.pem -key-file localhost-key.pem localhost
```

#Dockerfile、default.confの設定#

``infra\nginx\Dockerfile``にて以下を追記します。

```
FROM nginx:1.18-alpine

COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./localhost.pem /etc/nginx/conf.d/localhost.pem
COPY ./localhost-key.pem /etc/nginx/conf.d/localhost-key.pem
```

次に、``infra\nginx\default.conf``にて以下を追記します。

```
server {
    # ここから
    listen 443 ssl;
    server_name localhost;
    ssl_certificate /etc/nginx/conf.d/localhost.pem;
    ssl_certificate_key /etc/nginx/conf.d/localhost-key.pem;
    # ここまでを追加
    root /work/laravel/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}
```

#docker-compose.ymlの設定#

``docker-compose.yml``でポート番号を``${WEB_PORT:-443}:443``と変え、``volumes``で証明書を読み込みます。

```docker-compose.yml
version: "3.8"
services:
  app:
    build: ./infra/php
    volumes:
      - ./backend:/work
  web:
    image: nginx:1.18-alpine
    ports:
      - ${WEB_PORT:-443}:443
    volumes:
      - ./backend:/work
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - ./infra/nginx/localhost.pem:/etc/nginx/conf.d/localhost.pem
      - ./infra/nginx/localhost-key.pem:/etc/nginx/conf.d/localhost-key.pem
    working_dir: /work
  db:
    build: ./infra/mysql
    volumes:
      - db-store:/var/lib/mysql

volumes:
  db-store:
```

#プロジェクトの立ち上げ#

```
docker-compose down
docker-compose up -d --build
docker-compose exec app bash
```

そして、[https://localhost](https://localhost)にアクセス

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/954754/8eeed42e-a071-c79f-a5cb-d0db87d57f9c.png)


このようになっていれば成功です。

dockerって慣れるまで大変なんだろうけど頑張りやす。

以上、「初心者がDockerのLaravelでHTTPS化してみた（Windows、Mac両方可）」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading