Bun アプリケーションのコンテナー化

前提条件

  • git クライアント が利用可能であること。 本節の利用例ではコマンドラインベースの git クライアントを用いていきますが、別のクライアントを用いてもかまいません。

概要

サーバーサイドの JavaScript アプリケーションとしては、長らく Node.js がデファクトスタンダードのランタイムとなっていました。 しかし最近では Bun ウェブサイト のように、エコシステムでの新しいランタイムが代わりに登場してきています。 Node.js と同じく Bun も JavaScript のランタイムですが、比較的軽量であり、高速化と効率化を目指して設計されています。

Docker を使って Bun アプリケーションを開発するのはなぜでしょう? 複数のランタイムが選択肢としてあるのは好ましいことです。 しかしランタイム数が増えるたびに、複数の異なるランタイムとその依存パッケージを常時管理し続けなければならなくなります。 これだからこそ Docker の登場となります。 必要に応じてコンテナーの生成と削除が行えるのは、たくさんのランタイムとその依存パッケージを管理する方法として適しています。 さらに Bun は新しいランタイムであるため、Bun による一貫した開発環境を整えることは実にやりがいがあります。 Docker はそのような一貫した Bun 開発環境を構築する助けとなります。

サンプルアプリケーションの入手

本ガイドにおいて利用するサンプルアプリケーションをクローンします。 端末画面を開いて、作業を行うディレクトリに移動します。 そして以下のコマンドを実行してリポジトリをクローンします。

$ git clone https://github.com/dockersamples/bun-docker.git && cd bun-docker

上により bun-docker ディレクトリ内は以下の内容となるはずです。

├── bun-docker/
│ ├── compose.yml
│ ├── Dockerfile
│ ├── LICENSE
│ ├── server.js
│ └── README.md

Dockerfile の生成

Dockerfile を生成するには、まずベースイメージを決定する必要があります。 Bun 用の Docker 公式イメージ を利用することが出来ますし、Hardened イメージカタログ から Docker Hardened イメージ (DHI) を選ぶこともできます。

DHI を選ぶと、軽量でセキュアなイメージを本番環境向けにすぐ活用できます。 詳しくは Docker Hardened イメージ を参照してください。

Bun 向けの Docker Hardened イメージ (DHIs) は Docker Hub から入手できます。 Docker 公式イメージの場合とは異なり、組織内において Bun イメージのミラーをまずはじめに行い、それをベースイメージとして設定することが必要になります。 Bun 向けにミラーリポジトリを生成する詳しい手順については DHI クィックスタート を参照してください。

ミラーリポジトリの先頭文字には dhi- をつけてください。 たとえば FROM <あなたの名前空間>/dhi-bun:<tag> です。 以下に示す Dockerfile では FROM 命令におけるベースイメージの指定は <your-namespace>/dhi-bun:1 としています。

# ベースイメージとして DHI Bun イメージを利用
FROM <your-namespace>/dhi-bun:1

# コンテナー内でのワーキングディレクトリの設定
WORKDIR /app

# カレントディレクトリ内のコンテンツをコンテナー内の /app にコピー
COPY . .

# API が利用するポートを開放
EXPOSE 3000

# コンテナー起動時にサーバーを実行
CMD ["bun", "server.js"]

Docker 公式イメージを用いるのが一番簡単です。 以下の Dockerfile では FROM 命令のベースイメージに oven/bun を指定しています。

このイメージは Docker Hub にあります。 これは Bun 向けの Docker 公式イメージであり、Bun に関係する企業 Oven により生成されています。 これは Docker Hub から利用できるものではありません。

# 公式 Bun イメージの利用
FROM oven/bun:latest

# コンテナー内でのワーキングディレクトリの設定
WORKDIR /app

# カレントディレクトリ内のコンテンツをコンテナー内の /app にコピー
COPY . .

# API が利用するポートを開放
EXPOSE 3000

# コンテナー起動時にサーバーを実行
CMD ["bun", "server.js"]

ベースイメージの指定に続けて Dockerfile では以下も行っています。

  • コンテナー内のワーキングディレクトリを /app に設定しています。
  • カレントディレクトリ内の内容を、コンテナー内の /app ディレクトリにコピーします。
  • ポート 3000 番を開放します。API がこのポートからリクエストを受け付けます。
  • コマンド bun server.js の実行によってコンテナー起動が行われた際に、サーバーを実行します。

アプリケーションの実行

端末画面内の bun-docker ディレクトリから以下のコマンドを実行します。

$ docker compose up --build

ブラウザーを開いて http://localhost:3000 にアクセスしてアプリケーションを確認します。 ブラウザー上には {"Status" : "OK"} というメッセージが表示されるはずです。

端末画面から ctrl+c を押下してアプリケーションを停止します。

バックグラウンドでのアプリケーション実行

アプリケーションは端末から切り離して実行することができます。 それには -d オプションをつけます。 端末画面内の bun-docker ディレクトリから以下のコマンドを実行します。

$ docker compose up --build -d

ブラウザーを開いて http://localhost:3000 にアクセスしてアプリケーションを確認します。

端末画面から以下のコマンドを実行してアプリケーションを停止します。

$ docker compose down

まとめ

本節では Docker を使って Bun アプリケーションをコンテナー化して実行する方法について学びました。

関連情報

次のステップ

次の節では、コンテナーを使ってアプリケーションの開発を行う方法を学びます。