Docker 소개: 이해관계자에게 Postgres 설치를 요구하지 마세요! 🚀

발행: (2026년 1월 12일 오전 05:32 GMT+9)
9 분 소요
원문: Dev.to

Source: Dev.to

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

프로젝트는 아직 초기 단계였습니다. 이해관계자가 직접 시도해 보겠다고 하자 저는 그에게 할 일 목록을 주었습니다:

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

저는 프로젝트를 공유한 것이 아니라 위험 요소를 공유한 것이었습니다.

오늘날 저는 코드를 배포하지 않습니다; 환경을 배포합니다.

그 경험이 저에게 큰 깨달음을 주었습니다. 개발자로서 제 일은 단순히 코드를 작성하는 것이 아니라 가치를 전달하는 것입니다. 이해관계자나 새로운 팀원이 몇 분 안에 프로젝트를 실행할 수 없으면 저는 실패한 것입니다.

Source:

왜 개발에 Docker를 사용해야 할까?

Docker는 종종 DevOps 도구로 홍보되지만, 전문적인 개발 환경에서도 똑같이 강력합니다.

수동 방식

  • 머신에 Postgres 설치
  • WSL(또는 다른 Linux 레이어) 설정
  • 각 서비스가 실행 중인지 확인
  • 각 서비스를 개별적으로 구성
  • 버전 호환성 검증
  • …등등

Docker 방식

“Docker Desktop을 설치하고 몇 가지 명령만 실행하면 바로 시작할 수 있습니다.”

간단한 확인

docker --version          # Docker가 설치됐는지 확인
docker run hello-world    # 이미지를 받아 몇 초 만에 실행

Docker는 코드, 런타임, 라이브러리컨테이너라는 단일 단위로 패키징하여 어떤 OS/머신에서도 실행할 수 있게 합니다.

  • VM은 무겁습니다: 전체 OS 복사본이 필요하고 RAM/CPU를 많이 소비합니다.
  • 컨테이너는 호스트 OS 커널을 공유하고 필요한 라이브러리만 설치합니다.

Core Docker Concepts

ConceptDescription
Dockerfile이미지(운영체제, Node 버전, 의존성)를 빌드하는 방법을 정의하는 청사진.
ImageDockerfile에서 생성된 읽기 전용 스냅샷.
Container이미지의 실행 인스턴스; 호스트에 영향을 주지 않고 시작/중지/삭제할 수 있음.

Docker Compose로 “Postgres 두통” 해결하기

이해관계자의 목록을 기억하시나요? Docker Compose를 사용하면 전체 수동 과정을 한 줄의 명령으로 처리할 수 있습니다:

docker compose up

각 서비스(앱, 데이터베이스, 메시지 큐)를 하나의 악기로 생각하세요. docker‑compose.yaml 파일에서 YAML로 이들을 조율하면, 서비스들의 밴드를 조화로운 전체로 만들 수 있습니다.

Note: Docker Compose는 개발 환경 및 작은 MVP에 이상적입니다. 대규모 프로덕션에서는 결국 로드 밸런서와 Kubernetes가 필요합니다.

프로젝트 구조

/project-root

├─ docker-compose.yaml
├─ Dockerfile
└─ .dockerignore

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 dev server port
EXPOSE 3000

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

.dockerignore

.gitignore와 마찬가지로, 이 파일은 불필요하거나 민감한 파일이 이미지에 포함되는 것을 방지합니다.

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:

핵심 포인트

  • Base image: node:20-alpine (경량; 필요에 따라 다른 Node 이미지로 교체 가능).
  • depends_on 은 DB 컨테이너가 가동된 후에 앱이 시작되도록 보장합니다.
  • Named volume postgres_data 는 컨테이너 재시작 시에도 DB 데이터를 지속합니다.
  • Healthchecks (선택 사항)는 의존성을 더욱 견고하게 만들기 위해 추가할 수 있습니다.

원‑커맨드 설정

위의 세 파일을 프로젝트 루트에 두면, 1시간 수동 설정10초 명령으로 바꿀 수 있습니다:

docker compose up

Docker는:

  1. Dockerfile에서 Next.js 이미지를 빌드합니다.
  2. Postgres 이미지를 가져옵니다.
  3. 두 컨테이너를 연결하는 네트워크를 생성합니다.
  4. 핫‑리로드가 활성화된 개발 서버를 시작합니다.

필요에 따라 시작 스크립트나 시드 스크립트를 추가할 수도 있습니다.

요점

저는 Docker가 복잡한 DevOps 도구에 불과하다고 생각했었습니다—2024년 어느 오후, 고위 개발자는 단순히 멋진 코드를 작성하는 것이 아니라 코드를 비즈니스를 위한 도구로 활용하는 것이라는 사실을 깨달을 때까지.

코드만 배포하는 대신 환경을 제공함으로써 저는 시간을 되찾고, 온보딩을 개선했으며, 실질적인 가치를 제공했습니다.

‘Postgres 머리통증’을 한 번의 명령으로 해결할 준비가 되셨나요? 🚀

Containerizing Your Development Environment

팀의 개발자 경험(DX)을 향상시키고, 이해관계자가 노트북에 데이터베이스를 설치해야 하는 상황을 없앴습니다.

프로젝트를 확장하거나 커리어를 성장시키고 싶다면, 오늘부터 컨테이너화를 시작하세요. 미래의 자신과 팀이 고마워할 겁니다.

가장 힘들었던 설정 이야기는 무엇인가요? 아래 댓글에 공유해주세요!

저는 스타트업이 확장 가능한 애플리케이션과 내부 도구를 구축하도록 돕습니다. 이러한 시스템을 어떻게 구축하는지 보려면 여기에서 확인하세요: 👉 www.itsfranciscoluna.com

Back to Blog

관련 글

더 보기 »

안녕, 뉴비 여기요.

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