Podman 대 Docker: 어느 것을 선택해야 할까요?
가상화 및 컨테이너 기술에 관심을 갖고 있다면, Podman과 Docker를 자주 접하게 될 것이고, 이 둘의 차이점에 대한 궁금증이 생길 수 있습니다.
이 글에서는 Docker와 Podman의 차이점을 자세히 알아보고, 여러분에게 더 적합한 도구가 무엇인지 파악해 보겠습니다!
도커
Docker는 개발 및 배포 단계에서 프로젝트 내 의존성 관리를 용이하게 하는 컨테이너화 기술입니다.
Linux, Windows, macOS에서 사용 가능한 Docker는 컨테이너 및 해당 오케스트레이션을 중심으로 작동하며, 이는 가상화와 컨테이너화의 중요한 차이점입니다.
Docker는 Docker CLI와 Docker Daemon이라는 두 가지 핵심 구성 요소로 이루어져 있습니다.
도커 데몬:
Docker 이미지, 컨테이너, 네트워크 및 스토리지 볼륨을 관리하는 지속적인 백그라운드 프로세스입니다. Docker는 Docker 엔진 REST API를 통해 HTTP 프로토콜을 사용하여 Docker 데몬과 통신합니다.
도커 CLI:

Docker 데몬과 상호 작용하기 위한 명령줄 인터페이스입니다. Docker 명령을 실행할 때 사용됩니다.
Docker의 작동 방식은 Linux 커널과 cgroup 및 네임스페이스와 같은 커널 기능을 기반으로 합니다. 컨테이너의 주요 목적은 여러 프로세스와 응용 프로그램을 격리된 환경에서 실행하는 것이므로, 이러한 기능들은 프로세스가 독립적으로 실행되도록 분리합니다.
이는 별도의 시스템을 사용하는 것과 비교하여 보안 수준을 낮추지 않고도 인프라 사용을 최적화할 수 있게 해줍니다.
Docker와 같은 컨테이너 도구는 이미지 기반 배포 모델을 제공하여, 다양한 환경에서 애플리케이션 또는 서비스 세트를 쉽게 공유할 수 있도록 합니다.
또한 Docker는 컨테이너 환경 내에서 애플리케이션 배포를 자동화하는 데 도움을 줍니다. 다양한 도구를 통해 사용자는 애플리케이션에 대한 전체 제어 권한을 갖고 배포를 가속화하고, 버전을 관리하며, 필요한 리소스를 할당할 수 있습니다.
포드맨
Podman(POD MANager)은 OCI 컨테이너와 컨테이너 이미지를 구축, 실행, 관리하는 도구입니다. Red Hat에서 개발되었으며, 원래 Enterprise Linux 8용으로 설계되었습니다. 컨테이너 관리에 사용되며, Docker의 공식적인 후속 제품으로 자리매김하고 있습니다.

Red Hat은 Docker 지원을 중단했지만, Podman이 원래 디버깅 도구로 개발되었음에도 불구하고 Docker를 기반으로 하기 때문에 사용자들의 전환이 쉬울 것이라고 판단했습니다.
Podman은 libpod 라이브러리를 사용하여 전체 컨테이너 생태계를 관리합니다. 현재는 Linux 플랫폼에서만 작동하며, REST API 및 클라이언트는 macOS 및 Windows 시스템에서 서비스를 호출할 수 있도록 개발 중입니다.
하지만 현재 Mac 또는 Windows 플랫폼에서 작동하는 Varlink 기반 원격 클라이언트를 통해 Linux 기반 Podman 서버와의 원격 통신이 가능합니다. libpod 라이브러리는 신뢰 및 이미지 검증을 포함하여 이미지를 안전하게 업로드하는 다양한 방법을 지원합니다.
또한 OCI 및 Docker 이미지 형식을 포함한 여러 이미지 형식을 지원하며, 컨테이너 그룹을 함께 관리하는 '포드'라는 개념을 지원합니다.
작고 관리하기 쉬운 환경에서 Podman은 Kubernetes의 초기 모델 역할을 할 수 있습니다. 이는 컨테이너 기술 도입 초기의 개별 인스턴스 관리와 Kubernetes를 사용한 현대적인 오케스트레이션 사이의 간극을 메웁니다.
컨테이너 기술을 적극적으로 사용하는 사용자는 '포드'를 통해 다음 단계로 나아갈 수 있습니다. Kubernetes 클러스터 구축 및 운영이 더 이상 필수 사항이 아닙니다. 간단한 경우에는 새로 설계된 '포드'를 개별 작업에서 테스트하고 개선할 수 있으며, 나중에 Kubernetes로 쉽게 마이그레이션할 수 있습니다.
'podman generate kube' 명령을 통해 해당 구성 파일을 얻을 수 있으며, 이는 Kubernetes 도구 'kubectl'에 직접 입력으로 사용될 수 있습니다.
최신 버전의 Podman은 systemd용 구성 파일도 생성할 수 있습니다. 이는 컨테이너 오케스트레이션을 위해 널리 사용되는 init 시스템을 사용하는 사용자에게 유용한 기능입니다.
Podman과 Docker: 주요 차이점
Docker는 컨테이너 관리 도구로서 빠르게 자리 잡았습니다. 그러나 Docker는 많은 장점과 함께 빠르게 증가하는 이미지 저장소와 단점 및 잠재적인 보안 위험도 가지고 있습니다. 또한 Docker는 더 이상 Kubernetes에서 공식적으로 지원하는 컨테이너 런타임이 아닙니다.
컨테이너는 가상 시스템과 달리 커널이 필요하지 않다는 점이 일반적으로 큰 장점 중 하나로 여겨지지만, Docker 컨테이너는 루트 권한으로만 실행될 수 있어 보안상 취약점이 있습니다.
컨테이너 내에서 실행되는 프로세스가 루트 권한으로 커널에 접근하여 호스트 시스템을 공격할 수 있는 가능성이 있습니다.
가장 큰 차이점은 사용 방식에서 나타납니다. Docker는 Docker 데몬을 먼저 실행해야 하지만, Podman 컨테이너는 명령줄에서 직접 시작할 수 있습니다. 따라서 백그라운드 프로세스가 필요하지 않으며, 애플리케이션은 필요할 때만 실행됩니다.
보안 관점에서 볼 때, 데몬이 항상 슈퍼유저 권한으로 실행될 필요가 없으므로, Podman이 공격에 더 안전하다고 볼 수 있습니다. Podman은 Docker와 근본적으로 다른 아키텍처를 가지고 있어 백그라운드 프로세스가 필요하지 않습니다.
Docker는 클라이언트가 API를 통해 Docker 데몬과 통신하는 클라이언트-서버 모델을 따르는 반면, Podman은 fork-exec 모델을 따릅니다. 각 컨테이너는 Podman의 하위 프로세스로 실행됩니다.
Podman이 일반 사용자 권한으로 실행될 때, 처음 사용 시 사용자 네임스페이스가 생성됩니다. 사용자 네임스페이스 내에서 Podman은 루트 권한으로 실행되며, 파일 시스템을 마운트하고 컨테이너를 생성할 수 있는 권한을 갖습니다.
따라서 Podman 컨테이너는 실행 사용자가 가진 권한만 갖게 됩니다. 사용자 네임스페이스를 사용한다는 것은 각 사용자가 자신의 컨테이너를 만들고 관리할 수 있지만, 다른 사용자나 수퍼유저에게는 보이지 않는다는 것을 의미합니다.
Podman은 Docker와 독립적으로 운영되므로 개발자들은 더 많은 자유를 누릴 수 있으며 커뮤니티 요구에 빠르게 대응할 수 있습니다. Podman의 흥미로운 추가 기능으로는 마운트/마운트 해제 명령과 시스템 통합이 있습니다.
호스트는 'mount/unmount' 명령을 사용하여 컨테이너의 파일 시스템을 마운트할 수 있습니다. 예를 들어, 파일에 접근하거나 변경한 다음 다시 마운트 해제할 수 있습니다.
Docker의 데몬 때문에 systemd를 사용하여 컨테이너를 모니터링하는 것이 불가능했지만, Podman은 컨테이너를 systemd를 통해 시작, 모니터링 및 다시 시작할 수 있습니다.
또한 Podman은 각 컨테이너에 해당하는 systemd 서비스를 생성하는 'podman generate systemd' 명령을 제공하여, 사용자가 직접 systemd 서비스를 생성할 필요가 없도록 하여 호스트 시스템과의 통합을 용이하게 합니다.
Podman과 Docker의 또 다른 중요한 차이점은 Docker는 자체 내부 네트워크를 생성하므로 방화벽 규칙이나 기존 dnsmasq 설정을 변경하지 않는다는 것입니다. 반대로 Docker는 컨테이너 간 통신을 활성화하기 위해 방화벽 규칙을 덮어쓸 필요가 있습니다.
| 특징 | Podman | Docker |
| 아키텍처 | 데몬리스 | 데몬 |
| 서비스 관리 | systemd | Docker 엔진 |
| 방화벽 호환성 | 방화벽 규칙 준수 | 방화벽 규칙 덮어쓰기 |
| 플랫폼 | Linux, Windows 및 Mac에 대한 기본 지원 |
Docker에서 Podman으로 전환해야 하는 경우
RHEL 기반 환경에서 컨테이너를 배포하는 경우, RHEL의 기본 컨테이너 도구인 Podman을 사용하는 것 외에 다른 선택지가 없을 수 있습니다. 컨테이너 수가 적은 소규모 배포 환경에서는 Docker 또는 Podman 중 원하는 도구를 선택할 수 있습니다.
하지만 네트워크를 통해 여러 컨테이너를 연결하고 복잡한 컨테이너 스택을 관리해야 하는 경우에는 docker-compose 또는 podman-compose를 사용하는 것이 좋습니다. 네트워크 관리에 있어서는 Docker가 더 나은 성능을 제공합니다.
컨테이너 기술을 처음 접하는 사용자라면 Docker를 사용하는 것이 더 좋습니다. Docker는 안정적이고 상세한 문서가 잘 갖춰져 있으며, Podman에 비해 학습 곡선이 완만하고 문서화도 더 잘 되어 있습니다.
Podman에서 Docker로 전환
명령줄 환경에서 Docker 엔진에서 Podman으로 전환하는 것은 매우 쉽습니다. 가장 간단한 방법은 '$ alias docker=podman' 명령어를 사용하는 것입니다.
물론 이는 시스템에 필요한 소프트웨어가 설치되어 있다는 전제 하에 가능합니다. Linux 환경에서는 대부분 문제가 되지 않습니다. 시판되는 배포판에서 미리 준비된 소프트웨어 패키지를 사용할 수 있습니다.
Windows 또는 macOS는 지원되는 운영 체제에 포함되지 않습니다. 이 별칭 방법은 많은 Docker 명령에 해당하는 Podman 명령이 있기 때문에 작동합니다.
하지만 일부 Docker 명령은 Podman에 해당하는 명령이 없거나, 일부 명령은 Docker와 Podman에서 다르게 작동합니다. 현재로서는 이러한 차이점이 이미 설정된 볼륨 관리에만 영향을 미칩니다.
Docker Desktop과 같은 GUI 도구를 사용하고 있다면 전환이 조금 더 어려울 수 있습니다. 특히 Windows 또는 macOS 환경에서 작업하는 개발자에게 영향을 줍니다.
Docker Desktop 사용자는 명령줄 사용에 익숙해져야 하며, Docker Compose의 경우에도 마찬가지입니다. 하지만 Docker Compose를 대체할 수 있는 Python으로 작성된 podman-compose 프로젝트가 있습니다.
결론
Docker를 Podman으로 교체하는 작업은 거의 완료 단계에 있다고 볼 수 있습니다. 사용자 및 관리자 입장에서는 이러한 변화가 대부분 쉽게 느껴질 것입니다. 많은 Docker 기능이 Podman에서 동일하게 제공됩니다.
가장 큰 실질적인 장점은 단일 데몬 프로세스와 루트 권한이 필요 없다는 점과 컨테이너 그룹을 더욱 자연스럽게 사용할 수 있다는 점입니다. 그러나 Docker는 여전히 컨테이너 관련 주요 기술로 남아 있지만, 장기적으로는 변화될 가능성이 높습니다.
컨테이너 관리를 위한 다양한 Docker 명령어를 살펴보는 것도 좋습니다.