Waylog Blog

Docker로 개발 환경 통일하기: "내 컴퓨터에선 되는데요?" 종결

DevOps

팀 프로젝트를 시작할 때 가장 먼저, 그리고 가장 오래 겪는 고통은 바로 "환경 설정"입니다. Node.js 버전이 달라서, OS가 달라서(윈도우 vs 맥), DB 설정이 꼬여서... 이런 비생산적인 삽질을 끝내주는 기술이 바로 Docker입니다.

1. 가상머신(VM) vs 컨테이너

과거에는 VMware 같은 가상머신을 썼습니다. 하지만 VM은 OS 전체를 가상화하므로 무겁고 느립니다. 반면 Docker 컨테이너는 호스트 OS의 커널을 공유하면서 프로세스만 격리합니다. 따라서 훨씬 가볍고 빠르며, 부팅 시간이 거의 없습니다.

2. Dockerfile: 인프라를 코드로 (IaC)

Dockerfile은 "어떤 환경을 만들지"를 적어놓은 레시피입니다.

# 베이스 이미지: Node.js 18 버전 사용
FROM node:18-alpine

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 파일 복사 및 설치
COPY package.json ./
RUN npm install

# 소스 코드 복사
COPY . .

# 3000번 포트 열기
EXPOSE 3000

# 실행 명령어
CMD ["npm", "run", "dev"]

이 파일만 있으면, 팀원 그 누구의 컴퓨터에서도, 심지어 배포 서버에서도 docker build 명령 하나로 완벽하게 동일한 실행 환경을 만들 수 있습니다.

3. Docker Compose: 오케스트레이션의 시작

웹 애플리케이션은 혼자 돌지 않습니다. DB도 필요하고 Redis도 필요합니다. 이걸 하나하나 컨테이너로 띄우는 건 번거롭습니다. docker-compose.yml을 사용하면 여러 컨테이너를 한 번에 정의하고 실행할 수 있습니다.

version: '3'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:13
    environment:
      POSTGRES_PASSWORD: password

이제 docker-compose up 명령어 한 방이면 프론트엔드 서버와 DB가 동시에 실행되고 서로 연결까지 됩니다.

4. 왜 써야 할까?

  1. 일관성: 개발, 스테이징, 프로덕션 환경이 모두 같습니다. "환경 차이로 인한 버그"가 사라집니다.
  2. 격리성: 내 PC에 Node.js나 Python을 지저분하게 설치할 필요가 없습니다. 컨테이너를 지우면 깔끔하게 사라집니다.
  3. 온보딩 속도: 신규 입사자에게 "이 문서를 보고 3일 동안 환경 설정하세요" 대신 "Docker 설치하고 이 명령어 치세요"라고 말하면 끝입니다.

Docker는 이제 선택이 아닌 백엔드/프론트엔드 공통 필수 교양입니다.