Next.js のチュートリアル（App Router）を Docker で試せるようにしました！

# はじめに
React に取り組んでいるので Next.js もやってみようと、チュートリアルに手を出してみました。
その際、Next.js のチュートリアルを Docker で試せるようにしたので、他に使いたい人が少しはいるかも？と思って、作った Docker のサンプルファイルを公開して、使い方の説明記事を書くことにしました。

# サンプルの動作環境
Mac で動作確認しています。
（Mac だと、あえて Docker を使う必要はないかもしれませんが Docker だと不要になったら消しやすいので。WSL の場合、生成されたファイルを変更できないかもしれません。練習用に雑に対処するなら chmod 777 とか書き込めるようにすれば進められると思います。）

事前に Docker が使えるようにセットアップしておいてください。

# Docker のサンプルファイルをダウンロード
Github にアップロードしてあります。
https://github.com/y74h1116/next_js_tutorial
今回は zip ファイルで取得することにしたので、「Code」→「Download ZIP」の順にクリックしました。
![next001_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/b97abe23-2ea5-49c8-99f9-29c3f813bbad.png)

※サンプルに付属の README.md に起動方法を記載しているので、そちらでわかる人はそちらを見ていただいてもOK。

# ダウンロードした zip ファイルを適当なディレクトリに配置
僕は、workspace というディレクトリを作って、そこに zip ファイルを置きました。
![next002_workspace.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/90d21ee0-f7b7-4453-9e83-26a3f17c2b98.png)

# zip ファイルを展開解凍
ターミナルを起動して、zip ファイルを展開します。
```sh
$ cd  zipファイルを配置したディレクトリ
$ unzip  next_js_tutorial-main.zip
```
※下記は実際に unzip してみたところです。

![next003_unzip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/1ad61601-3962-481d-9290-9950d0571e96.png)

# Docker のビルド、コンテナの起動
zip を展開したディレクトリの中に docker-compose.yml があるはずです。
docker-compose.yml があるディレクトリに移動して docker compose up コマンドを実行します。
```sh
$ cd  next_js_tutorial-main
$ docker compose up
```
※下記は実際にコマンドを実行してみたところです。
![next004_compose_up.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/8f847847-c277-47e2-899f-33e69e83f29d.png)

別のタブを開いて、コンテナが起動したか状態を確認します。
Up 状態になっていればOKです。
```sh
※別のタブで実行
$ docker ps
```
※下記は実際にコマンドを実行してみたところです。
![next005_ps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/cf5410f3-ab3d-42d4-9cda-ee96e5b9b73e.png)

# コンテナのシェルに入る（入るというかシェル起動）
シェルを起動します。
```sh
$ docker exec -it next_js_tutorial ash
```
※下記は実際にコマンドを実行してみたところです。
![next006_ash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/aec67734-7213-44f2-a7a9-fdcb3841eed8.png)

# チュートリアル Chapter 1 を進める
ここまで進むとチュートリアルに取り組めます！

以下は App Router のチュートリアルのリンクです。
https://nextjs.org/learn/dashboard-app
「Start Chapter 1」をクリックして進めましょう。

npm install -g pnpm を最初に実行することになっていますが、
Dockerを起動する際に pnpm のインストールは済んでいます。
npx create-next-app@〜 からやっていきます。
```sh
$ npx create-next-app@latest nextjs-dashboard --example "https://github.com/vercel/next-learn/tree/main/dashboard/starter-example" --use-pnpm
```
※下記は実際にコマンドを実行した例です。
![next010_create_app_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/25220cd5-bc03-4502-ab10-6baa5ed775cb.png)
![next011_create_app_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/f34851e8-565f-42d0-9b45-b9c4340d1210.png)

※なにやら警告（以下）が出ていますね🤔
```sh
Warning
   Ignored build scripts: bcrypt, sharp.
   Run "pnpm approve-builds" to pick which dependencies should be allowed
   to run scripts.
```
bcrypt と sharp はそれぞれハッシュ処理とイメージ処理のモジュールみたい、、
それらを無視したってことですか、、
pnpm approve-builds で承認できるのかな。
チュートリアルでは pnpm approve-builds のことは言及されていないので
一旦実行しないけど、ハッシュ処理とイメージ処理に関係する箇所で動かないことがあったら再確認が必要そう。
（僕自身、まだ最後までチュートリアルできてないけど(汗)、後の方で影響あるのかどうか）

チュートリアルの指示どおりに順次、打ち込んでいきます。
```sh
$ cd nextjs-dashboard
$ pnpm i
$ pnpm dev
```

そして Webブラウザで http://localhost:3000 にアクセス。
無事、表示されました！
![next020_welcome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3522449/20e8e7d9-d14a-4363-aeb5-ec8e1f10545b.png)

# おわりに、、ではありません！
チュートリアルの内容を試せる環境を用意したので
ここからスタートです！