Docker: Difference between revisions
Jump to navigation
Jump to search
(Phase 0.4: Expand Docker) |
({{Status}}/{{TOC}} 템플릿 제거) |
||
| Line 1: | Line 1: | ||
= Docker = | = Docker = | ||
== Overview == | == Overview == | ||
| Line 19: | Line 10: | ||
* 왜 필요한가? — 환경 일관성, 빠른 배포, 리소스 효율성 | * 왜 필요한가? — 환경 일관성, 빠른 배포, 리소스 효율성 | ||
* 언제 사용하는가? — 개발/테스트/운영 환경, 마이크로서비스, CI/CD | * 언제 사용하는가? — 개발/테스트/운영 환경, 마이크로서비스, CI/CD | ||
== Purpose == | == Purpose == | ||
| Line 28: | Line 18: | ||
* Scope: Docker 기본 명령어, 컨테이너 리소스 제한, Dockerfile, 이미지 관리 | * Scope: Docker 기본 명령어, 컨테이너 리소스 제한, Dockerfile, 이미지 관리 | ||
* Non-goals: Kubernetes 오케스트레이션, Docker Compose 고급 설정은 별도 문서 | * Non-goals: Kubernetes 오케스트레이션, Docker Compose 고급 설정은 별도 문서 | ||
== Key Concepts == | == Key Concepts == | ||
| Line 57: | Line 46: | ||
| [[Docker container resource]] | | [[Docker container resource]] | ||
|} | |} | ||
== Architecture == | == Architecture == | ||
| Line 74: | Line 62: | ||
C --> I[Container N] | C --> I[Container N] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Workflow == | == Workflow == | ||
| Line 99: | Line 86: | ||
| Docker Image Download | | Docker Image Download | ||
|} | |} | ||
== Detailed Explanation == | == Detailed Explanation == | ||
| Line 118: | Line 104: | ||
볼륨(Volume)과 바인드 마운트를 통해 호스트와 컨테이너 간 파일을 공유합니다. | 볼륨(Volume)과 바인드 마운트를 통해 호스트와 컨테이너 간 파일을 공유합니다. | ||
== Configuration == | == Configuration == | ||
| Line 142: | Line 127: | ||
docker stats | docker stats | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Examples == | == Examples == | ||
| Line 162: | Line 146: | ||
docker run -d --name gpu-container --gpus all --memory=8g --cpus=4 --restart=unless-stopped myapp:latest | docker run -d --name gpu-container --gpus all --memory=8g --cpus=4 --restart=unless-stopped myapp:latest | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== Best Practices == | == Best Practices == | ||
| Line 172: | Line 155: | ||
* 컨테이너 로그 관리 설정 | * 컨테이너 로그 관리 설정 | ||
* 리소스 제한 필수 적용 | * 리소스 제한 필수 적용 | ||
== Limitations == | == Limitations == | ||
* Linux 호스트 필요 (Windows/macOS는 VM 오버헤드) | * Linux 호스트 필요 (Windows/macOS는 VM 오버헤드) | ||
* 커널 기능 의존 (cgroups, namespaces) | * 커널 기능 의존 ([[cgroups]], namespaces) | ||
* 보안 격리는 호스트 커널 공유로 제한적 | * 보안 격리는 호스트 커널 공유로 제한적 | ||
== References == | == References == | ||
| Line 186: | Line 167: | ||
* https://hub.docker.com/ | * https://hub.docker.com/ | ||
* https://github.com/docker | * https://github.com/docker | ||
== Related Pages == | == Related Pages == | ||
| Line 195: | Line 175: | ||
* [[Dockerfile tips and tricks]] | * [[Dockerfile tips and tricks]] | ||
* [[Kubernetes]] | * [[Kubernetes]] | ||
[[Category:Network]] | [[Category:Network]] | ||
Latest revision as of 13:23, 2 October 2026
Docker
Overview
Docker는 컨테이너 기반의 가상화 플랫폼으로, 애플리케이션을 독립된 환경에 패키징하여 어디서든 일관되게 실행할 수 있게 합니다.
Summary
- 무엇인가? — 컨테이너 기반 애플리케이션 가상화 플랫폼
- 왜 필요한가? — 환경 일관성, 빠른 배포, 리소스 효율성
- 언제 사용하는가? — 개발/테스트/운영 환경, 마이크로서비스, CI/CD
Purpose
이 문서가 존재하는 이유
- Goal: Docker 기본 개념부터 실전 명령어, 리소스 관리까지 한 곳에서 제공
- Scope: Docker 기본 명령어, 컨테이너 리소스 제한, Dockerfile, 이미지 관리
- Non-goals: Kubernetes 오케스트레이션, Docker Compose 고급 설정은 별도 문서
Key Concepts
| Concept | Description | Related |
|---|---|---|
| Container | 독립된 실행 환경 (OS 레벨 가상화) | Docker |
| Image | 컨테이너 생성을 위한 템플릿 | Docker command workflow |
| Dockerfile | 이미지 빌드 설정 파일 | Docker command workflow |
| Volume | 컨테이너 외부 저장소 마운트 | Docker library sharing |
| Resource Limit | CPU/메모리/디스크 사용량 제한 | Docker container resource |
Architecture
Docker는 클라이언트-서버 아키텍처로 구성됩니다:
graph TD
A[Docker Client] --> B[Docker Daemon]
B --> C[Container Runtime]
B --> D[Image Store]
B --> E[Network Manager]
B --> F[Volume Manager]
C --> G[Container 1]
C --> H[Container 2]
C --> I[Container N]Workflow
| Stage | Input | Output |
|---|---|---|
| Build | Dockerfile | Docker Image |
| Run | Docker Image | Running Container |
| Push | Docker Image | Registry Upload |
| Pull | Registry | Docker Image Download |
Detailed Explanation
Docker 기본
Docker는 Linux 컨테이너(LXC)를 기반으로 합니다. 호스트 커널을 공유하면서 격리된 환경을 제공합니다.
Docker 명령어 워크플로우
Dockerfile 작성 → 이미지 빌드 → 컨테이너 실행 → 레지스트리 푸시 → 다른 시스템에서 풀/실행
Docker 컨테이너 리소스
컨테이너는 기본적으로 CPU, 메모리, 디스크 사용량이 제한됩니다. --memory, --cpus 옵션으로 제한을 설정할 수 있습니다.
Docker 라이브러리 공유
볼륨(Volume)과 바인드 마운트를 통해 호스트와 컨테이너 간 파일을 공유합니다.
Configuration
# Docker 버전 확인
docker --version
# 이미지 빌드
docker build -t myapp:latest .
# 컨테이너 실행
docker run -d --name myapp --memory=2g --cpus=2 myapp:latest
# 컨테이너 리소스 제한
docker run -d --memory=4g --memory-swap=4g --cpus=4 myapp:latest
# 로그 확인
docker logs -f myapp
# 컨테이너 상태 확인
docker ps -a
docker stats
Examples
Example 1: Dockerfile 작성
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Example 2: 리소스 제한 컨테이너 실행
docker run -d --name gpu-container --gpus all --memory=8g --cpus=4 --restart=unless-stopped myapp:latest
Best Practices
- 다단계 빌드(Docker multi-stage build) 활용
- .dockerignore 파일 작성
- 공식 이미지 기반 시작
- 불변 태그(immutable tag) 사용
- 컨테이너 로그 관리 설정
- 리소스 제한 필수 적용
Limitations
- Linux 호스트 필요 (Windows/macOS는 VM 오버헤드)
- 커널 기능 의존 (cgroups, namespaces)
- 보안 격리는 호스트 커널 공유로 제한적
References
Related Pages
- Docker command workflow
- Docker container resource
- Container tips and tricks
- Dockerfile tips and tricks
- Kubernetes
Knowledge Graph
Related
→ Kubernetes → Container → Dockerfile → Docker Compose
GPU Docker
Docker에서 GPU 사용하려면 NVIDIA Container Toolkit 필요.
# NVIDIA Container Toolkit 설치
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
sudo yum install -y nvidia-container-toolkit
sudo systemctl restart docker
# GPU 컨테이너 실행
docker run --gpus all nvidia/cuda:12.2-base nvidia-smi
# 특정 GPU만 사용
docker run --gpus 'device=0,1' nvidia/cuda:12.2-base nvidia-smi
# GPU 메모리 제한
docker run --gpus 'device=0,reserved-memory=4096' nvidia/cuda:12.2-base
Docker Compose
Docker Compose는 멀티 컨테이너 애플리케이션 관리.
version: '3.8'
services:
app:
image: myapp:latest
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
ports:
- "8080:8080"
volumes:
- ./data:/app/data
restart: unless-stopped
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
volumes:
redis-data:
# Compose 실행
docker compose up -d
# 로그 확인
docker compose logs -f app
# 서비스 재시작
docker compose restart app
Docker Swarm
Docker Swarm은 Docker 네이티브 오케스트레이션.
# Swarm 초기화
docker swarm init --advertise-addr eth0
# 서비스 배포
docker service create --name myapp --replicas 3 -p 8080:80 myapp:latest
# 서비스 상태 확인
docker service ls
docker service ps myapp
# 스케일링
docker service scale myapp=5