Docker 배우기: 이해관계자에게 Node.js 설치를 요구하지 마세요

발행: (2026년 1월 10일 오후 10:36 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

한 번은 주요 이해관계자에게 진행 상황을 보여주기 위해 그의 노트북에 Postgres를 설치해 달라고 요청한 적이 있습니다. 그때는 2024년 9월, 제 커리어 초반이었고, 그 순간의 부끄러움은 오늘날 제가 Docker와 개발자 경험에 집착하게 만든 원동력이 되었습니다.

이해관계자가 직접 프로젝트를 시도하고 싶어 했을 때, 저는 그에게 할 일 목록을 주었습니다:

  1. Node.js와 PNPM을 설치한다.
  2. 로컬 Postgres 인스턴스를 설정한다.
  3. Linux 환경으로 전환한다.
  4. 자격 증명을 수동으로 구성하고 마이그레이션을 실행한다.

저는 프로젝트를 공유한 것이 아니라 위험 요소를 공유한 것이었습니다. 이 경험은 저에게 큰 깨달음을 주었습니다: 개발자의 업무는 단순히 코드를 작성하는 것이 아니라 빠르게 가치를 전달하는 것입니다. 이해관계자나 새로운 팀원이 몇 분 안에 프로젝트를 실행할 수 없다면, 저는 실패한 것입니다.

왜 개발에 Docker를 사용할까?

Docker는 종종 DevOps 도구로 마케팅되지만 전문 개발 환경에서도 마찬가지로 뛰어납니다. 다음과 같은 작업 대신:

  • Postgres를 수동으로 설치하기
  • WSL 설정하기
  • 각 서비스가 실행 중인지, 버전이 일치하는지 확인하기

Docker Desktop을 한 번 설치하고 단일 명령으로 전체 스택을 띄울 수 있습니다. 우리 회사에서는 온보딩 시간을 5 일에서 몇 시간으로 단축했습니다.

컨테이너는 호스트 OS 커널을 공유하므로 전체 VM에 비해 가볍습니다. 필요한 라이브러리와 종속성만 패키징하므로 시작이 빠르고 어느 머신에서든 재현하기 쉽습니다.

핵심 Docker 개념

ConceptDescription
Dockerfile이미지를 빌드하는 방법을 정의하는 청사진(기본 OS, Node.js 버전, 종속성 등).
ImageDockerfile에서 생성된 읽기 전용 스냅샷. 애플리케이션과 그 환경을 포함합니다.
Container이미지의 실행 인스턴스. 호스트 시스템에 영향을 주지 않고 컨테이너를 시작, 중지 및 삭제할 수 있습니다.

Docker Compose로 “Postgres 골칫거리” 해결하기

프로젝트 구조

/project-root
│   docker-compose.yaml
│   Dockerfile
│   .dockerignore
│   ... (source code)

Dockerfile (Next.js 앱 빌드)

# Dockerfile
FROM node:20-alpine

# Install PNPM globally
RUN npm install -g pnpm

# Set working directory
WORKDIR /app

# Install dependencies
COPY package.json pnpm-lock.yaml* ./
RUN pnpm install

# Copy source code
COPY . .

# Expose the development port
EXPOSE 3000

# Start the dev server
CMD ["pnpm", "dev"]

.dockerignore (원치 않는 파일이 이미지에 포함되는 것을 방지)

node_modules
.pnpm-debug.log

.next
out
build

.env
.env.local
.env*.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

.git
.gitignore

.DS_Store
Thumbs.db

docker-compose.yaml (서비스를 오케스트레이션)

# docker-compose.yaml
services:
  db:
    image: postgres:15-alpine
    container_name: nextjs-db
    restart: always
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: supersecretpassword
      POSTGRES_DB: db
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  app:
    build: .
    container_name: nextjs-app
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://admin:supersecretpassword@db:5432/db
    volumes:
      - .:/app
      - /app/node_modules
    depends_on:
      - db
    command: pnpm dev

volumes:
  postgres_data:

핵심 포인트

  • depends_on은 데이터베이스 컨테이너가 올라간 후에만 앱이 시작되도록 보장합니다.
  • 프로덕션 환경에서는 앱이 연결하기 전에 DB가 실제로 준비되었는지 확인하기 위해 healthcheck를 추가합니다.
  • named volume(postgres_data)을 사용하면 컨테이너 재시작 시에도 데이터베이스 데이터가 유지됩니다.

docker compose up을 실행하면 Next.js 이미지가 빌드되고, Postgres 이미지가 풀되며, 네트워크가 생성되고 두 서비스가 시작됩니다—1시간 걸리던 수동 설정을 10초 명령으로 바꿔줍니다.

결론

Docker는 내 작업 흐름을 “이해관계자에게 모든 것을 설치하도록 요청”에서 “어디서든 실행되는 환경을 제공”으로 바꾸었습니다. 개발 스택을 컨테이너화함으로써 나는 시간을 되찾고, 팀의 개발자 경험을 개선했으며, 이제는 누구도 노트북에 데이터베이스를 설치할 필요가 없게 되었습니다.

프로젝트—또는 경력을—확장하고 싶다면 오늘부터 컨테이너화를 시작하세요. 미래의 당신과 팀이 감사할 것입니다.

Back to Blog

관련 글

더 보기 »

안녕, 뉴비 여기요.

안녕! 나는 다시 S.T.E.M. 분야로 돌아가고 있어. 에너지 시스템, 과학, 기술, 공학, 그리고 수학을 배우는 것을 즐겨. 내가 진행하고 있는 프로젝트 중 하나는...