05. Docker vs Podman
Docker vs Podman — 데몬리스, 루트리스, 호환성 비교
📚 시리즈 네비게이션
| 이전 | 현재 | 다음 |
|---|---|---|
| Docker Compose | Docker vs Podman | - |
→ 시리즈 목차
🎯 개요
| 항목 | Docker | Podman |
|---|---|---|
| 개발 | Docker Inc. | Red Hat |
| 라이선스 | Apache 2.0 | Apache 2.0 |
| 아키텍처 | 클라이언트-서버 (데몬) | 데몬리스 |
| 루트 권한 | 기본 필요 | Rootless 기본 |
| RHEL/CentOS 8+ | 제거됨 | 기본 포함 |
🏗️ 아키텍처 비교
Docker
flowchart TD CLI["Docker CLI"] Daemon["Docker Daemon<br/>(dockerd)<br/>[root 권한]"] Containerd["containerd"] Runc["runc<br/>(컨테이너)"] CLI -->|"REST API"| Daemon Daemon --> Containerd Containerd --> Runc
특징:
- 중앙 데몬 (dockerd)이 모든 컨테이너 관리
- 데몬이 죽으면 모든 컨테이너 영향
- 기본적으로 root 권한 필요
Podman
flowchart TD CLI["Podman CLI"] Conmon["conmon<br/>(컨테이너별 모니터)"] Runc["runc<br/>(컨테이너)"] CLI -->|"직접 호출"| Conmon Conmon --> Runc
특징:
- 데몬 없음 (Daemonless)
- 각 컨테이너가 독립적
- Rootless 기본 지원
🔑 주요 차이점
1. 데몬 유무
| 항목 | Docker | Podman |
|---|---|---|
| 데몬 | dockerd 필요 | 없음 |
| 시작 | systemctl start docker | 바로 사용 |
| 데몬 장애 | 모든 컨테이너 영향 | 해당 컨테이너만 |
| 리소스 | 상시 데몬 실행 | 필요할 때만 |
2. 루트 권한
# Docker (기본)
sudo docker run nginx
# 또는 docker 그룹에 사용자 추가 필요
# Podman (rootless 기본)
podman run nginx
# 일반 사용자로 바로 실행Rootless 장점:
- 보안 강화 (권한 최소화)
- 다중 사용자 환경에 적합
- 컨테이너 탈출 시 피해 최소화
3. 명령어 호환성
대부분의 명령어가 동일함.
# Docker
docker run -d -p 8080:80 nginx
docker ps
docker images
docker build -t myapp .
# Podman (동일!)
podman run -d -p 8080:80 nginx
podman ps
podman images
podman build -t myapp .alias 설정:
alias docker=podman4. Docker Compose 대응
| Docker | Podman |
|---|---|
| docker compose | podman-compose 또는 podman compose |
# podman-compose 설치
pip install podman-compose
# 사용
podman-compose up -d
podman-compose down
# 또는 Podman 4.1+ (내장)
podman compose up -d5. 이미지 호환성
완전 호환. 같은 OCI 표준 사용.
# Docker Hub 이미지 그대로 사용
podman pull docker.io/nginx
podman pull docker.io/mysql:8.0
# 이미지 빌드도 동일
podman build -t myapp .📊 상세 비교
| 항목 | Docker | Podman |
|---|---|---|
| 데몬 | 필요 (dockerd) | 없음 |
| 루트 권한 | 기본 필요 | Rootless 기본 |
| Systemd 통합 | 제한적 | 네이티브 지원 |
| Pod 개념 | 없음 (Swarm/K8s) | 네이티브 지원 |
| Windows/Mac | Docker Desktop | Podman Desktop |
| RHEL/CentOS 8+ | 제거됨 | 기본 포함 |
| Kubernetes YAML | 변환 필요 | 직접 지원 |
| 커뮤니티/생태계 | 매우 큼 | 성장 중 |
| 기업 지원 | Docker Inc. | Red Hat |
🐳 Podman 고유 기능
Pod 지원
Kubernetes의 Pod 개념을 로컬에서 사용.
# Pod 생성
podman pod create --name mypod -p 8080:80
# Pod에 컨테이너 추가
podman run -d --pod mypod nginx
podman run -d --pod mypod redis
# Pod 내 컨테이너는 localhost로 통신
# Pod 상태 확인
podman pod ps
podman pod inspect mypod
# Pod 중지/삭제
podman pod stop mypod
podman pod rm mypodKubernetes YAML 생성
# 컨테이너에서 K8s YAML 생성
podman generate kube mypod > mypod.yaml
# K8s YAML로 실행
podman play kube mypod.yamlSystemd 통합
# 컨테이너를 systemd 서비스로 생성
podman generate systemd --name mycontainer --files --new
# 서비스 파일 생성됨
# container-mycontainer.service
# 사용자 서비스로 등록 (rootless)
mkdir -p ~/.config/systemd/user
mv container-mycontainer.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now container-mycontainer📦 설치
RHEL/CentOS/Fedora
# 기본 포함 또는
sudo dnf install podmanUbuntu/Debian
sudo apt update
sudo apt install podmanmacOS
brew install podman
podman machine init
podman machine startWindows
Podman Desktop 설치.
🔄 Docker에서 Podman 전환
1. alias 설정
# ~/.bashrc 또는 ~/.zshrc
alias docker=podman
alias docker-compose=podman-compose2. 소켓 호환 (Docker API)
Docker API를 사용하는 도구와 호환됨.
# Podman 소켓 활성화
systemctl --user enable --now podman.socket
# Docker 소켓 경로로 심볼릭 링크
export DOCKER_HOST=unix:///run/user/$(id -u)/podman/podman.sock3. 주의사항
| 항목 | Docker | Podman |
|---|---|---|
| 네트워크 기본값 | bridge | slirp4netns (rootless) |
| 볼륨 권한 | root | 사용자 UID |
| 빌드 캐시 | 공유 | 별도 |
🎯 언제 뭘 쓰나
Docker 선택
| 상황 | 이유 |
|---|---|
| 학습/입문 | 자료 많음, 표준 |
| 팀 협업 | 널리 사용됨 |
| Docker Desktop | macOS/Windows 편의성 |
| 기존 CI/CD | Docker 기반 파이프라인 |
Podman 선택
| 상황 | 이유 |
|---|---|
| RHEL/CentOS 8+ | 기본 탑재, Docker 제거됨 |
| 보안 중요 | Rootless 기본 |
| 다중 사용자 | 권한 분리 |
| Kubernetes 연습 | Pod, YAML 지원 |
| 시스템 서비스 | Systemd 통합 |
공존
# 둘 다 설치 가능
# 이미지도 공유 가능 (OCI 표준)
# Docker로 빌드
docker build -t myapp .
# Podman으로 실행
podman run myapp📋 명령어 비교 요약
| 용도 | Docker | Podman |
|---|---|---|
| 실행 | docker run | podman run |
| 목록 | docker ps | podman ps |
| 이미지 | docker images | podman images |
| 빌드 | docker build | podman build |
| Compose | docker compose | podman-compose / podman compose |
| Pod | - | podman pod |
| K8s YAML | - | podman generate kube |
| Systemd | - | podman generate systemd |
💡 정리
| 항목 | Docker | Podman |
|---|---|---|
| 성숙도 | ◎ | ○ |
| 생태계 | ◎ | ○ |
| 보안 | ○ | ◎ |
| RHEL/CentOS | △ | ◎ |
| K8s 친화 | ○ | ◎ |
| 호환성 | - | ◎ (Docker 호환) |
- 입문/학습: Docker
- 보안/RHEL: Podman
- 둘 다 알아두면 좋음 (명령어 거의 동일)
🔗 시리즈 네비게이션
| 이전 | 다음 |
|---|---|
| Docker Compose | - |