초보자를 위한 Docker: 제로부터 10분 안에 로컬에서 풀 스택 실행하기
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 유료), 멀티‑스테이지 빌드, 그리고 프로덕션 준비 체크리스트를 다룹니다.