Skip to content

NOTE

このガイドは、[Docker Desktop](https://www.docker.com/products/docker-desktop/) がすでにインストールされていることを前提としています。

Docker は、アプリケーションを軽量でポータブルな コンテナ としてパッケージ化して実行するためのプラットフォームです。コンテナには必要なすべての依存関係がカプセル化されています。


アプリケーションを コンテナ化 するには、Dockerfile を定義します。このファイルには、コンテナを初期化し、ローカルプロジェクトファイルをコピーし、依存関係をインストールし、アプリケーションを起動するための一連の指示が含まれています。

docker
# 公式 Bun イメージを使用
# すべてのバージョンは https://hub.docker.com/r/oven/bun/tags で確認できます
FROM oven/bun:1 AS base
WORKDIR /usr/src/app

# 一時ディレクトリに依存関係をインストール
# これによりキャッシュされ、将来のビルドが高速化されます
FROM base AS install
RUN mkdir -p /temp/dev
COPY package.json bun.lock /temp/dev/
RUN cd /temp/dev && bun install --frozen-lockfile

# --production でインストール(devDependencies を除外)
RUN mkdir -p /temp/prod
COPY package.json bun.lock /temp/prod/
RUN cd /temp/prod && bun install --frozen-lockfile --production

# 一時ディレクトリから node_modules をコピー
# 次にすべての(無視されていない)プロジェクトファイルをイメージにコピー
FROM base AS prerelease
COPY --from=install /temp/dev/node_modules node_modules
COPY . .

# [オプション] テストとビルド
ENV NODE_ENV=production
RUN bun test
RUN bun run build

# 本番用依存関係とソースコードを最終イメージにコピー
FROM base AS release
COPY --from=install /temp/prod/node_modules node_modules
COPY --from=prerelease /usr/src/app/index.ts .
COPY --from=prerelease /usr/src/app/package.json .

# アプリを実行
USER bun
EXPOSE 3000/tcp
ENTRYPOINT [ "bun", "run", "index.ts" ]

これで Docker イメージが完成しました。次に .dockerignore について見てみましょう。これは .gitignore と同じ構文を持ち、Docker ビルドのどの段階でも含めてはいけないファイル/ディレクトリを指定します。ignore ファイルの例:

txt
node_modules
Dockerfile*
docker-compose*
.dockerignore
.git
.gitignore
README.md
LICENSE
.vscode
Makefile
helm-charts
.env
.editorconfig
.idea
coverage*

次に docker build を使用して、この DockerfileDocker イメージ に変換します。これはアプリケーションの実行に必要なすべての依存関係と設定を含む、自己完結型のテンプレートです。

-t フラグでイメージの名前を指定し、--pull で Docker に最新バージョンのベースイメージ(oven/bun)を自動的にダウンロードするように指示します。最初のビルドは、Docker がすべてのベースイメージと依存関係をダウンロードするため、時間がかかります。

bash
docker build --pull -t bun-hello-world .
txt
[+] Building 0.9s (21/21) FINISHED
 => [internal] load build definition from Dockerfile                                                                                     0.0s
 => => transferring dockerfile: 37B                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                        0.0s
 => => transferring context: 35B                                                                                                         0.0s
 => [internal] load metadata for docker.io/oven/bun:1                                                                                    0.8s
 => [auth] oven/bun:pull token for registry-1.docker.io                                                                                  0.0s
 => [base 1/2] FROM docker.io/oven/bun:1@sha256:373265748d3cd3624cb3f3ee6004f45b1fc3edbd07a622aeeec17566d2756997                         0.0s
 => [internal] load build context                                                                                                        0.0s
 => => transferring context: 155B                                                                                                        0.0s
 # ...lots of commands...
 => exporting to image                                                                                                                   0.0s
 => => exporting layers                                                                                                                  0.0s
 => => writing image sha256:360663f7fdcd6f11e8e94761d5592e2e4dfc8d167f034f15cd5a863d5dc093c4                                             0.0s
 => => naming to docker.io/library/bun-hello-world                                                                                       0.0s

新しい Docker イメージ が完成しました。次に、このイメージを使用して実際の コンテナ を起動しましょう。

docker run を使用して bun-hello-world イメージを使用して新しいコンテナを起動します。detached モード(-d)で実行され、コンテナのポート 3000 をローカルマシンのポート 3000 にマッピングします(-p 3000:3000)。

run コマンドは コンテナ ID を表す文字列を出力します。

sh
docker run -d -p 3000:3000 bun-hello-world
txt
7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

コンテナがバックグラウンドで実行されています。localhost:3000 にアクセスしてください。Hello, World! メッセージが表示されます。


コンテナを停止するには、docker stop <container-id> を使用します。

sh
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d

コンテナ ID が見つからない場合は、docker ps を使用して実行中のすべてのコンテナを一覧表示できます。

sh
docker ps
txt
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
7f03e212a15e        bun-hello-world     "bun run index.ts"       2 minutes ago       Up 2 minutes        0.0.0.0:3000->3000/tcp   flamboyant_cerf

これで完了です!より高度な使用方法については、Docker ドキュメント を参照してください。

Bun by www.bunjs.com.cn 編集