도커(Docker)는 컨테이너 기반의 가상화 플랫폼입니다. 애플리케이션과 그 실행 환경을 하나의 패키지로 묶어서 어떤 환경에서든 동일하게 실행할 수 있게 해주는 도구입니다.
┌─────────────────────────────────────┐
│ Application │
├─────────────────────────────────────┤
│ Binaries/Libs │
├─────────────────────────────────────┤
│ Guest OS │
├─────────────────────────────────────┤
│ Hypervisor │
├─────────────────────────────────────┤
│ Host OS │
├─────────────────────────────────────┤
│ Infrastructure │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ Application │
├─────────────────────────────────────┤
│ Binaries/Libs │
├─────────────────────────────────────┤
│ Docker Engine │
├─────────────────────────────────────┤
│ Host OS │
├─────────────────────────────────────┤
│ Infrastructure │
└─────────────────────────────────────┘
| 구분 | 가상화 (VM) | 컨테이너화 (Docker) |
|---|---|---|
| 리소스 사용량 | 높음 (각각 OS 필요) | 낮음 (OS 공유) |
| 시작 시간 | 느림 (분 단위) | 빠름 (초 단위) |
| 이식성 | 보통 | 높음 |
| 보안 | 강함 | 보통 |
docker --version
# 패키지 업데이트
sudo apt update
# 필요한 패키지 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# Docker 공식 GPG 키 추가
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Docker 레포지토리 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Docker 설치
sudo apt update
sudo apt install docker-ce
# 현재 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER
# 이미지 검색
docker search nginx
# 이미지 다운로드
docker pull nginx
# 로컬 이미지 목록 확인
docker images
# 이미지 삭제
docker rmi nginx
# 컨테이너 실행
docker run nginx
# 백그라운드에서 실행
docker run -d nginx
# 포트 매핑하여 실행
docker run -d -p 8080:80 nginx
# 컨테이너 목록 확인 (실행 중)
docker ps
# 모든 컨테이너 목록 확인
docker ps -a
# 컨테이너 중지
docker stop [컨테이너ID]
# 컨테이너 삭제
docker rm [컨테이너ID]
# 컨테이너 로그 확인
docker logs [컨테이너ID]
# 컨테이너에 접속
docker exec -it [컨테이너ID] /bin/bash
# 이름 지정하여 실행
docker run --name my-nginx -d nginx
# 볼륨 마운트
docker run -v /host/path:/container/path nginx
# 환경변수 설정
docker run -e ENV_VAR=value nginx
# 자동 재시작 설정
docker run --restart=always nginx
# 베이스 이미지 지정
FROM ubuntu:20.04
# 메타데이터 추가
LABEL maintainer="your-email@example.com"
LABEL description="My first Docker image"
# 작업 디렉토리 설정
WORKDIR /app
# 파일 복사
COPY . /app
# 패키지 설치
RUN apt-get update && apt-get install -y \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# 의존성 설치
RUN pip3 install -r requirements.txt
# 포트 노출
EXPOSE 5000
# 환경변수 설정
ENV FLASK_APP=app.py
# 실행 명령어
CMD ["python3", "app.py"]
| 명령어 | 설명 | 예시 |
|---|---|---|
FROM | 베이스 이미지 지정 | FROM python:3.9 |
WORKDIR | 작업 디렉토리 설정 | WORKDIR /app |
COPY | 파일/디렉토리 복사 | COPY . /app |
RUN | 이미지 빌드 시 명령어 실행 | RUN pip install flask |
CMD | 컨테이너 시작 시 실행될 명령어 | CMD ["python", "app.py"] |
EXPOSE | 포트 노출 | EXPOSE 5000 |
ENV | 환경변수 설정 | ENV NODE_ENV=production |
# Dockerfile이 있는 디렉토리에서
docker build -t my-app:1.0 .
# 특정 Dockerfile 지정
docker build -f Dockerfile.dev -t my-app:dev .
app.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '<h1>Hello Docker! 🐳</h1>'
@app.route('/health')
def health():
return {'status': 'healthy'}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
requirements.txt:
Flask==2.3.3
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
# 이미지 빌드
docker build -t flask-app .
# 컨테이너 실행
docker run -d -p 5000:5000 --name my-flask-app flask-app
# 브라우저에서 http://localhost:5000 접속
# 로그 확인
docker logs my-flask-app
# 컨테이너 중지 및 삭제
docker stop my-flask-app
docker rm my-flask-app
# 이미지 삭제
docker rmi flask-app
여러 컨테이너를 한 번에 관리할 때 사용합니다.
docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "5000:5000"
environment:
- FLASK_ENV=development
volumes:
- .:/app
depends_on:
- redis
redis:
image: redis:alpine
ports:
- "6379:6379"
# 서비스 시작
docker-compose up -d
# 서비스 중지
docker-compose down