Deno 언어별 가이드
Deno 언어별 가이드 (Deno language-specific guide)
Deno 런타임을 사용하는 JavaScript 애플리케이션을 Docker로 컨테이너화하는 방법을 배우는 가이드예요.
출처: 문서
본문
Deno 시작 가이드는 Docker로 컨테이너화된 Deno 애플리케이션을 만드는 방법을 알려줘요.
감사의 말: Docker는 이 가이드에 기여해 주신 Pradumna Saraf 님께 감사를 전해요.
무엇을 배우게 될까요 (What will you learn?)
- Docker로 Deno 애플리케이션을 컨테이너화하고 실행하기
- 컨테이너를 사용해 Deno 애플리케이션을 개발할 로컬 환경을 구성하기
- Docker Compose로 애플리케이션 실행하기
사전 요구사항 (Prerequisites)
- JavaScript에 대한 기본적인 이해가 있다고 가정해요.
- 컨테이너, 이미지, Dockerfile 같은 Docker 개념에 익숙해야 해요. Docker가 처음이라면 Docker basics 가이드부터 시작할 수 있어요.
Deno 시작 모듈을 완료하면, 이 가이드의 예시와 설명을 바탕으로 자신만의 Deno 애플리케이션을 컨테이너화할 수 있게 될 거예요.
기존 Deno 애플리케이션을 컨테이너화하는 것부터 시작해 볼게요.
Deno 애플리케이션 컨테이너화하기 (Containerize a Deno application)
사전 요구사항 (Prerequisites)
Git 클라이언트가 있어야 해요. 이 섹션의 예시는 커맨드라인 기반 Git 클라이언트를 사용하지만, 어떤 클라이언트를 써도 상관없어요.
개요 (Overview)
오랫동안 Node.js는 서버 사이드 JavaScript 애플리케이션의 대표 런타임이었어요. 하지만 최근 몇 년 사이 Deno를 포함한 새로운 대안 런타임이 등장했죠. Node.js와 마찬가지로 Deno도 JavaScript와 TypeScript 런타임이지만, 현대적인 보안 기능, 내장 표준 라이브러리, TypeScript 기본 지원 등 새로운 접근 방식을 채택했어요.
왜 Docker로 Deno 애플리케이션을 개발할까요? 런타임을 선택할 수 있다는 건 흥미롭지만, 여러 런타임과 그 의존성을 여러 환경에서 일관되게 관리하는 건 까다로울 수 있어요. 바로 이 지점에서 Docker가 매우 유용해져요. 컨테이너로 환경을 필요할 때 만들고 파괴하면 런타임 관리가 단순해지고 일관성이 보장돼요. 또한 Deno가 계속 성장·발전함에 따라 Docker는 안정적이고 재현 가능한 개발 환경을 구축하는 데 도움을 주며, 설정 문제를 최소화하고 작업 흐름을 매끄럽게 만들어줘요.
샘플 애플리케이션 받기 (Get the sample application)
이 가이드에 사용할 샘플 애플리케이션을 클론하세요. 터미널을 열고 작업할 디렉터리로 이동한 다음, 다음 명령을 실행해 리포지토리를 클론하세요:
$ git clone https://github.com/dockersamples/docker-deno.git && cd docker-deno
이제 deno-docker 디렉터리 안에 다음과 같은 내용물이 있어야 해요.
├── deno-docker/
│ ├── compose.yml
│ ├── Dockerfile
│ ├── LICENSE
│ ├── server.ts
│ └── README.md
샘플 애플리케이션 이해하기 (Understand the sample application)
샘플 애플리케이션은 Oak 프레임워크를 사용해 JSON 응답을 반환하는 간단한 API를 만드는 Deno 애플리케이션이에요. 애플리케이션은 8000 포트에서 수신 대기하며, 브라우저에서 접근하면 {"Status" : "OK"} 메시지를 반환해요.
// server.ts
import { Application, Router } from "https://deno.land/x/[email protected]/mod.ts";
const app = new Application();
const router = new Router();
// Define a route that returns JSON
router.get("/", (context) => {
context.response.body = { Status: "OK" };
context.response.type = "application/json";
});
app.use(router.routes());
app.use(router.allowedMethods());
console.log("Server running on http://localhost:8000");
await app.listen({ port: 8000 });
Dockerfile 만들기 (Create a Dockerfile)
Dockerfile을 만들기 전에 기본 이미지(base image)를 선택해야 해요. Deno Docker 공식 이미지(Official Image)를 쓰거나, Hardened Image 카탈로그의 Docker Hardened Image(DHI)를 사용할 수 있어요.
DHI를 선택하면 가볍고 안전한 프로덕션 준비 이미지라는 장점이 있어요. 자세한 내용은 Docker Hardened Images를 참고하세요.
Docker Hardened Images 사용하기
Deno용 Docker Hardened Images(DHI)는 Docker Hardened Images 카탈로그에 있어요. dhi.io 레지스트리에서 직접 DHI를 가져올(pull) 수 있어요.
DHI 레지스트리에 로그인하세요:
$ docker login dhi.io
Deno DHI를 dhi.io/deno:2로 가져옵니다. 이 예시의 태그(2)는 Deno의 최신 2.x 버전을 가리켜요.
$ docker pull dhi.io/deno:2
다른 사용 가능한 버전은 카탈로그를 참고하세요.
# Use the DHI Deno image as the base image
FROM dhi.io/deno:2
# Set the working directory
WORKDIR /app
# Copy server code into the container
COPY server.ts .
# Set permissions (optional but recommended for security)
USER deno
# Expose port 8000
EXPOSE 8000
# Run the Deno server
CMD ["run", "--allow-net", "server.ts"]
공식 이미지 사용하기
Docker 공식 이미지를 사용하는 건 간단해요. 다음 Dockerfile에서 FROM 지시문이 기본 이미지로 denoland/deno:latest를 사용하는 걸 볼 수 있어요. 이것이 Deno의 공식 이미지이며 Docker Hub에서 사용할 수 있어요.
# Use the official Deno image
FROM denoland/deno:latest
# Set the working directory
WORKDIR /app
# Copy server code into the container
COPY server.ts .
# Set permissions (optional but recommended for security)
USER deno
# Expose port 8000
EXPOSE 8000
# Run the Deno server
CMD ["run", "--allow-net", "server.ts"]
기본 이미지를 지정하는 것 외에도 이 Dockerfile은 다음 작업을 해요:
- 컨테이너의 작업 디렉터리를
/app으로 설정해요. server.ts를 컨테이너 안으로 복사해요.- 애플리케이션을 비-root 사용자로 실행하도록 사용자를
deno로 설정해요. - 애플리케이션으로의 트래픽을 허용하도록 8000 포트를 노출해요.
CMD지시문으로 Deno 서버를 실행해요.--allow-net플래그로 애플리케이션의 네트워크 접근을 허용해요.server.ts파일은 Oak 프레임워크를 사용해 8000 포트에서 수신 대기하는 간단한 API를 만들어요.
애플리케이션 실행하기 (Run the application)
deno-docker 디렉터리에 있는지 확인하세요. 터미널에서 다음 명령을 실행해 애플리케이션을 빌드하고 실행해요.
$ docker compose up --build
브라우저를 열고 http://localhost:8000 에서 애플리케이션을 확인하세요. 브라우저에 {"Status" : "OK"} 메시지가 보일 거예요.
터미널에서 ctrl+c를 눌러 애플리케이션을 중지하세요.
애플리케이션을 백그라운드에서 실행하기
터미널에서 분리(detached)해 애플리케이션을 실행하려면 -d 옵션을 추가하면 돼요. deno-docker 디렉터리 안에서 다음 명령을 실행하세요.
$ docker compose up --build -d
브라우저를 열고 http://localhost:8000 에서 애플리케이션을 확인하세요.
터미널에서 다음 명령으로 애플리케이션을 중지하세요.
$ docker compose down
Deno 개발에 컨테이너 사용하기 (Use containers for Deno development)
사전 요구사항 (Prerequisites)
"Deno 애플리케이션 컨테이너화하기"를 완료하세요.
개요 (Overview)
이 섹션에서는 컨테이너화된 애플리케이션의 개발 환경을 구성하는 방법을 배워요. 내용은 다음과 같아요:
- 코드를 편집하고 저장할 때 실행 중인 Compose 서비스를 자동으로 업데이트하도록 Compose를 구성하기
샘플 애플리케이션 받기 (Get the sample application)
이 가이드에 사용할 샘플 애플리케이션을 클론하세요. 터미널을 열고 작업할 디렉터리로 이동한 다음, 다음 명령을 실행해 리포지토리를 클론하세요:
$ git clone https://github.com/dockersamples/docker-deno.git && cd docker-deno
서비스 자동 업데이트하기 (Automatically update services)
Compose Watch를 사용해 코드를 편집·저장할 때 실행 중인 Compose 서비스를 자동으로 업데이트하세요. Compose Watch에 대한 자세한 내용은 Use Compose Watch를 참고하세요.
IDE나 텍스트 편집기에서 compose.yml 파일을 열고 Compose Watch 지시문을 추가하세요. 다음 예시는 compose.yml 파일에 Compose Watch를 추가하는 방법을 보여줘요.
services:
server:
image: deno-server
build:
context: .
dockerfile: Dockerfile
ports:
- "8000:8000"
develop:
watch:
- action: rebuild
path: .
다음 명령을 실행해 Compose Watch로 애플리케이션을 실행하세요.
$ docker compose watch
이제 server.ts를 수정하면 이미지를 다시 빌드하지 않아도 실시간으로 변경 사항이 반영되는 걸 볼 수 있어요.
직접 확인해 보려면 좋아하는 텍스트 편집기에서 server.ts 파일을 열고 메시지를 {"Status" : "OK"}에서 {"Status" : "Updated"}로 바꿔 보세요. 파일을 저장하고 브라우저를 http://localhost:8000 에서 새로고침하면 업데이트된 메시지가 보일 거예요.
터미널에서 ctrl+c를 눌러 애플리케이션을 중지하세요.
요약 (Summary)
이 섹션에서는 코드를 업데이트할 때 컨테이너를 자동으로 다시 빌드·실행하는 Compose Watch 사용법도 배웠어요.
관련 정보:
- Compose file reference
- Compose file watch
- Multi-stage builds