“내 컴퓨터에서는 되는데요?” 의 종말
개발자라면 한 번쯤 들어봤을 이 문장. Docker는 이 문제를 근본적으로 해결합니다. 개발 환경을 컨테이너라는 독립된 상자에 담아서, 어떤 컴퓨터에서든 동일하게 실행되도록 보장합니다.
2026년 현재, Docker는 개발자의 필수 도구입니다. 이 글에서는 Docker를 처음 접하는 분도 바로 실무에 적용할 수 있도록 단계별로 안내합니다.
Docker란? 쉽게 이해하기
가상머신 vs Docker
| 가상머신 (VM) | Docker 컨테이너 | |
|---|---|---|
| 크기 | 수 GB | 수십 MB |
| 시작 시간 | 분 단위 | 초 단위 |
| OS | 전체 OS 포함 | 호스트 OS 공유 |
| 성능 | 오버헤드 큼 | 거의 네이티브 |
| 비유 | 아파트 한 채 | 방 하나 |
Docker 컨테이너는 가상머신보다 가볍고 빠릅니다. OS를 통째로 띄우는 대신, 앱에 필요한 것만 담아서 실행합니다.
Step 1: Docker 설치
Windows / Mac
Docker Desktop 다운로드 후 설치
Linux (Ubuntu)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
설치 확인
docker --version
# Docker version 26.x.x
docker run hello-world
# Hello from Docker! 메시지 확인
Step 2: 핵심 개념 이해
이미지 (Image)
앱을 실행하기 위한 설계도입니다. OS, 언어, 라이브러리, 코드가 모두 포함됩니다.
컨테이너 (Container)
이미지를 기반으로 실제 실행되는 인스턴스입니다. 하나의 이미지로 여러 컨테이너를 만들 수 있습니다.
Docker Hub
이미지를 공유하는 저장소입니다. node, python, nginx 등 공식 이미지를 무료로 사용할 수 있습니다.
이미지(설계도) → 컨테이너(실행 인스턴스) → 앱 실행
Step 3: 첫 번째 컨테이너 실행
# Node.js 18 컨테이너 실행
docker run -it node:18 bash
# 컨테이너 안에서
node --version # v18.x.x
exit
자주 쓰는 Docker 명령어
# 이미지 다운로드
docker pull python:3.12
# 컨테이너 목록 보기
docker ps # 실행 중인 것만
docker ps -a # 전체
# 컨테이너 중지/삭제
docker stop [컨테이너ID]
docker rm [컨테이너ID]
# 이미지 목록/삭제
docker images
docker rmi [이미지ID]
Step 4: Dockerfile 작성하기
Dockerfile은 이미지를 만드는 레시피입니다. 직접 작성하면 나만의 환경을 구성할 수 있습니다.
Node.js 앱 예제
# 베이스 이미지
FROM node:20-alpine
# 작업 디렉토리
WORKDIR /app
# 의존성 파일 복사 & 설치
COPY package*.json ./
RUN npm ci --production
# 소스 코드 복사
COPY . .
# 포트 설정
EXPOSE 3000
# 앱 실행
CMD ["node", "server.js"]
이미지 빌드 & 실행
# 이미지 빌드
docker build -t my-app:1.0 .
# 컨테이너 실행
docker run -p 3000:3000 my-app:1.0
Dockerfile 베스트 프랙티스
- alpine 이미지 사용:
node:20-alpine(훨씬 가벼움) - 레이어 캐싱 활용:
package.json을 먼저 복사 - .dockerignore 설정:
node_modules,.git제외 - 멀티스테이지 빌드: 빌드 도구를 최종 이미지에서 제거
Step 5: Docker Compose로 멀티 서비스 관리
실제 앱은 웹 서버 + DB + 캐시 등 여러 서비스로 구성됩니다. Docker Compose는 이를 한 파일로 관리합니다.
docker-compose.yml 예제
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:16-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
실행 명령어
# 모든 서비스 시작
docker compose up -d
# 로그 확인
docker compose logs -f
# 모든 서비스 중지
docker compose down
실전 활용 시나리오
시나리오 1: 팀 개발 환경 통일
# 새 팀원이 합류하면
git clone https://github.com/team/project.git
cd project
docker compose up -d
# 끝! 5분 만에 개발 환경 세팅 완료
시나리오 2: 로컬 DB 테스트
# MySQL을 설치하지 않고 바로 사용
docker run -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=test \
mysql:8.0
시나리오 3: CI/CD 파이프라인
GitHub Actions에서 Docker 이미지를 빌드하고 자동 배포하는 것이 현대 DevOps의 표준입니다.
Docker 초보자 FAQ
Q: Docker가 가상머신을 완전히 대체하나요?
A: 아닙니다. Docker는 앱 단위 격리에 적합하고, 완전한 OS 격리가 필요하면 VM이 필요합니다.
Q: Docker Desktop은 유료인가요?
A: 개인/소규모 기업은 무료입니다. 대기업(직원 250명 이상)은 유료 구독이 필요합니다.
Q: 윈도우에서 Docker가 잘 돌아가나요?
A: WSL2 기반으로 잘 동작합니다. 다만 Mac/Linux 대비 약간의 성능 차이가 있습니다.
결론: Docker로 개발 생산성 2배 올리기
Docker는 “있으면 좋은 도구”가 아니라 **“없으면 안 되는 도구”**입니다. 환경 설정에 시간을 낭비하지 않고, 코딩에만 집중할 수 있게 해줍니다.
오늘 배운 5단계를 순서대로 따라해보세요. 한 번 익숙해지면 Docker 없이는 개발하기 싫어질 것입니다!
댓글