podman과 docker는 모두 OCI 표준을 따르는 컨테이너 개발, 관리, 실행을 위한 오픈소스 도구라는 점에서 공통점을 가지고 있다.
하지만 얼마나 더 구조적으로 효율적, 보안적인 차이점을 알아보는 것이 이번 포스팅의 목표이다.
[ Demon의 부재 ]
Podman은 데몬이 없다는 정메서 다른 컨테이너 엔진과 다르다. 도커에서의 데몬은 dockerd라는 프로세스가 존재한다. 이 프로세스는 도커가 시작됨과 동시에 실행되어 사용자 명령어를 서버로 입력받는 역할을 한다.
그렇다면 Podman은 어떻게 사용자의 명령어를 받아서 실행할까? 라는 의문점이 있을 수 있다.
Podman은 사용자가 명령어를 실행하면 Podman 바이너리 파일이 실행되어 명령을 직접 처리한다. 그래서 백그라운드에서 돌아가는 프로세스가 없이 컨테이너를 조작할 수 있다.
예를들어 컨테이너를 실행, 로그, 컨테이너 조작, 컨테이너 종료 등 모든 명령어는 Podman바이너리 파일을 통해서 진행된다.
[ 보안적, 효율적 측면에서 장점 ]
Docker에서는 일반적으로 다수의 컨테이너가 하나의 데몬에서 루트 권한을 통해 컨테이너를 관리한다. 루트권한으로 네임스페이스, cgroupfs, chroot 조작한다. 그래서 데몬은 컨테이너를 장악하고 호스트 시스템에 잠입하려는 해커들에게 좋은 표적이 될 수 있다.
하지만 podman은 데몬이 없으므로 일반 사용자가 루트 권한을 가진 데몬과 상호 작용할 필요 없이 컨테이너를 실행하거나 rootless한 컨테이너를 사용할 수 있다. rootless 컨테이너는 사용자가 프로세스에 관리 권한이 없어도 컨테이너를 생성, 실행, 관리할 ㅜ 있어 더 손쉽게 접근이 가능한 환경을 만드는 동시에 보안 리스크를 줄일 수 있다.
도한 podman은 SELinux 레이블이 있는 각 컨테이너를 실행하여 관리자가 컨테이너 프로세스에 제공되는 리소스와 기능을 제어할 수 있도록 권한을 부여한다.
예를 들어보자면, 해커가 컨테이너 중 하나에 엑세스가 가능하다면 루트권한을 사용할 수 있으므로 비정상적인 명령어 실행으로 서비스에 장애가 생길 수 있지만 podman은 권한을 제한하므로 비정상적인 명령어 수행이 어렵게된다.
# docker도 데몬에 루트리스 모드가 추가되었다.
[ podman은 어떻게 컨테이너를 관리할까? ]
podman은 systemd(시스템 데몬)와의 통합 통하여 컨테이너를 지속적으로 관리할 수 있다. podman은 docker와 명령어가 거의 100% 똑같으며, alias를 지정하여 익숙하지 않은 podman 명령어 대신 docker를 사용하듯 똑같이 사용할 수 있다.
podman은 사용자별 registry를 지정할 수 있으므로, 각각의 사용자가 이미지를 겹치지 않게 빌드하고 배포할 수 있고, 개발을 완료한 이미지를 공통 registry로 push할 수 있으므로 git처럼 컨테이너 레포를 관리할 수 있다.
Rest API를 사용하여 배포할 수 있다. > 웹 서비스와 상호 작용할 수 있도록 podman에서 지원해준다.
https://www.redhat.com/sysadmin/podman-rest-api
[ redhat은 podman을 어떻게 홍보하고 있는가? ]
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Podman은 시장을 선도하는 컨테이너 엔진과 동일한 고성능 기능을 제공함으로써 컨테이너 환경에 변화를 가져왔으며, 많은 개발 팀이 바라는 유연성, 접근성, 강화된 보안까지 갖추고 있습니다. Podman은 다음을 지원합니다.
- 실행, 네트워크 연결, 체크포인트 설정, 삭제를 비롯한 전체 컨테이너 라이프사이클과 컨테이너 이미지를 관리합니다.
- 루트리스 컨테이너와 포드를 위한 리소스를 실행하고 분리합니다.
- OCI, Docker 이미지를 비롯하여 Docker와 호환 가능한 CLI를 지원합니다.
- 데몬이 없는 환경을 조성하여 보안을 강화하고 유휴 리소스 사용을 줄입니다.
- REST API를 배포하여 Podman의 고급 기능을 지원합니다.
- 유저스페이스의 체크포인트/복원(CRIU) 툴로 Linux 컨테이너에 체크포인트/복원 기능을 구현합니다. CRIU는 실행 중인 컨테이너를 중지하고 메모리 콘텐츠 및 상태를 디스크에 저장하여 컨테이너화된 워크로드를 더 빠르게 재시작할 수 있습니다.
- 컨테이너를 자동으로 업데이트합니다. Podman은 업데이트된 컨테이너가 시작되지 않고 최종 작업 버전으로 자동 롤백하는 경우 이를 감지합니다. 따라서 애플리케이션 신뢰성을 한 차원 높은 수준으로 끌어올립니다.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
위 글은 redhat 공식 사이트에서 가져온 podman을 사용해야하는 이유이다.
podman이 나왔을 초창기 시절에는 저게 먹혀들어갔을 수 있지만, 현재는 다른 docker, skopeo와 같은 다른 컨테이너 런타임 역시 마찬가지로 저기 해당하는 기능들을 개발하여 podman만의 장점이라고는 볼 수 없다.
- 데몬이 없는 환경을 조성하여 보안을 강화하고 유휴 리소스 사용을 줄입니다.
위 사항만이 podman이 도커보다 앞서다고 생각한다.
아니면,,, 쿠버네티스에서 사용하는 컨테이너 런타임을 목표로 podman을 출시했다는 것...?
이 부분은 아직 공부해보지 않아서 잘 모르겠다.
[ 그렇다면 무엇을 사용해야하는가? ]
도커가 나온지 한참 지나고 경쟁 도구들이 많아지므로써 서로 다른 오픈소스 도구들 간의 격차가 좁혀졌다고 생각한다.
무엇을 사용하든 왠만한 기능들은 다 들어가 있지만, 나는 프로젝트 배포 환경에 따라 컨테이너 런타임 도구를 고르는 것이 가장 좋다고 생각한다.
Redhat에서 podman을 개발하였으므로 Rocky, RHEL, fedora 계열의 운영체제에서는 podman을 사용하는 것이 더 편리할 수 있고, 데비안 계열에서는 Docker를 사용하는 것이 더 편리할 수 있다. 아직 많은 운영체제는 사용해보지 않았지만,,,,
# podman 명령어