초보자를 위한 Docker: 제로부터 10분 안에 로컬에서 풀 스택 실행하기

발행: (2026년 4월 24일 PM 02:30 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

위에 제공된 내용 외에 번역할 텍스트가 없습니다. 번역이 필요한 전체 텍스트를 제공해 주시면 한국어로 번역해 드리겠습니다.

즉시 모든 서비스 실행

docker run -d -p 8080:80 nginx:latest

명령을 실행한 후 열어보세요 — Nginx가 실행 중인 것을 볼 수 있습니다. 설치도, 설정도, 충돌도 없습니다.

자체 앱을 이미지로 빌드하기

docker build -t my-app:1.0 .

전체 스택 시작 (앱 + db + cache)

docker compose up -d

Node.js 앱을 위한 Dockerfile

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

팁: package*.json을 나머지 소스보다 먼저 복사하면 Docker가 npm ci 단계를 캐시합니다. 코드가 변경된 후 재빌드가 수십 초가 아니라 몇 초만에 완료됩니다.

빌드 및 실행:

docker build -t my-app:1.0 .
docker run -d -p 3000:3000 my-app:1.0

Python/Flask 앱용 Dockerfile

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]

docker‑compose 예시 (app + PostgreSQL + Redis)

version: "3.9"
services:
  app:
    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:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data

  cache:
    image: redis:7-alpine

volumes:
  pgdata:

일반적인 워크플로:

docker compose up -d          # 모든 것을 시작
docker compose down           # 모든 것을 중지
docker compose up -d --build  # 코드 변경 후 재빌드
docker compose down -v        # 중지하고 데이터베이스 데이터를 삭제

pgdata 볼륨은 컨테이너 재시작 시 데이터베이스가 지속되도록 보장합니다. -v 옵션은 새로 시작하고 싶을 때만 사용하세요.

일반적인 Docker 명령

명령수행 내용
docker run -d -p 8080:80 nginx컨테이너 실행
docker build -t app:1.0 .이미지 빌드
docker ps실행 중인 컨테이너 목록
docker ps -a전체 컨테이너 목록
docker logs -f my-app컨테이너 로그 실시간 보기
docker exec -it my-app sh컨테이너 내부 쉘 열기
docker stop my-app컨테이너 중지
docker rm my-app컨테이너 삭제
docker compose up -d모든 서비스 시작
docker compose down모든 서비스 중지

모범 사례 체크리스트

  • ✅ Alpine 또는 Slim 베이스 이미지를 사용하세요 (기본 ~1 GB 이미지 대신)
  • .dockerignore 파일을 추가하여 node_modules, .git, .env 등을 제외하세요.
  • ✅ 컨테이너를 비루트 사용자로 실행하세요 (예: USER node)
  • ✅ 비밀 정보는 환경 변수로 전달하고, 절대로 하드코딩하지 마세요
  • ✅ 영구 데이터를 위해 볼륨을 구성하세요 (예: 데이터베이스 파일)
  • ✅ 헬스 체크를 추가하세요, 예: HEALTHCHECK CMD curl -f http://localhost:3000/health || exit 1
  • docker compose up 으로 깨끗한 머신에서 설정을 검증하세요

Troubleshooting tips

  • Container exits immediately – 앱이 시작 시 충돌했을 가능성이 높습니다. docker logs <container> 명령으로 로그를 확인하세요. 흔한 원인은 환경 변수가 누락된 경우입니다.
  • Database is empty after restart – 데이터베이스 데이터에 대한 볼륨을 정의했는지 확인하세요; 그렇지 않으면 데이터가 컨테이너 내부에 저장되어 컨테이너가 중지될 때 사라집니다.
  • Port already in use – 다른 프로세스가 호스트 포트를 사용 중입니다. 해당 프로세스를 중지하거나 다른 호스트 포트를 매핑하세요, 예: -p 3001:3000.
  • Image is too large – 더 작은 베이스 이미지(node:20-alpine)로 전환하고, .dockerignore 파일을 추가하며, 컴파일 언어의 경우 멀티‑스테이지 빌드를 고려하세요. 일반적인 감소량: 1 GB → ~100 MB.

추가 읽기

전체 가이드는 Windows/macOS/Linux에 대한 설치 단계별 안내, 추가 Python Dockerfile 예제, Docker Desktop 라이선스(무료 vs 유료), 멀티‑스테이지 빌드, 그리고 프로덕션 준비 체크리스트를 다룹니다.

trackstack.tech에서 전체 기사 읽기

0 조회
Back to Blog

관련 글

더 보기 »

Zig으로 C 컴파일러 작성하기 (2025)

소개 이것은 제가 paella(https://github.com/asibahi/paella)를 개발하면서 쓴 일련의 기사이며, Nora Sandler의 *Writing a C Compiler*를 따라 작성한 것입니다.

Pygame Snake, 파트 2

소개 파트 1에서는 1000 × 1000 픽셀 캔버스와 지속적으로 움직이는 50 × 50 픽셀 정사각형을 가진 기본 pygame 창을 설정했습니다. 뱀 게임을 위해 w...

Pygame Snake, 파트 1

소개 Pygame은 Python으로 2D 게임을 만들 수 있게 해주는 모듈입니다. 프로그래밍 개념을 배우기에 좋은 방법이며, 고전 게임인 Snake는 ...