目次
1. 소개
컨테이너 기술의 진화와 주목받는 배경
최근 애플리케이션 개발 및 운영 현장에서 컨테이너 기술의 중요성이 급속히 높아지고 있습니다. 특히 개발 환경과 프로덕션 환경을 일치시켜 동작 재현성을 확보할 수 있다는 장점이 많은 엔지니어에게 호평받고 있습니다. 그 중에서도 대표적인 존재가 Docker이지만, 최근에는 이를 대체할 선택지로 Podman(포드맨)이 주목받고 있습니다. Podman은 Docker과 거의 동일한 CLI(명령줄 인터페이스)를 제공하면서도 데몬 없이 가볍고, root 권한이 필요 없는(rootless)라는 특징을 가지고 있습니다.왜 “Podman + Dockerfile + Ubuntu”인가
이 기사에서는 “Podman“, “Dockerfile“, “Ubuntu“라는 세 가지 요소를 결합하여 Linux 환경에서 현대적인 컨테이너 운영을 설명합니다.- Ubuntu는 초보자부터 고급자까지 폭넓게 사용되는 인기 있는 Linux 배포판이며,
- Dockerfile은 컨테이너 이미지를 구축하기 위한 설계도와도 같은 존재,
- 그리고 Podman은 이를 보다 유연하고 안전하게 운영하기 위한 차세대 도구입니다.
이 기사(본 글)의 목적과 대상 독자
이 글의 목적은 Ubuntu 환경에서 Podman을 사용해 Dockerfile을 빌드하고 실용적인 컨테이너를 만드는 절차를 자세히 설명하는 것입니다. 독자는 다음과 같은 분들을 대상으로 합니다:- Docker 경험은 있지만 Podman에 관심이 있는 분
- 보안된 환경에서 컨테이너를 다루고 싶은 Ubuntu 사용자
- 컨테이너 기술을 업무에 도입하고 싶은 엔지니어
- Dockerfile 작성과 Podman으로 빌드에 도전해보고 싶은 초보자
2. Podman이란?
Podman의 기본 개요
Podman(Pod Manager)은 Red Hat을 중심으로 하는 커뮤니티에 의해 개발된 차세대 컨테이너 관리 도구입니다. Docker와 마찬가지로 OCI(Open Container Initiative) 표준을 준수하는 컨테이너를 빌드·실행·관리할 수 있지만, 설계 철학과 구조에는 큰 차이가 있습니다. 가장 큰 특징은 Podman이 데몬을 필요로 하지 않는다는 점입니다. 이를 통해 경량이면서 보안성이 높은 운영이 가능합니다. 또한 Podman은 rootless 모드를 지원하여 일반 사용자가 권한 상승 없이 컨테이너를 조작할 수 있는 것도 큰 장점입니다. CLI 호환성이 높으며 기본 명령은 거의 동일합니다.Podman의 주요 특징
아래에 Podman의 대표적인 특징 몇 가지를 나열합니다.데몬리스 구조
Podman은 컨테이너를 관리하기 위한 데몬(상주 프로세스)을 가지고 있지 않습니다. 이를 통해 백그라운드에서 불필요한 프로세스를 실행하지 않고, 리소스 효율이 높은 환경을 구현합니다.rootless(비특권 사용자) 지원
Podman은 비관리자 권한의 일반 사용자도 컨테이너를 시작·조작할 수 있습니다. 이를 통해 멀티유저 환경이나 서버 환경에서 안전한 운영이 가능해지며, 보안상의 위험을 크게 줄입니다.Docker 호환 CLI
Podman은 Docker와 거의 동일한 명령 체계를 채택하고 있습니다. 예를 들어, 아래와 같은 Docker 명령은 Podman에서도 동일하게 동작합니다.podman build -t myimage .
podman run -it myimage bash
따라서 Docker 경험이 있는 사람은 별다른 어색함 없이 전환할 수 있습니다.pod(Pod) 기능
Kubernetes에서의 “Pod” 개념을 도입하여 여러 컨테이너를 하나의 논리 단위로 묶어 관리할 수 있습니다. 이를 통해 Kubernetes와의 친화성이 높아지고, 로컬 개발 환경에서 클라우드 환경으로의 원활한 전환도 가능해집니다.Ubuntu와의 호환성
Podman은 Fedora와 RHEL 계열 배포판에서 적극적으로 채택되고 있지만, Ubuntu에서도 안정적으로 동작합니다. 공식 저장소에서 설치가 가능하며 설정도 비교적 간단합니다. 특히 Ubuntu 20.04 LTS 이후에서는 패키지 정비가 진행되어 도입 장벽이 낮아졌습니다.3. Ubuntu에 Podman을 설치하는 방법
시작하기: 설치 전 확인 사항
Ubuntu에 Podman을 설치할 때는 먼저 사용 중인 Ubuntu 버전을 확인합시다. Podman은Ubuntu 20.04 LTS 이후에서 동작하는 것이 권장됩니다. 오래된 버전에서는 필요한 패키지가 공식 저장소에 포함되어 있지 않을 수 있습니다. 다음 명령어로 Ubuntu 버전을 확인할 수 있습니다.lsb_release -a
또한, Podman을 설치하려면sudo
권한이 필요합니다. rootless 모드로 사용할 경우에도 설치 시점에서는 관리자 권한이 요구되므로 미리 준비해 두세요.Podman 설치 절차(Ubuntu 공식 저장소)
Ubuntu 20.04 또는 22.04와 같은 최신 버전에서는 Podman을 APT를 사용해 간단히 설치할 수 있습니다.sudo apt update
sudo apt install -y podman
설치가 완료되면, 다음 명령어로 버전 정보를 확인하고 정상적으로 설치되었는지 확인합시다。podman --version
최신 버전을 사용하고 싶을 때의 절차(공식 PPA 추가)
Ubuntu 표준 저장소에 포함된 Podman은 다소 오래된 버전인 경우가 많기 때문에,최신 기능을 사용하고 싶을 경우 공식 PPA(개인 패키지 아카이브)를 이용하는 방법도 있습니다。. /etc/os-release
echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add -
sudo apt update
sudo apt install -y podman
이 방법을 사용하면,Red Hat 및 Fedora 계열과 동등한 최신 버전 Podman을 사용할 수 있습니다。Podman 기본 동작 테스트
설치 후,간단한 동작 확인을 해봅시다。podman info
이 명령어를 통해 Podman의 버전 및 설정 내용,지원되는 기능(rootless 모드 등)을 확인할 수 있습니다。 또한,다음 명령어로 공식 Alpine Linux 컨테이너를 가져와 실행 가능한지 테스트합니다。podman run --rm -it alpine sh
쉘이 정상적으로 시작되면,Podman의 기본 동작에 문제가 없음을 확인할 수 있습니다。4. Dockerfile의 기본과 Podman 사용
Dockerfile이란 무엇인가?
Dockerfile은 컨테이너 이미지를 구축하기 위한 설계도입니다. 텍스트 파일 형식으로, 어떤 베이스 이미지를 사용할지, 어떤 패키지를 설치할지, 어떤 파일을 복사할지 등을 명령으로 순차적으로 기술합니다. 이 파일을 기반으로, Podman이나 Docker와 같은 컨테이너 도구는 일관된 환경을 자동으로 구축할 수 있습니다. 대표적인 명령 예시는 다음과 같습니다:FROM ubuntu:22.04
RUN apt update && apt install -y curl
COPY ./app.sh /usr/local/bin/app.sh
CMD ["bash", "/usr/local/bin/app.sh"]
이와 같이, 기본이 되는 Ubuntu 이미지에 패키지를 설치하고, 스크립트를 배치한 뒤, 마지막으로 실행 내용을 정의하는 흐름이 됩니다.Podman에서 Dockerfile을 사용하는 방법
Podman에서는 Dockerfile을 사용하여 컨테이너 이미지를 빌드할 수 있습니다. 기본적인 사용법은 Docker와 거의 동일합니다.1. 디렉터리 준비
다음과 같은 구성으로 파일을 준비합니다。project/
├── Dockerfile
└── app.sh
app.sh
는 다음과 같은 간단한 스크립트입니다:#!/bin/bash
echo "Hello from Podman container!"
파일에 실행 권한을 부여합니다:chmod +x app.sh
2. Podman으로 빌드
현재 디렉터리에 Dockerfile이 있는 상태에서, 다음과 같이 빌드합니다:podman build -t mypodmanapp .
이 명령으로 mypodmanapp
이라는 이름의 컨테이너 이미지가 생성됩니다.3. 빌드 결과 확인
생성된 이미지는 다음과 같이 확인할 수 있습니다:podman images
4. 컨테이너 실행
빌드한 이미지를 사용하여 컨테이너를 실행합니다:podman run --rm mypodmanapp
정상적으로 설정되었다면, 스크립트 출력으로 Hello from Podman container!
가 표시됩니다.Containerfile과의 차이
Podman에서는 Dockerfile과 동일한 구문을 가진 파일을 Containerfile이라고 부르기도 합니다. 이는 “Docker에 의존하지 않는 중립적인 명칭을 사용하자”는 사상에 기반한 명칭입니다. 하지만 실제 동작이나 작성 방식에 차이는 없습니다. 파일명을Dockerfile
로 하든 Containerfile
로 하든, 둘 다 Podman에서 문제없이 읽을 수 있습니다.podman build -f Containerfile -t myimage .
이와 같이 -f
옵션으로 파일명을 지정하면, 임의의 이름이라도 대응 가능합니다.5. 실전: Ubuntu 기반 컨테이너 만들기
Ubuntu를 기반으로 한 Dockerfile 만들기
이제부터 실제로Ubuntu를 기반으로 한 Dockerfile을 만들고, Podman으로 컨테이너 이미지를 빌드·실행하는 절차를 단계별로 소개합니다. 먼저, 아래와 같은 간단한Dockerfile
을 준비합니다:FROM ubuntu:22.04
RUN apt update && apt install -y curl && apt clean
COPY hello.sh /usr/local/bin/hello.sh
RUN chmod +x /usr/local/bin/hello.sh
CMD ["/usr/local/bin/hello.sh"]
이 Dockerfile은 다음과 같은 작업을 수행합니다:- Ubuntu 22.04의 공식 이미지를 사용
curl
패키지를 설치- 호스트 측의
hello.sh
를 컨테이너 내부에 복사 hello.sh
를 기본 실행 스크립트로 지정
hello.sh
라는 간단한 셸 스크립트도 만들겠습니다:#!/bin/bash
echo "안녕하세요, Podman 컨테이너에서 출력된 내용입니다!"
이 스크립트에 실행 권한을 부여하세요:chmod +x hello.sh
Podman에서 이미지 빌드 절차
파일이 준비되면, 다음 명령으로 빌드합니다.podman build -t ubuntu-hello .
여기서 -t ubuntu-hello
는 생성되는 이미지에 태그명을 붙이는 옵션입니다. 마지막 .
는 Dockerfile이 있는 디렉터리를 지정합니다. 빌드가 성공하면, 로컬에 새로운 이미지가 저장됩니다.podman images
이 명령으로 이미지 목록을 확인할 수 있습니다.빌드한 이미지 실행 및 확인
만든 이미지에서 컨테이너를 실행하려면, 아래 명령을 사용합니다:podman run --rm ubuntu-hello
출력 예:안녕하세요, Podman 컨테이너에서 출력된 내용입니다!
--rm
옵션을 붙이면, 컨테이너 실행 후 자동으로 삭제되어 테스트 용도에 최적입니다.보충: 인터랙티브 컨테이너 시작
컨테이너 내부에서 조작하고 싶을 경우, 아래와 같이-it
옵션을 붙여 Bash를 실행할 수도 있습니다.podman run -it ubuntu-hello bash
이렇게 하면, Ubuntu 기반의 가벼운 개발 환경으로도 활용할 수 있습니다.6. Podman의 편리한 기능과 팁
Podman의 강점은 “유연성과 보안”
Podman은 Docker와 호환성을 유지하면서도, 보다 유연하고 안전한 운영을 가능하게 하는 기능을 갖추고 있습니다. 여기서는 실용성이 높은 편리한 기능과, 일상 운영에 도움이 되는 팁을 소개합니다.rootless 모드로 보안 있게 운영
Podman의 가장 큰 특징 중 하나는 “rootless 모드”입니다. 이는 관리자 권한이 없는 일반 사용자도 컨테이너의 시작·정지·관리가 가능한 기능입니다. 다음과 같이, sudo 없이 Podman을 사용할 수 있습니다:podman run -it ubuntu bash
이 동작은 사용자의 홈 디렉터리 이하에 제한되므로, 시스템에 대한 영향을 최소화할 수 있습니다. 특히 공유 서버나 개발 환경에서는 rootless가 매우 유용합니다.systemd 연동으로 자동 시작 구현
Podman은 systemd와의 네이티브 연동이 가능합니다. 이를 통해 컨테이너를 Linux 서비스로서 시작 시 자동 실행할 수 있습니다. 예를 들어, 다음과 같이 Podman 컨테이너에서 systemd 서비스 유닛을 생성할 수 있습니다:podman generate systemd --name mycontainer --files --restart-policy=always
이 명령으로 ~/.config/systemd/user/
아래에 유닛 파일이 생성됩니다. 생성 후에는 다음과 같이 활성화·시작할 수 있습니다:systemctl --user daemon-reexec
systemctl --user enable --now container-mycontainer.service
이를 통해 서버 재시작 시에도 자동으로 컨테이너가 올라오는 구성을 간단히 구현할 수 있습니다.podman-compose로 멀티 컨테이너 관리
Podman은 단일 컨테이너 운영에 더해, 여러 컨테이너를 한 번에 관리할 수 있는 메커니즘도 갖추고 있습니다. Docker Compose와 동일한 작업이 가능한 “podman-compose”를 사용하면 복잡한 구성도 쉽게 관리할 수 있습니다. 설치는 다음과 같이 Python의 pip를 사용합니다:pip install podman-compose
일반적인 docker-compose.yml
파일과 호환성이 높아 기존 프로젝트를 그대로 활용할 수 있는 것이 장점입니다. 시작도 간단하며, 다음과 같이 실행하기만 하면 됩니다:podman-compose up -d
Podman을 사용해도, 개발 환경을 즉시 재현할 수 있는 메커니즘을 그대로 활용할 수 있습니다.기타 편리한 명령·팁
이미지 정리(불필요한 이미지·컨테이너 삭제)
podman system prune -a
불필요해진 임시 파일 및 사용되지 않는 이미지를 일괄 삭제하는 명령입니다. 스토리지 정리에 유용합니다.명령 자동완성 설정(bash/zsh)
Podman의 명령 자동완성 스크립트는 아래에서 얻을 수 있습니다:sudo apt install podman-docker
이를 통해 podman
명령에서도 docker
처럼 자동완성이 작동하게 되어 작업 효율이 향상됩니다.7. Docker에서 Podman으로의 마이그레이션 가이드
Podman으로의 마이그레이션이 주목받는 이유
Docker는 오랫동안 컨테이너 기술의 대명사로 사용되어 왔지만, 최근에는 보다 가볍고 보안성이 높은 선택지로서 Podman으로 전환하는 움직임이 보이고 있습니다. 특히 Red Hat Enterprise Linux(RHEL)와 Fedora에서는 Docker 지원이 축소되고, Podman이 기본이 되면서 전환을 검토하는 현장도 늘어나고 있습니다. 이 장에서는 Docker에서 Podman으로 원활하게 전환하기 위한 구체적인 단계와 주의점을 설명합니다.Docker와 Podman의 명령어 호환성
Podman은 Docker와 높은 명령어 호환성을 가지고 있기 때문에, 기본적으로 아래와 같은 명령어를 그대로 교체할 수 있습니다.Docker | Podman |
---|---|
docker build -t myapp . | podman build -t myapp . |
docker run -it myapp | podman run -it myapp |
docker images | podman images |
docker ps | podman ps |
podman-docker로 완전 호환을 구현하는 방법
기존 스크립트나 CI/CD 파이프라인 등에서 “docker” 명령을 전제로 하는 경우에는,podman-docker
패키지를 설치함으로써 Podman을 Docker의 대체로 동작시킬 수 있습니다.sudo apt install podman-docker
이 패키지를 도입하면, 아래와 같이 docker
명령이 내부적으로 podman
을 호출하도록 됩니다:which docker
# → /usr/bin/docker → podman 의 심볼릭 링크
이를 통해 기존 Docker용 스크립트를 수정 없이 Podman에서 동작시킬 수 있습니다.docker-compose 대체: podman-compose
Docker Compose로 다중 컨테이너를 정의한 프로젝트에서는podman-compose
를 도입함으로써 동일한 작업이 가능합니다. 호환성은 높지만, Compose 파일의 일부 기능이나 동작에는 미묘한 차이가 있으므로, 다음 사항에 유의하십시오:depends_on
등 일부 Compose 옵션은 미지원이거나 동작 차이가 있음- 이벤트 로그 및 헬스 체크 관련 동작이 다를 수 있음
이미지·볼륨 전환
Docker에서 사용하던 이미지를 Podman으로 전환할 때, 로컬 Docker 이미지는 그대로 Podman에서 참조할 수 없습니다. 아래와 같이 재획득하거나 내보내기·가져오기를 해야 합니다.옵션 1: Podman 측에서 재 pull
podman pull ubuntu:22.04
옵션 2: Docker에서 내보내기 → Podman에서 가져오기
# Docker 측에서 내보내기
docker save myimage > myimage.tar
# Podman 측에서 가져오기
podman load < myimage.tar
이를 통해 Docker에서 만든 이미지를 Podman에서도 사용할 수 있게 됩니다.기타 주의점
- rootless 지원 차이: Docker는 기본적으로 root를 전제로 하고, Podman은 rootless에서도 표준 운영이 가능
- 데몬 구조 차이: Podman은 데몬리스이므로 백그라운드 프로세스 관리 방식이 다름
- 로그 및 데이터 저장 위치도 다르기 때문에, 전환 시 설정 파일 확인이 필요합니다
8. 자주 묻는 질문(FAQ)
Q1. Podman과 Docker의 주요 차이점은 무엇인가요?
A1. 가장 큰 차이점은、Podman은 “데몬리스(상주 프로세스 불필요)”로 동작하는 점입니다. 이를 통해 보다 가볍고 보안성 높은 운영이 가능합니다. 또한, Podman은rootless 모드에도 대응하고 있어 일반 사용자가 권한 상승 없이 컨테이너를 조작할 수 있는 것이 큰 특징입니다. CLI 호환성이 높고, 기본 명령은 거의 동일합니다.Q2. Dockerfile과 Containerfile은 어떻게 다른가요?
A2. 기능적인 차이는전혀 없습니다. 어느 쪽이든 컨테이너 빌드 절차를 기술하기 위한 파일이며, 구문도 전혀 동일합니다. 하지만, Podman이나 OCI 준수 프로젝트에서는 “Docker에 의존하지 않는 명칭”으로서Containerfile이 선호되는 경향이 있습니다. 이름 차이에 불과하므로 실제 운영에서는 DockerFile을 그대로 사용해도 문제없습니다.Q3. Podman에서 Docker Compose를 사용할 수 있나요?
A3. 직접적인 지원은 없지만, 대체 도구로podman-compose
를 사용할 수 있습니다. 이는 Python으로 만든 스크립트로, docker-compose.yml
형식의 파일을 Podman 환경에서 해석·실행할 수 있습니다. 하지만, 일부 옵션(depends_on
등)에 제한이 있기 때문에, 복잡한 구성을 다룰 경우 사전에 검증이 필요합니다.Q4. Podman은 Ubuntu에서도 안정적으로 동작하나요?
A4. 네, Ubuntu 20.04 LTS 이후라면 안정적으로 동작합니다. Ubuntu 공식 저장소에도 Podman이 포함되어 있어apt
를 사용해 쉽게 설치할 수 있습니다. 더 최신 버전을 사용하고 싶다면 PPA(개인 패키지 아카이브)를 이용하는 방법도 있습니다.Q5. rootless 모드에서 컨테이너 접근 제한이 있나요?
A5. rootless 모드에서는 일부 특권 작업이나 포트 번호(1024 미만) 바인딩이 제한됩니다. 하지만 포트 포워딩을 이용하면 이러한 제약을 회피할 수 있습니다. 많은 사용 사례에서 rootless라도 충분히 실용적입니다.Q6. Podman에서 pull할 수 있는 이미지가 Docker Hub와 동일한가요?
A6. 네, Podman도 기본적으로 Docker Hub에 접근해 이미지를 가져올 수 있습니다. 다만 환경에 따라docker.io/library/ubuntu
와 같이 레지스트리와 네임스페이스를 명시적으로 지정해야 하는 경우가 있습니다.podman pull docker.io/library/ubuntu
Podman은 또한 Quay.io 및 GitHub Container Registry 등 여러 원격 레지스트리를 지원합니다.