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 편집