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 構建的任何階段都不能包含的文件/目錄。下面是一個忽略文件的示例

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

現在我們將使用 docker build 將這個 Dockerfile 轉換為 Docker 鏡像,這是一個獨立的模板,包含運行應用所需的所有依賴項和配置。

-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 鏡像啟動一個新容器。它將以 分離 模式(-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學習網由www.bunjs.com.cn整理維護