Podman이란? (feat. Docker)
What is Podman? and brief comparison with Docker.
현재 진행중인 Nomakase프로젝트에서 우리는 CentOS 8에서 Server, MySQL, Redis를 각각 컨테이너화시켜 운영하기로 하였다. 컨테이너라는 개념에 대해서는 Docker라는 프로그램과 함께 들어본 적이 있다. 하지만 이번 프로젝트에서는 컨테이너의 포맷과 런타임의 표준화인 OCI와 CRI가 정립됨과 함께 새로이 주목받고 있는 Podman을 사용하기로 하였고, 이에 관해 새로 배우게 된 내용을 적고자 한다.
Before we start,
What is Container?
컨테이너란 가상화의 한 종류로 아주 작은 마이크로 서비스부터 서버 애플리케이션까지 가상화하여 실행시킬 수 있도록 코드, 바이너리, 라이브러리 그리고 설정들까지 모두 패키징하여 포함하고 있는 것을 말한다. 이것을 정확히는 컨테이너 이미지라고 하며 컨테이너 이미지는 Docker나 Podman에 의해 실행되면 컨테이너가 된다.
A container is a standard unit of software that packages up code and all its dependencies. Container images become containers at runtime. Containerized software will always run the same, regardless of the infrastructure. (Source: Docker)
컨테이너화(containerization) 시키는 가장 큰 이유는 시스템의 인프라가 어떻든 가상화 환경에서 실행되기 때문에 동일한 소프트웨어 실행(환경 및 설정)을 보장해준다는 것이다. 이것은 개발팀이 애플리케이션 로직에만 더 집중할 수 있도록 해주고, 운영팀이 더 이상 애플리케이션의 버전과 설정(config)으로 고통받지 않게 해준다. 또한 컨테이너를 통한 가상화는 hardware-level의 가상화를 사용하는 VM(Virtual Machine)과 달리 OS-level의 가상화를 사용하기 때문에 시스템 오버헤드가 적다(lightweight)는 장점이 있다.
Red Hat에 따르면 컨테이너의 장점들을 아래와 같이 정리할 수 있다.(Source: Red Hat)
- Low hardware footprint
- Environment isolation
- Quick deployment
- Multiple environment deployments
- Reusability
이처럼 위와 같은 요소들로 인해 컨테이너는 어느새 devops의 필수 요소로 자리 잡게 되었는데, 실제로 Google은 Youtube, Gmail 등등 자사 서비스들을 컨테이너화시켜 운영중이라고 한다.(Source: Samsung SDS)
What is Podman?
Podman은 리눅스 시스템에서 OCI(Open Container Initiative)컨테이너 및 이미지를 실행, 관리, 배포를 위한 deamon-less한 컨테이너 엔진이다.
Podmand은 OCI를 준수하며 OCI이전에 사실상의 표준 역할을 한 Docker와의 호환성을 목표로 하기 때문에 사실상(거의 100%) CLI command가 동일하다. 때문에 아래와 같이 docker
명령어를 podman
으로 별칭을 지정해버려 사용하는 것이 가능하다.
$ alias docker=podman
뿐만 아니라, 표준화된 컨테이너 덕분에 Podman을 사용하여 Docker Hub와 Quay.io로 부터 컨테이너 이미지를 pull 또는 push하는 것이 가능하다. 즉, Docker Hub에 있는 컨테이너를 실행시키는 것이 가능하다는 말이다.
# Podman으로 Docker Hub로부터 Maria DB 컨테이너 이미지를 pull
$ podman pull docker.io/library/mariadb
그렇다면 왜 굳이 Docker를 놔두고 Podman을 사용하는 것일까?
Why Podman?
Podman이 주목 받게 된 이유를 알아보자면 먼저 기존의 Docker가 어떤 방식으로 컨테이너를 생성(실행)하고 관리하는 지, 비교하며 이해할 필요가 있다.
- Deamonless Architecture
Docker는 server-client architecture로 Docker deamon이 server역할을 수행하게 된다. 따라서 Docker에서는 컨테이너를 생성 및 관리하는 작업을 모두 Docker deamon이 수행한다. 이러한 방식이라면 deamon 프로세스에 문제가 생길 경우, 컨테이너들이 deamon의 자식 프로세스 형태로 존재하기 때문에 모든 컨테이너에 영향을 미칠 수 밖에 없는 구조이다.
반면, Podman은 exec/fork model을 사용한다. model이라고 표현해서 특별한 것은 없고, 각각의 컨테이너가 독립된 프로세스로 실행된다고 이해하면 된다. 이는 기존 Docker의 아키텍처에서 server에 집중되었던 역할을 분산시키는 효과 뿐만 아니라 어떤 하나의 컨테이너에서 문제가 발생하더라도 이들을 개별적으로 관리하기 쉽다는 장점을 가진다. 또한 컨테이너들이 백그라운드에서 실행되기 위해 Podman은systemd
(리눅스 시스템에서 모든 프로세스를 관리하는 데몬)와의 통합을 지원하는데 이것은 컨테이너들이systemd
의 unit으로서 관리될 수 있도록 한다.
- Rootless Container
위에서 언급한 것처럼, Docker는 container를 실행시키기 위해 Docker deamon을 통한다. 이 때, Docker deamon은 root권한 함께 실행되기 때문에 컨테이너를 실행하기 위해서는 root 권한이 필요하다. 이러한 방식은 컨테이너에서 보안상의 문제가 발생했을 때, root권한이 탈취될 위험성이 있다.
그러나 Podman은 Docker와 달리 컨테이너의 관리를 총괄하는 deamon을 따로 두고 있지 않다.(엄밀히 말하면 systemd가 하고 있긴 하지만..) 따라서 각각의 컨테이너는 현재 접속 중인 user 또는 group의 권한만으로도 생성, 실행 및 관리가 가능하며 이러한 컨테이너를Rootless Container
라고 한다.Rootless Container
는 말 그대로 root권한 아래에서 실행되는 것이 아니다. 따라서 컨테이너에서 보안 상의 문제가 발생하더라도 컨테이너를 실행한 user의 권한만을 가질 수 있을 뿐, root권한을 보호할 수 있다. 이러한 점을 이용하여 컨테이너를 실행하는 user에게 최소한의 권한만을 부여함으로써 보안성을 향상시킬 수 있다.
조사한 바에 따르면 Docker 또한 현재는Rootless Container
를 지원한다고 한다. ( → Run the Docker daemon as a non-root user (Rootless mode) )
Podman Installation(CentOS)
# 또는 yum -y install podman
$ dnf -y install podman
Conclusion
프로젝트를 컨테이너화시켜 운영하기로 결정했을 때, 나는 Podman의 존재조차 몰랐고 당연히 Docker를 사용하게 될 줄 알았다. 그러나 이 쪽 분야가 전반적으로 그렇듯, 생태계는 빠르게 변하고 더 나아지고 있었다. 컨테이너 기술의 표준화와 함께 보안성이 중시되며 Podman과 같은 얼터너티브가 나오게 되었다.
그러나 OCI수립이전 사실상의 기술 표준이었던 Docker 또한 과거에 머무르지 않고 꾸준히 개발되고 있으며 OCI를 준수하고 rootless mode도 지원한다. 또한 미래는 어떻게 될 지 모르지만, 여전히 Docker는 컨테이너 기술에서 가장 독점적인 지위를 지닌다고 해도 과언이 아니다.
따라서 이 글은 Podman과 Docker, 둘 중에 무엇이 더 나은 가에 대한 결론을 내리기 위한 글이 아니다. 컨테이너 기술이라는 것에 대해 다양한 방식 및 아키텍처로 구현된 소프트웨어 중 내가 프로젝트에 사용하게 된 Podman이라는 컨테이너 엔진에 대해 공부한 것을 적은 것이다.
이번 프로젝트에서 우리는 Podman을 사용하여 서버 App뿐만 아니라, MySQL과 Redis를 컨테이너화시켰다. 다음 포스팅에서는 우선 Redis가 무엇인지 공부한 내용과 왜 사용하게 되었는 지에 대해 적을 것이며 이후, Redis를 Podman을 사용하여 컨테이너화 시키는 과정 및 config에 대해서도 적을 것이다. 궁극적으로는 내가 설계한 token-based 로그인 시스템에 대해 설명하기 위한 것이므로 하나 하나 씩 포스팅해 나가도록 하겠다.
References
- What is Podman? - Podman documentation
- What is a Container? - Docker
- Intro to Podman - Red Hat Developer
- Rootless containers with Podman - Red Hat Developer
- Transitioning from Docker to Podman - Red Hat Developer
- 흔들리는 도커(Docker)의 위상: OCI와 CRI 중심으로 재편되는 컨테이너 생태계 - Samsung SDS
- Why Podman is worth a look - ti&m
- Docker Vs Podman - Medium
- CentOS8 & CentOS7 컨테이너 비교 - Naver Blog