エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。

NestJSをDockerコンテナ化する(yarnを利用)

まずはNestJSをインストール

https://docs.nestjs.com/first-steps

上記に従って、以下のコマンドでプロジェクトを作成する。

$ npm i -g @nestjs/cli
$ nest new nestjs-sample
✨  We will scaffold your app in a few seconds..

✔ Which package manager would you ❤️  to use? yarn
CREATE nestjs-sample/.prettierrc (51 bytes)
CREATE nestjs-sample/README.md (5036 bytes)
CREATE nestjs-sample/eslint.config.mjs (836 bytes)
CREATE nestjs-sample/nest-cli.json (171 bytes)
CREATE nestjs-sample/package.json (1984 bytes)
CREATE nestjs-sample/tsconfig.build.json (97 bytes)
CREATE nestjs-sample/tsconfig.json (677 bytes)
CREATE nestjs-sample/src/app.controller.ts (274 bytes)
CREATE nestjs-sample/src/app.module.ts (249 bytes)
CREATE nestjs-sample/src/app.service.ts (142 bytes)
CREATE nestjs-sample/src/main.ts (228 bytes)
CREATE nestjs-sample/src/app.controller.spec.ts (617 bytes)
CREATE nestjs-sample/test/jest-e2e.json (183 bytes)
CREATE nestjs-sample/test/app.e2e-spec.ts (674 bytes)

✔ Installation in progress... ☕

🚀  Successfully created project nestjs-sample
👉  Get started with the following commands:

$ cd nestjs-sample
$ yarn run start


                          Thanks for installing Nest 🙏
                 Please consider donating to our open collective
                        to help us maintain this package.


               🍷  Donate: https://opencollective.com/nest

※筆者はnpmではなくyarnを利用しているため、npmコマンドを利用する人は今後読み替えていただきたい

とりあえずサーバーを立ち上げ、動作確認をする。

$ yarn run start

localhost:3000にアクセスして「Hello, World」が表示されていれば問題ない。

yarnのバージョンが古いので上げる

初期状態では、以下のように1系になっているはず。

$ yarn -v
1.22.22

以下のドキュメントに従って、バージョンを4系にアップデートする。

Icon in a page linkInstallation | Yarn

$ yarn set version stable
➤ YN0000: Done in 0s 8ms
$ yarn -v
4.9.2

Dockerfileを作成する

プロジェクトのルートディレクトリと同じ場所に、Dockerfileを作成する。

Dockerfileに記載する内容の参考として、 Icon in a page linkDocumentation | NestJS - A progressive Node.js framework にも記載があるのでこちらも見てみると良い。

公式ドキュメントからの変更点は2点。

  1. nodeのバージョンは22を使う
  2. パッケージのインストールとビルドコマンドをyarnを使ったものに変更
# node22を使う
FROM node:22

# 作業ディレクトリを定義
WORKDIR /usr/src/app

# yarnは「package-lock.json」の代わりに「yarn.lock」
COPY package.json yarn.lock ./

# corepack enableをしないと、yarnの1系が使われてしまうため
RUN corepack enable && \
  yarn install --immutable

# 残りのソースコードなどを全部コピー
# このときに不要なファイルは.dockerignoreしておく
COPY . .

# ビルドコマンド実行
RUN yarn build

# コンテナが公開するポートを明記
EXPOSE 3000

# 実行コマンドは「yarn start」よりもこちらを推奨
CMD ["node", "dist/main"]

Dockerイメージを作成する

docker build -t nestjs-api:1.0 .

Dockerコンテナを立ち上げて実行する

$ docker container run -it --rm --name "nestjs-sample" -p 3000:3000 nestjs-sample:1.0
[Nest] 1  - 08/03/2025, 5:07:07 AM     LOG [NestFactory] Starting Nest application...
[Nest] 1  - 08/03/2025, 5:07:07 AM     LOG [InstanceLoader] AppModule dependencies initialized +15ms
[Nest] 1  - 08/03/2025, 5:07:07 AM     LOG [RoutesResolver] AppController {/}: +3ms
[Nest] 1  - 08/03/2025, 5:07:07 AM     LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 1  - 08/03/2025, 5:07:07 AM     LOG [NestApplication] Nest application successfully started +1ms

■オプションの説明

オプション 説明
-it コンソールに結果を出力する
—rm コマンド実行完了後にコンテナを自動削除
—name コンテナ名を指定する
-p コンテナの3000ポートとホストマシンの3000ポートをつなげる

動作確認

ホストマシン上で localhost:3000でアクセスできることが確認できる。

Image in a image block

応用:マルチステージビルド

実際のアプリケーションでは、必要最低限の成果物のみを用いてDockerイメージを生成したい。

そのためには Icon in a page linkMulti-stage を活用するとDockerイメージを軽量化することができる。

# ビルド用イメージ
# Use the official Node.js image as the base image
FROM node:22-alpine AS builder

# Set the working directory inside the container
WORKDIR /usr/src/app

# 不要なものを.dockerignoreして全部コピーするのが楽でおすすめ
COPY . .

# Install the application dependencies
RUN corepack enable && \
  yarn install --immutable

# Build the NestJS application
RUN yarn build



# 実行用イメージ
FROM node:22-alpine

WORKDIR /usr/src/app

# ビルドの成果物のみコピー
COPY --from=builder /usr/src/app/dist ./dist
COPY --from=builder /usr/src/app/node_modules ./node_modules

# Expose the application port
EXPOSE 3000

# Command to run the application
ENTRYPOINT ["node", "dist/main"]

関連記事