Content-Length: 303404 | pFad | http://note.com/ssltokyo_tech/n/n0a1ce30d6120

Next.jsのチュートリアルにDevContainerを使ったDocker環境の導入をしてみた|(株)スーパーソフトウエア技術部@東京オフィス
見出し画像

Next.jsのチュートリアルにDevContainerを使ったDocker環境の導入をしてみた

まずはじめに

初めまして。スーパーソフトウエア東京オフィス技術部のN.Hと申します。
私は昨年の4月に入社し、開発エンジニアとしてもう少しで1年になります。今回はNext.jsのチュートリアルをやる際に、Docker環境を導入して行った時の学びについて共有していきます。
Next.jsのチュートリアルをやってみた経緯として、業務でReactを扱っていますが、従来のSPAとしてのReactを使用しており、Next.jsについての知見はほとんどありませんでした。しかし、フロントエンド開発ではNext.jsが広く採用されていることから、公式チュートリアルに取り組んでみました。

今回のチュートリアルを通して、Next.jsへの理解が深まっただけでなく、Docker環境で開発を行ったことで、Dockerに関する知識も身につき、大変勉強になりました。

この記事は、Dockerを活用してチュートリアルに挑戦したい方向けになります(Next.jsについては公式チュートリアルをすすめて身に着けてください🙏)
参考になれば幸いです。


この記事を通して学べる事 

  1. Dockerの導入

    • Dockerを用いてNext.jsのチュートリアルのアプリを開発ができます。

  2. DevContainerの導入

    • vs Codeエディタでコンテナ内のファイルを編集できるようにします。

特に、DevContainerを使うとDocker環境での開発効率の向上やミスの軽減に寄与するためぜひ、試してみてください!

対象者

  • Dockerの基礎知識がある

  • Javascript/Reactの基礎知識がある(Next.jsのチュートリアルをやる場合)

前提

Dockerがローカル環境で動くこと
Dockerを使ったことがない場合は下記を参考にインストールしてください
https://docs.docker.com/get-started/introduction/get-docker-desktop/

1. Dockerの導入

まずは、Dockerの環境を整えたいのでプロジェクトルートにdocker-compose.ymlを作成します。
※私はportsのローカル側は競合しないように33333にしました。

volumes:
  nestjs-node-modules:
 nextjs-pnpm-store:

services:
  nextjs-app:
    build:
      context: .
    volumes:
      - ./app:/app
      # - nestjs-node-modules:/app/next-js-practice/node_modules
      # - nestjs-pnpm-store:/app/.pnpm-store
    ports:
      - 33333:3000
    command: sleep infinity

  • command:

    • sleep infinityにして、コンテナ立ち上げした際に落ちないようにします。

  • volumes:

    • コンテナとローカルホストでは環境がことなるため、node_modulesやpnpm-storeの情報をコンテナ側のvolumeで管理をしようと考えてます。現段階では、いったんコメントアウトします。

次にdocker-compose.ymlと同じディレクトリへ下記の通りDockerfileを作成

FROM node:23.7-bullseye
RUN npm install -g pnpm
WORKDIR /app/

next.jsのチュートリアルではpnpm を使うように指定されるため、コンテナ環境でpnpmが使えるようにします。Next.jsのチュートリアルには、pnpmはnpm や yarnよりも効率的なパッケージマネージャー と言及がありましたので試してみるいい機会ですね👍

一旦、上記をつくったらDocker導入における大枠はできました。チュートリアルのコードを取得するため、コンテナを立ち上げ、コンテナの中へ入ります。
下記のコマンドでもターミナルを通してコンテナへ入ることができますが、今回はvsCodeで直接コンテナ側のファイルを編集できるようにします。

docker compose build
docker compose up -d
dokcer compose exec -it nextjs-app /bin/bash

2. DevContainerの導入


 VS Code上でコンテナ内のファイルを編集できるようにVS Codeの拡張機能Dev Containersをつかってみました。
理由は3つあります。(個人的な意見を含んでます)

DevContainerを使う理由

  • 1つ目

    • ローカル側とコンテナ側での環境が異なり、module not foundのエラーがローカルホスト側のエディタ上で多発していたため

      • DevContainerを使い、コンテナ側のフォルダをVS Codeで開き編集ができればローカルホスト側のエラーは気にせず、快適に作業ができるためです

  • 2つ目

    • 今回は完全にローカルを汚さずに開発をしたかったため

      • 今回next.jsのチュートリアルで求められるnodeの最新バージョンがnodeのLTSバージョンではないため、ローカルホスト側でインストールしたくなかったためです笑。pnpm についてもコンテナ側でとりあえず使ってみたかったのもあります

  • 3つ目

    • 効率的な開発がしやすくなる

      • 毎回コンテナ内へ"dokcer compose exec -it nextjs-app /bin/bash"とコマンドを打つのが面倒と感じてました。また、コンソール上でしかDocker環境を覗いたことがなかったため、VS Codeでコンテナ環境を開けると、作業効率向上や人的ミスが減りそうだと感じてます

DevContainerセットアップ

Dev Containersは立ち上がったコンテナ内に入り、VS Codeエディタを使ってファイル修正ができるため、特に、1つ目の理由の場合に本当に便利でした!

上記をインストールしてください

インストールを終えたら、プロジェクトルートにて.devcontainerフォルダの作成と/.devcontainer/devcontainer.jsonを作成します。
devcontainer.jsonは、VS CodeのRemote Containers拡張機能で使用される設定ファイルです。
このファイルで、どのDockerイメージやDockerfileを使用するか、VS Codeの設定や拡張機能などを定義します。
一旦、/.devcontainer/devcontainer.jsonには下記を設定してください。

{
  "name": "Next.js Dev",
  "dockerComposeFile": "../docker-compose.yml",
  "service": "nextjs-app",
  "workspaceFolder": "/app",
  "settings": {
    "terminal.integrated.defaultProfile.linux": "/bin/sh"
  },
  "extensions": ["dbaeumer.vscode-eslint", "esbenp.prettier-vscode"]
}
  • dockerComposeFile

    • 今回はdocker-compose.ymlを定義してコンテナを起動するため、docker-compose.ymlのパスを指定します。指定した起動コンテナへVS Codeが接続してくれます。

  • workspaceFolder

    • ローカルからコンテナ先へマウントするディレクトリを指定してます

  • settings

    • デフォルトのシェルをshに固定

  • extensions

    • コンテナ側のVS Codeにインストールされる拡張機能を指定できます

devcontainer.jsonを作成したらコンテナ起動後、vs Code内でコンテナ側のファイル編集ができるように接続します。

// コンテナ起動
dokcer compose down
docker compose up -d

コンテナ起動後、VS Codeのウィンドウを開き、「 > Reopen in Container」 でリモート接続が完了です。

そのままターミナルを開き、下記を入れてください

root@a0905f6ea0a3:/app# npx create-next-app@latest nextjs-practice --example "https://github.com/vercel/next-learn/tree/main/dashboard/starter-example" --use-pnpm

/app配下にnextjs-practiceディレクトリが作成されたら成功です。

node_modulesやpnpm-storeはコンテナとローカルホスト側で環境が異なり、同期する意味がないため、コンテナのvolume側で管理するようにします。

注意:node_modulesやpnpm-storeをローカルホストと同期してしまうと、ファイル修正したものが即時に反映されない(ホットリロードが機能しない)ため開発効率が極端に落ちてしまいます。私はここで躓きました。

一旦、ローカルホスト側に戻り、docker-compose.ymlにてコメントアウトしていた部分を外します。これで、コンテナとローカルホストでnode_modulesとpnpm-storeのみ同期をされないようにします。

volumes:
  nestjs-node-modules:
 nextjs-pnpm-store:

services:
  nextjs-app:
    build:
      context: .
    volumes:
      - ./app:/app
      - nestjs-node-modules:/app/next-js-practice/node_modules
      - nestjs-pnpm-store:/app/.pnpm-store
    ports:
      - 33333:3000
    command: sleep infinity

再び、コンテナを起動

docker compose up -d

起動したら、チュートリアルのアプリケーションを起動するため依存関係をインストールしていきます。
vs Code のウィンドウを開き「 > Reopen Container」を押下しコンテナ側のターミナルで下記を実施

cd nextjs-practice
pnpm i

依存関係及びチュートリアルで使用するコードはすべてコンテナ内へダウンロードされました。

ファイルがあることが確認できたら、サーバーを立ち上げてみましょう
ウィンドウ > Reopen 再度コンテナへ入り下記を実行後、

pnpm run dev

http://localhost:33333へアクセスしたら下記の画面が表示されたら成功です。

終わりに

お疲れ様です!これで、DevContainerを用いてDocker環境の導入ができました!これで快適にNextjsのチュートリアルができるかと思います!
新たな言語やフレームワークを学びたいけど、ローカル環境を汚したくない方はぜひ、ご参考にしてみてください~!

▼採用情報

▼新卒情報はWantedlyで

いいなと思ったら応援しよう!









ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://note.com/ssltokyo_tech/n/n0a1ce30d6120

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy