> ## Documentation Index
> Fetch the complete documentation index at: https://bun.ll1025.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 Docker 容器化 Bun 应用

<Note>
  本指南假设你已经安装了 [Docker Desktop](https://www.docker.com/products/docker-desktop/)。
</Note>

[Docker](https://www.docker.com) 是一个将应用程序打包和运行为轻量级、可移植\_容器\_的平台，容器封装了所有必要的依赖项。

***

要\_容器化\_应用，请定义一个 `Dockerfile`。它列出了初始化容器、将本地项目文件复制到其中、安装依赖和启动应用程序的指令。

```docker Dockerfile icon="docker" theme={null}
# 使用官方 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" ]
```

***

接下来，添加一个 `.dockerignore` 文件。它使用与 `.gitignore` 相同的语法，列出要从 Docker 构建的每个阶段中排除的文件和目录。例如：

```txt .dockerignore icon="docker" theme={null}
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 terminal icon="terminal" theme={null}
docker build --pull -t bun-hello-world .
```

```txt theme={null}
[+] 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
 # ...大量命令...
 => 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 run` 从 `bun-hello-world` 镜像启动一个运行中的\_容器\_。`-d` 标志以\_分离\_模式运行，`-p 3000:3000` 将容器的 3000 端口映射到你机器上的 3000 端口。

`run` 命令会打印\_容器 ID\_。

```sh terminal icon="terminal" theme={null}
docker run -d -p 3000:3000 bun-hello-world
```

```txt theme={null}
7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d
```

***

容器现在在后台运行。访问 [localhost:3000](http://localhost:3000)。你应该会看到一条 `Hello, World!` 消息。

***

要停止容器，运行 `docker stop <container-id>`。

```sh terminal icon="terminal" theme={null}
docker stop 7f03e212a15ede8644379bce11a13589f563d3909a9640446c5bbefce993678d
```

***

如果你找不到容器 ID，`docker ps` 会列出所有正在运行的容器。

```sh terminal icon="terminal" theme={null}
docker ps
```

```txt theme={null}
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 文档](https://docs.docker.com/)。
