개발자를 위한 Docker: 이미지, 컨테이너, Compose

DevOps2026-10-08TryQuickToolBox

여러분의 컴퓨터에서는 잘 동작하는 앱을 만들었지만, 배포하면 문제가 생깁니다. 의존성이 빠져 있고, 버전이 다르며, 설정은 엉망입니다. Docker는 애플리케이션과 그 환경을 하나의 휴대 가능한 단위로 패키징하여 이 문제를 해결합니다. 이 글에서는 Docker 이미지, 컨테이너, Docker Compose를 실용적인 예제와 함께 설명하여 개발 워크플로우를 간소화할 수 있도록 도와드립니다.

Docker 이미지란 무엇인가?

Docker 이미지는 애플리케이션 코드, 런타임, 라이브러리, 환경 변수, 설정 파일을 포함하는 읽기 전용 템플릿입니다. 앱 환경의 스냅샷이라고 생각하면 됩니다. 이미지는 지침이 담긴 텍스트 파일인 Dockerfile에서 빌드됩니다.

다음은 Node.js 앱을 위한 간단한 Dockerfile입니다:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

각 지침은 레이어를 생성합니다. 레이어는 캐시되므로 코드 변경 후 다시 빌드할 때는 변경된 레이어부터 이후 단계만 다시 실행됩니다. 이로 인해 빌드가 빨라집니다.

Docker 컨테이너란 무엇인가?

컨테이너는 이미지의 실행 인스턴스입니다. 자체 파일 시스템, 네트워크, 프로세스 공간을 가진 격리된 프로세스이지만 호스트 OS 커널을 공유합니다. 이로 인해 컨테이너는 가상 머신에 비해 가볍고 시작 속도가 빠릅니다.

이미지에서 컨테이너를 실행하려면:

docker run -d -p 3000:3000 --name myapp my-node-app

이 명령은 컨테이너를 백그라운드 모드(-d)로 시작하고, 호스트의 3000 포트를 컨테이너의 3000 포트에 매핑하며(-p 3000:3000), 이름을 myapp으로 지정합니다.

컨테이너는 기본적으로 일시적입니다. 내부에 기록된 데이터는 컨테이너가 중지되면 사라집니다. 데이터를 유지하려면 볼륨을 사용하세요:

docker run -v /host/data:/app/data my-node-app

Docker Compose를 사용하는 이유

실제 애플리케이션은 종종 여러 서비스가 필요합니다: 웹 서버, 데이터베이스, 캐시 등. 각각을 docker run으로 실행하고 수동으로 연결하는 것은 번거롭습니다. Docker Compose를 사용하면 단일 YAML 파일로 멀티 컨테이너 앱을 정의하고 실행할 수 있습니다.

다음은 PostgreSQL과 Redis를 사용하는 Node.js 앱을 위한 docker-compose.yml입니다:

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
      - REDIS_URL=redis://cache:6379
    depends_on:
      - db
      - cache
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
  cache:
    image: redis:7
volumes:
  pgdata:

다음 명령으로 모든 것을 실행하세요:

docker compose up -d

Compose는 서비스가 이름(예: db, cache)으로 서로 통신할 수 있도록 네트워크를 생성합니다. 또한 볼륨 생성과 의존성 순서를 처리합니다.

개발자를 위한 주요 Docker 명령어

개발에서 Docker 모범 사례

흔한 함정과 피하는 방법

함정 1: 비대해진 이미지. ubuntu와 같은 전체 OS 기반 이미지를 사용하면 1GB 이상의 이미지가 될 수 있습니다. slim 또는 alpine 변형을 사용하세요.

함정 2: 느린 빌드. Dockerfile 지침을 변경 빈도가 낮은 것부터 높은 것 순으로 배치하세요. 소스 코드를 복사하기 전에 패키지 파일을 복사하고 의존성을 설치하세요.

함정 3: 데이터 손실. 데이터베이스에는 항상 볼륨을 사용하세요. 볼륨이 없으면 컨테이너가 제거될 때 데이터가 사라집니다.

함정 4: 네트워킹 혼란. Compose에서 서비스는 기본 네트워크를 통해 서비스 이름을 호스트 이름으로 사용하여 통신합니다. 다른 서비스에 접근할 때 localhost를 사용하지 마세요.

FAQ

이미지와 컨테이너의 차이점은 무엇인가요?

이미지는 읽기 전용 템플릿이고, 컨테이너는 해당 이미지의 실행 인스턴스입니다. 동일한 이미지에서 여러 컨테이너를 실행할 수 있습니다.

프로덕션에서 Docker Compose를 사용할 수 있나요?

Compose는 주로 개발 및 테스트용입니다. 프로덕션의 경우 Kubernetes나 Docker Swarm과 같은 오케스트레이터를 고려하세요. 다만 간단한 배포에는 Compose도 사용할 수 있습니다.

새 코드로 컨테이너를 업데이트하려면 어떻게 하나요?

docker build로 이미지를 다시 빌드한 다음 컨테이너를 다시 생성하세요: docker compose up -d --build.

개발 워크플로우를 간소화할 준비가 되셨나요? 컨테이너화된 웹 서버 로그를 빠르게 디버깅하려면 Nginx Log Analyzer를 사용해 보세요.