Podman의 개념과 설치방법

Podman 이란?

Podman(Pod manager tool)은 리눅스 시스템에서 컨테이너를 개발, 관리, 실행하기 위한 오픈소스 툴이다. 기존의 Docker와 같은 컨테이너 엔진이지만, Docker와는 몇가지 다른 점이 존재한다. 대표적으로는 아래와 같이 2가지 차이점을 들 수 있다.

daemonless

Docker는 Docker daemon을 통해 Docker client의 모든 명령어를 처리하게 된다. 이러한 방식은 작업을 처리할 때 매우 효율적이다. 하지만 daemon에 의존적인 방식은 몇가지 문제가 있는데, 가장 큰 문제는 부정적인 Side effects(의도하지 않은 결과)를 유발할 수 있다는 점이다.

Docker의 구성도

이렇게 Docker의 모든 작업이 Docker daemon에 의존하다보니, Docker daemon이 멈추기라도 하면 Containers까지 모조리 멈추어버리는 불상사가 발생할 수 있다. Podman에서는 각 컨테이너를 fork/exec 방식으로 실행하기 때문에 별도의 데몬이 필요 없으므로 이러한 문제가 생기지 않는다. 이런 특징 때문에 Podman은 Docker 보다 더 많은 수의 컨테이너를 안정적으로 실행할 수 있다.

Podman의 구성도

root 권한 필요없음

위와 같이 Docker daemon이 관장하는 기능이 많다 보니, Docker에서는 이런 기능들을 아무나 접근할 수 없도록 하기 위해 root 사용자만 Docker client를 통해 명령어를 쓸 수 있도록 제한해 뒀다. 하지만 이런 제한은 시스템 운영자가 곧 컨테이너 운영자가 되어야 하므로, 컨테이너 별로 권한 분리를 힘들게 만들고 root 권한을 사용하도록 강제하기 때문에 보안이 취약해진다는 문제가 있다.

하지만 Podman은 각 계정별로 자유롭게 컨테이너를 생성하고 실행할 수 있기 때문에, 1024 이하의 포트를 사용해야 하는 등의 root 권한이 필수적으로 필요한 작업이 아닌 이상 위의 문제로부터 훨씬 자유롭다.


Podman 설치하기

여기서는 Ubuntu 계열 혹은 RHEL 계열 리눅스에서 설치하는 방법에 대해서만 다루겠다. 별다른 저장소 리포지토리 추가 없이 Podman을 설치하려면 Ubuntu 리눅스는 22.04 LTS, RHEL 계열 리눅스는 8 버전 이상이 필요하다.

Ubuntu 계열

$ sudo apt install podman

RHEL 계열

$ sudo yum install podman

Container registry 등록

Podman은 기본적으로 등록된 Container registry가 없기 때문에, 직접 등록해줘야 이미지를 내려받을 수 있다. 필자같은 경우에는 Docker가 기본으로 제공하는 "docker.io"를 registry로 등록할 것이다. registry를 등록하려면 아래와 같이 registries.conf 파일을 열어 수정해야 한다.

$ sudo nano /etc/containers/registries.conf

그 다음, 맨 아래에 다음 내용을 추가하자.

unqualified-search-registries = ["docker.io"]

Podman 설치 확인

Podman이 정상적으로 설치되었는지 확인하기 위해, hello-world image를 내려받고 컨테이너로 올려보자.

$ podman pull hello-world
$ podman run hello-world

위의 명령어를 순차적으로 입력하고 난 뒤, 터미널에 다음과 같은 내용이 뜨면 정상적으로 설치가 완료된 것이다.

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started

podman 명령어 바꾸기

podman 명령어는 docker 명령어와 호환된다. 그래서 docker를 써본적이 있는 사람이라면 podman 명령어 사용에 별 거부감 없이 적응할 수 있다. 하지만 기왕 이렇게 된 김에 podman 명령어를 docker로 치환해 보자.

$ alias docker='podman'

이렇게 별칭을 지정해주면, docker를 쓰더라도 시스템이 알아서 podman으로 치환해준다. 하지만 이렇게 임시로 등록한 별칭은 해당 터미널의 프로세스가 종료되는 즉시 설정했던 값들이 초기화 되버린다. 따라서 별칭을 영구히 등록해야만 별칭 등록 작업을 생략할 수 있다.

$ cd ~
$ nano .bashrc

.bashrc 파일이 열리면 최하단에 다음 내용을 추가한다.

alias docker='podman'

.bashrc 파일의 수정사항을 저장하고 난 뒤, 터미널을 재시작 하면 정상적으로 docker가 podman으로 치환되는 것을 볼 수 있다.


정리하며

기존의 리눅스 컨테이너 관리 시스템인 Docker가 나온게 9년 전(2013년)인데 벌써부터 Docker를 대체할 컨테이너 관리 시스템이 몇개나 쏟아지고 있다. 그 중에서 가장 핫한 Podman에 대해 다루어 보았는데, 솔직히 말하자면 꽤 놀랐다. 가장 흥미로웠던 점은 Podman을 사용할 때, root 권한을 필요로 하지 않는다는 점이었다. 기존에 Docker를 사용할 때, Docker 관리자용 계정 하나를 만들어서 docker 그룹에 넣고 쓰는 등의 몇가지 번거로운 작업이나 보안 등의 문제를 생각해보면 docker 명령어를 그대로 쓸 수 있는 Podman은 빠르게 Docker 시장에 잠식할 수 있지 않을까 싶다.


참고한 문헌 및 블로그 글

  1. 컨테이너 기술
  2. podman 소개 및 설치
  3. How To Run PostgreSQL 14|13 in Podman Container
  4. Linux alias(별칭 지정) 명령어 영구 등록