WSL2+DockerでNext.jsの環境を簡単に作る
概要
Windows環境上(WSL2)でDockerを使って、Next.jsを環境を作ります。
試しにNext.jsを動かしてみたい場合、動かしながらNext.jsの勉強をしたい場合などに便利ですね。
環境
- Windows10
- WSL2(Ubuntu 20.04)
- Docker 20.10.12
- docker-compose 2.2.3
Windows環境でWSL2を未セットアップの方は、よろしければ以下を参照してください。
WSL2+Docker環境構築手順
構成
WSL2上のディレクトリパスは以下とします。
/home/[ユーザ名]/next-sample
next-sampleフォルダ配下の構成(最終的に作成する構成)は以下の通りとします。
.
├ src :Nextプロジェクトソース用フォルダ
├ Dockerfile
└ docker-compose.yml
手順
プロジェクトフォルダの作成
まず最初に、今回のプロジェクトを格納するためのフォルダを作成しておきます。
cd ~
mkdir next-sample
※自身のホームディレクトリ(/home/[ユーザ名]配下)にプロジェクトフォルダを作成します。
コード格納用フォルダの作成
続いて、コード格納用のフォルダを作成しておきます。
cd next-sample
mkdir src
Dockerfileの作成
プロジェクトフォルダの直下に、Dockerfileを作成します。
vi Dockerfile
FROM node:17-alpine
WORKDIR /usr/app
使用するDockerのnodeのバージョンは以下で確認します。(今回は17を指定)
ちなみに、node:17の後ろのalpineというのは、OSの種類で、alpineはコンテナで使用することを想定した軽量イメージです。
軽量化しているためにOSのつくりがだいぶ違い、制約がいろいろあるようですが、とりあえずNext.jsを動かしたいだけなので問題ないでしょう。
以下参考にさせて頂きました。
docker-compose.ymlの作成
プロジェクトフォルダの直下に、docker-compose.ymlファイルを作成します。
vi docker-compose.yml
version: '3'
services:
app:
build: ./
volumes:
- ./src:/usr/app
command: sh -c "yarn dev"
ports:
- "3000:3000"
Reactアプリを構築する
プロジェクトフォルダ直下で以下のコマンドを実行して、create next-appを実行します。
docker-compose run --rm app yarn create next-app .
もし、TypeScriptを合わせて導入する場合--ts
オプションを付けます。
docker-compose run --rm app yarn create next-app . --ts
Dockerコンテナを起動する
プロジェクトフォルダ直下で以下のコマンドを実行します。
docker-compose up -d
ブラウザで動作を確認する。
ブラウザで以下のURLにアクセスします。
http://localhost:3000/
以下のような画面が表示されたらOKです。
あとは、
~/src
配下でNext.jsコードを作成して動かしてみましょう。
本番用にビルドする
docker run -v $(pwd)/src:/usr/app --rm next-sample_app yarn build
本番用ビルドで動作確認する
docker run --name='prodtest' -d -v $(pwd)/src:/usr/app -p 3000:3000 next-sample_app yarn start
動作確認を終了する
docker stop prodtest
注意事項1
WSL2でDockerを動作させた状態で、Dockerコンテナ側からファイルを作成すると、ファイルの所有者がroot
になります。
一方で、WSL上の操作ユーザはデフォルトでroot以外のユーザとなっており、また、VSCodeなどでファイルを開いた場合もroot以外のユーザとなるため、ファイル更新しようとするとPermission denied
エラーが発生します。
対応としては、VSCodeのエクステンションを用いて、WSL2→VSCode用コンテナ→対象のフォルダという形で接続して作業を行う必要があります。
以下を参考としていただければと思います。
注意事項2
WSL2を起動させたまま長時間使用していると、メモリがひっ迫していくる場合があります。その場合はPCを再起動することをお勧めします。
Discussion