들어가며
Docker는 애플리케이션을 컨테이너로 패키징하여 어디서든 동일하게 실행할 수 있게 해주는 플랫폼입니다. “내 컴퓨터에서는 되는데…“라는 문제를 해결해주는 핵심 도구입니다.
Docker란?
Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 기존 가상머신(VM)과 달리 경량화된 가상화를 제공합니다.
컨테이너 vs 가상머신
| 특성 | 컨테이너 | 가상머신 |
|---|---|---|
| 시작 시간 | 초 단위 | 분 단위 |
| 메모리 사용 | MB 단위 | GB 단위 |
| 격리 수준 | 프로세스 격리 | 완전한 격리 |
| OS | 호스트 OS 공유 | 개별 Guest OS |
| 이식성 | 매우 높음 | 높음 |
Docker 설치
Windows/macOS
Docker Desktop을 공식 웹사이트에서 다운로드하여 설치합니다.
Linux (Ubuntu)
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
docker --version
설치 확인
docker run hello-world
Docker 핵심 개념
이미지 (Image)
이미지는 컨테이너를 생성하기 위한 읽기 전용 템플릿입니다.
컨테이너 (Container)
컨테이너는 이미지의 실행 가능한 인스턴스입니다.
레지스트리 (Registry)
이미지를 저장하고 배포하는 저장소입니다. Docker Hub가 대표적입니다.
기본 명령어
이미지 관련
docker pull nginx
docker images
docker rmi nginx
docker build -t myapp:1.0 .
컨테이너 관련
docker run nginx
docker run -d nginx
docker run -d -p 8080:80 nginx
docker run -d --name web nginx
docker ps
docker ps -a
docker stop web
docker start web
docker rm web
-d 옵션은 백그라운드 실행, -p는 포트 매핑, --name은 컨테이너 이름 지정입니다.컨테이너 내부 접속
docker exec -it web bash
docker logs web
docker logs -f web
Dockerfile 작성
Dockerfile은 이미지를 빌드하기 위한 명령어 모음입니다.
기본 예제
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
Dockerfile 명령어
| 명령어 | 설명 |
|---|---|
| FROM | 베이스 이미지 지정 |
| WORKDIR | 작업 디렉토리 설정 |
| COPY | 파일 복사 |
| RUN | 명령어 실행 |
| EXPOSE | 포트 노출 |
| ENV | 환경 변수 설정 |
| CMD | 컨테이너 시작 명령어 |
| ENTRYPOINT | 컨테이너 진입점 |
이미지 빌드
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.dev .
.dockerignore 파일을 사용하여 불필요한 파일이 이미지에 포함되지 않도록 하세요.데이터 관리
볼륨 (Volume)
docker volume create mydata
docker run -v mydata:/app/data nginx
docker volume ls
docker volume rm mydata
바인드 마운트
docker run -v $(pwd)/data:/app/data nginx
Docker Compose
여러 컨테이너를 함께 관리하는 도구입니다.
docker-compose.yml 예제
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DATABASE_URL=postgresql://db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_DB=mydb
- POSTGRES_PASSWORD=secret
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Compose 명령어
docker-compose up
docker-compose up -d
docker-compose down
docker-compose logs
docker-compose ps
docker-compose exec web bash
개발 환경에서는
docker-compose up으로 모든 서비스를 한 번에 시작하고, docker-compose down으로 정리할 수 있습니다.네트워크
네트워크 종류
| 드라이버 | 설명 |
|---|---|
| bridge | 기본 네트워크 (컨테이너 간 통신) |
| host | 호스트 네트워크 공유 |
| none | 네트워크 비활성화 |
| overlay | 다중 호스트 네트워크 |
네트워크 명령어
docker network create mynet
docker run --network mynet nginx
docker network ls
docker network inspect mynet
이미지 최적화
멀티 스테이지 빌드
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
최적화 팁
- 작은 베이스 이미지 사용:
alpine태그 선호 - 레이어 캐싱 활용: 자주 변경되는 부분을 나중에 배치
- 불필요한 파일 제외:
.dockerignore활용 - 멀티 스테이지 빌드: 빌드 도구 제외
실전 예제: Python 웹 앱
프로젝트 구조
myapp/
├── app.py
├── requirements.txt
├── Dockerfile
└── docker-compose.yml
Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
빌드 및 실행
docker build -t myapp:1.0 .
docker run -d -p 5000:5000 --name myapp myapp:1.0
curl http://localhost:5000
마치며
Docker는 현대 개발 환경에서 필수적인 도구가 되었습니다. 로컬 개발부터 프로덕션 배포까지 일관된 환경을 제공하여 “내 컴퓨터에서는 되는데…” 문제를 해결해줍니다. 기본 명령어와 Dockerfile 작성법을 익히고, Docker Compose로 복잡한 애플리케이션도 쉽게 관리해보세요.
참고 자료
- Docker 공식 문서: https://docs.docker.com/
- Docker Hub: https://hub.docker.com/