
기술의 미래를 이야기할 때, 경험 많은 개발자들은 가상화와 컨테이너화가 그 중심이라는 점을 잘 알고 있습니다. 이 기술들은 애플리케이션과 서비스의 보안을 크게 향상시키며, 스냅샷, 템플릿, 세밀한 커스터마이징 등 하나의 서버에 하나의 애플리케이션만 올리는 전통적인 방식보다 훨씬 유연한 관리 환경을 제공합니다. 하지만 정작 가상화와 컨테이너화를 어디서부터 시작해야 할지 막막하게 느껴질 때가 많습니다. 지금까지 리눅스, Windows, macOS에서의 가상화를 여러 차례 다뤘지만, 컨테이너화는 조금 다른 영역입니다. 이번 글에서는 리눅스에서 컨테이너를 손쉽게 다룰 수 있는 훌륭한 도구, Podman의 초보자 가이드를 소개합니다.
컨테이너란 무엇인가?
컨테이너는 본질적으로 '애플리케이션 전용 소형 가상 머신'이라고 할 수 있습니다. 가상 머신과 유사한 개념과 보안성, 사용 편의성을 공유하지만 훨씬 가볍고, 애플리케이션을 손쉽게 이미지화해서 배포할 수 있다는 강력한 장점이 있습니다. 사실 Flatpak과 Snap도 바로 이러한 컨테이너 개념을 기반으로 만들어졌습니다. 하나의 프로그램으로 여러 애플리케이션을 격리된 환경에서 실행하는 구조에서 그 유사점을 확인할 수 있습니다.
Podman이란?
컨테이너 엔진계의 원조격인 Docker를 들어본 분들이 많을 것입니다. Podman은 Docker와 매우 유사한 구조를 사용하는 컨테이너 엔진으로, 몇 가지 핵심적인 차이점이 있습니다.
첫 번째 차이점은 Podman이 데몬 없이(daemonless) 동작한다는 점입니다. 반면 Docker는 데몬에 의존합니다. 즉, Podman 컨테이너는 root 권한 없이도 작동할 수 있어 더 높은 보안성과 유연성을 제공합니다. 사용자 수준에서 실행되는 컨테이너는 해당 사용자만 자신의 컨테이너를 볼 수 있고, 다른 사용자는 접근할 수 없습니다. 또한 간소화된 아키텍처 덕분에 시스템 자원을 적게 사용하므로 더욱 쾌적한 사용 경험을 제공합니다.
데몬 없는 아키텍처는 '루트리스(rootless) 컨테이너'라는 개념으로 이어집니다. 이는 앞서 설명한 특징을 바탕으로 보안에 초점을 맞춘 개념입니다. 공격자가 컨테이너를 침해하고 어떤 이유로든 탈출에 성공하더라도, root 권한이 아닌 일반 사용자 권한만 얻을 수 있습니다. 추가 설정이 필요하고 현재 몇 가지 한계점이 있긴 하지만, 충분히 살펴볼 가치가 있는 기능입니다.
Podman 설치하기
대부분의 배포판에서 Podman은 기본 저장소에 포함되어 있어 간단한 명령어 한 줄로 설치할 수 있습니다:
# Debian/Ubuntu sudo apt install podman # Fedora/CentOS/Red Hat sudo dnf install podman # Arch Linux sudo pacman -S podman # OpenSUSE sudo zypper install podman # Gentoo sudo emerge app-emulation/podman
Podman 사용법
Podman 컨테이너를 시작하는 명령어 문법은 처음에는 다소 복잡해 보일 수 있지만, 익숙해지면 패턴이 눈에 들어오기 시작합니다. 프로젝트에서 제공하는 샘플 컨테이너를 터미널에 아래 명령어를 입력해 실행해볼 수 있습니다:
podman run -dt -p 8080:8080/tcp -e HTTPD_VAR_RUN=/run/httpd -e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d \ -e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf \ -e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/ \ registry.fedoraproject.org/f29/httpd /usr/bin/run-httpd

위 명령어는 지정된 레지스트리에서 이미지를 내려받고, 완료되면 긴 숫자(컨테이너 ID)가 출력됩니다. 이 ID는 나중에 실행 중인 컨테이너를 확인할 때 다시 보게 됩니다.
실행 중인 Podman 컨테이너를 확인하려면 다음 명령어를 입력하세요:
podman ps

아까 시작한 컨테이너가 목록에 나타나면 정상적으로 실행 중인 것입니다. Apache가 서빙하는 웹페이지를 직접 확인하고 싶다면 다음 명령어를 실행하세요:
curl https://0.0.0.0:8080
0.0.0.0 부분은 podman ps 명령 실행 시 표시된 IP 주소로 바꿔주면 됩니다. 결과로 알아보기 어려운 HTML 코드가 출력되는데, 맨 위쪽을 보면 HTML 타이틀 문법이 보일 것입니다. 이것이 보이면 정상적으로 작동하고 있다는 뜻입니다.
<title>Test Page for the Apache HTTP Server on Fedora</title>
Podman 이미지
Podman의 매력 중 하나는 이미지 활용입니다. httpd 같은 이미지나 직접 실행하고 싶은 프로그램의 이미지를 검색할 수 있습니다.
podman search CONTAINERNAME
실제로 vncserver를 검색한 결과는 다음과 같습니다. 선택지가 상당히 많다는 것을 알 수 있으며, 결국 개인 취향에 따라 골라 사용하면 됩니다.

이미지를 내려받으려면 podman pull 명령어를 사용합니다.
podman pull CONTAINERNAME
정확성을 위해 컨테이너 레지스트리의 전체 URL을 입력하는 것이 좋습니다. 예를 들어 필자가 실행한 명령어는 다음과 같습니다:
podman pull docker.io/michaelaboeckler/vncserver
podman pull vncserver처럼 짧은 이름만 입력하지 않은 이유는, 원하지 않는 다른 이미지가 대신 선택될 수 있기 때문입니다.

보유한 이미지 목록은 다음 명령어로 확인할 수 있습니다:
podman images
컨테이너를 중지하려면 다음 명령어를 사용하세요:
podman stop -l
-l 플래그는 가장 최근에 실행한 컨테이너를 중지한다는 의미이며, -a 플래그를 사용하면 모든 컨테이너를 한 번에 중지할 수 있습니다.
Podman이 docker.io에서도 컨테이너 이미지를 찾는 것을 눈치채셨을 겁니다. 그 이유는 Podman 명령어와 Docker 명령어가 사실상 동일하기 때문입니다. 그만큼 호환성이 높아 docker 명령어를 podman으로 별칭(alias) 처리하라는 조언도 종종 있습니다:
alias docker='podman'
이렇게 설정해두면 docker를 입력할 때마다 실제로는 podman 명령어가 실행됩니다.
루트리스(Rootless) Podman
시스템을 루트리스 컨테이너 환경으로 설정하려면 상당한 사전 작업이 필요하지만, Podman의 GitHub 페이지에 훌륭한 공식 문서가 마련되어 있으니 이를 참고하시기 바랍니다.
지금까지 데몬 없이, root 권한 없이 컨테이너를 실행할 수 있는 훌륭한 도구인 Podman에 대한 입문 가이드를 살펴봤습니다. Podman을 활용하면 시스템을 가볍고 깔끔하며 안전하게 유지할 수 있습니다. ChromeOS에서 컨테이너로 Ubuntu 실행하기, Docker 컨테이너를 다른 호스트로 복사하기, Docker 컨테이너 리소스 제한하기 등 다른 컨테이너 관련 콘텐츠도 함께 확인해보세요.