1. Introduction
컨테이너 기술의 진화와 그 중요성
최근 몇 년간 컨테이너 기술의 중요성이 애플리케이션 개발 및 운영에서 급격히 증가했습니다. 특히 개발 환경과 프로덕션 환경을 일치시켜 재현성을 보장하는 능력이 엔지니어들 사이에서 강력한 지지를 받고 있습니다.
Docker가 오랫동안 이 분야의 주류 솔루션이었지만, 최근 Podman이 강력한 대안으로 부상했습니다. Podman은 Docker와 거의 동일한 CLI(명령줄 인터페이스)를 제공하면서 데몬 없는 아키텍처, 가벼운 운영, 루트 권한 없이 루트리스 실행과 같은 핵심 장점을 제공합니다.
왜 “Podman + Dockerfile + Ubuntu”인가?
이 글에서는 세 가지 필수 요소인 Podman, Dockerfile, Ubuntu를 결합하여 Linux에서 현대적인 컨테이너 운영 방식을 설명합니다.
- Ubuntu는 초보자와 고급 사용자 모두에게 적합한 널리 사용되는 Linux 배포판이며,
- Dockerfile은 컨테이너 이미지를 빌드하기 위한 청사진 역할을 하고,
- Podman은 보다 유연하고 안전한 컨테이너 관리를 가능하게 하는 차세대 도구입니다.
보안 의식이 높아짐에 따라 Ubuntu에서 Dockerfile과 함께 Podman을 사용하는 것이 개인 개발자와 기업 환경 모두에서 인기 있는 선택이 되고 있습니다.
목적 및 대상 독자
이 글의 목표는 Ubuntu에서 Podman을 사용해 Dockerfile을 빌드하고 실용적인 컨테이너를 만드는 방법을 꼼꼼히 설명하는 것입니다.
다음과 같은 독자를 대상으로 합니다:
- Docker 경험이 있으며 Podman에 관심이 있는 사람
- 컨테이너를 안전하게 관리하고 싶은 Ubuntu 사용자
- 업무에 컨테이너 기술을 도입하려는 엔지니어
- Dockerfile을 작성하고 Podman으로 이미지를 빌드해 보고 싶은 초보자
기본 사용법 외에도 이 글에서는 문제 해결 팁, Docker와의 주요 차이점, 마이그레이션 전략을 다룹니다.
2. What Is Podman?
Podman 기본 개요
Podman (Pod Manager)은 Red Hat 주도의 커뮤니티에서 개발한 차세대 컨테이너 관리 도구입니다. Docker와 마찬가지로 OCI(Open Container Initiative) 표준을 준수하는 컨테이너를 빌드·실행·관리할 수 있지만, 설계 철학과 아키텍처가 크게 다릅니다.
가장 눈에 띄는 특징은 Podman은 데몬이 필요 없다는 점입니다. 이를 통해 가볍고 안전한 운영이 가능합니다. 또한 Podman은 루트리스 모드를 지원해 일반 사용자가 권한 상승 없이 컨테이너를 관리할 수 있습니다. Docker와의 CLI 호환성이 매우 높아 마이그레이션이 용이합니다.
Podman 주요 기능
아래는 Podman의 주요 기능 몇 가지입니다:
데몬 없는 아키텍처
Podman은 컨테이너 관리를 위해 백그라운드 데몬 프로세스에 의존하지 않습니다. 따라서 불필요한 백그라운드 서비스 없이 효율적인 자원 사용이 가능합니다.
루트리스(비특권 사용자) 지원
Podman은 관리자 권한이 없는 사용자도 컨테이너를 시작·관리할 수 있게 합니다. 이는 다중 사용자 또는 서버 환경에서 보안을 크게 향상시키고 보안 위험을 현저히 감소시킵니다.
Docker 호환 CLI
Podman은 Docker와 거의 동일한 명령 구조를 사용합니다. 예를 들어, 다음 Docker 명령은 Podman에서도 거의 동일하게 동작합니다:
podman build -t myimage .
podman run -it myimage bash
그 결과, Docker 사용자는 최소한의 마찰로 마이그레이션할 수 있습니다.
Pod 기능
Podman은 Kubernetes의 “Pod” 개념을 도입해 여러 컨테이너를 하나의 논리적 단위로 관리할 수 있게 합니다. 이는 Podman이 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 모드로 사용하더라도 설치 과정에서는 관리자 권한이 요구됩니다.
Ubuntu 공식 저장소에서 Podman 설치
Ubuntu 20.04 또는 22.04와 같은 최신 버전에서는 APT를 사용해 간편하게 Podman을 설치할 수 있습니다.
sudo apt update
sudo apt install -y podman
설치가 끝난 후, 버전을 확인하여 Podman이 정상적으로 설치되었는지 검증하십시오:
podman --version
공식 PPA를 이용한 최신 버전 설치
Ubuntu 기본 저장소에 포함된 Podman 버전은 다소 오래된 경우가 많습니다. 최신 기능을 사용하려면 공식 PPA에서 Podman을 설치할 수 있습니다.
. /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이 정상 작동하는지 확인합니다:
podman info
이 명령은 Podman의 설정, 버전 및 rootless 모드와 같은 지원 기능을 표시합니다.
또한 공식 Alpine Linux 이미지를 실행하여 컨테이너 실행을 테스트할 수 있습니다:
podman run --rm -it alpine sh
쉘이 정상적으로 시작되면 Podman이 올바르게 동작하는 것입니다.
4. Dockerfile 기본 및 Podman 사용법
Dockerfile이란?
Dockerfile은 컨테이너 이미지를 빌드하기 위한 설계도입니다. 베이스 이미지, 설치할 패키지, 복사할 파일 등 명령을 정의한 텍스트 파일입니다.
이 파일을 기반으로 Podman 및 Docker와 같은 컨테이너 도구가 일관된 환경을 자동으로 빌드합니다.
일반적인 Dockerfile 명령 예시:
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은 Docker와 동일한 방식으로 Dockerfile에서 컨테이너 이미지를 빌드할 수 있습니다.
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!이 표시됩니다.
Dockerfile vs 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 "Hello, this output is from a Podman container!"
스크립트에 실행 권한을 부여하세요:
chmod +x hello.sh
Podman을 사용한 이미지 빌드
파일이 준비되면 다음 명령어를 사용하여 이미지를 빌드하세요:
podman build -t ubuntu-hello .
-t ubuntu-hello 옵션은 이미지에 태그 이름을 할당하고, 뒤따르는 .은 Dockerfile이 포함된 디렉토리를 지정합니다.
빌드가 성공적으로 완료되면 이미지가 로컬에 저장됩니다.
podman images
이 명령어를 사용하여 이미지가 생성되었는지 확인할 수 있습니다.
빌드된 이미지 실행 및 확인
다음 명령어를 사용하여 새로 빌드된 이미지에서 컨테이너를 실행하세요:
podman run --rm ubuntu-hello
예제 출력:
Hello, this output is from a Podman container!
--rm 옵션은 실행 후 컨테이너를 자동으로 제거하여 테스트 목적으로 이상적입니다.
선택 사항: 대화형 컨테이너 실행
컨테이너와 직접 상호작용하려면 -it 옵션으로 시작하고 Bash를 실행할 수 있습니다:
podman run -it ubuntu-hello bash
이렇게 하면 컨테이너를 경량 Ubuntu 기반 개발 환경으로 사용할 수 있습니다.
6. 유용한 Podman 기능 및 팁
Podman의 강점: 유연성과 보안
Docker 호환성을 유지하면서 Podman은 더 유연하고 안전한 컨테이너 작업을 가능하게 하는 기능을 제공합니다. 이 섹션에서는 일상적인 워크플로에서 특히 유용한 실용적인 기능과 팁을 소개합니다.
Rootless 모드를 사용한 안전한 운영
Podman의 가장 강력한 기능 중 하나는 rootless 모드로, 일반 사용자가 관리자 권한 없이 컨테이너를 시작, 중지 및 관리할 수 있게 합니다.
아래와 같이 sudo 없이 컨테이너를 실행할 수 있습니다:
podman run -it ubuntu bash
이 작업은 사용자의 홈 디렉토리에 국한되기 때문에 시스템 전체 영향이 최소화됩니다. Rootless 모드는 공유 서버와 개발 환경에서 특히 유용합니다.
systemd 통합을 사용한 자동 시작
Podman은 systemd와의 네이티브 통합을 지원하여 컨테이너를 Linux 서비스로 자동 실행할 수 있게 합니다.
다음 명령어를 사용하여 컨테이너에 대한 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은 다중 컨테이너 오케스트레이션을 지원합니다. podman-compose를 사용하면 Docker Compose와 유사한 기능을 달성할 수 있습니다.
pip를 사용하여 podman-compose를 설치하세요:
pip install podman-compose
docker-compose.yml 파일과 대체로 호환되기 때문에 기존 구성을 자주 재사용할 수 있습니다.
서비스를 시작하는 것은 다음과 같이 간단합니다:
podman-compose up -d
이로 인해 Podman을 사용하더라도 완전한 개발 환경을 즉시 재현할 수 있습니다.
추가 유용한 명령어와 팁
사용하지 않는 이미지와 컨테이너 정리
podman system prune -a
이 명령어는 사용하지 않는 컨테이너, 이미지 및 임시 파일을 제거하여 저장소를 깨끗하게 유지하는 데 도움이 됩니다.
명령어 완성 활성화 (bash/zsh)
다음 패키지를 사용하여 명령어 완성 지원을 설치할 수 있습니다:
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와 높은 수준의 CLI 호환성을 유지하여 대부분의 명령어를 수정 없이 직접 대체할 수 있습니다.
| 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으로 전환할 수 있으며, 이는 가장 큰 장점 중 하나입니다.
podman-docker를 통한 완전한 호환성 달성
기존 스크립트, CI/CD 파이프라인 또는 도구가 docker 명령어의 존재를 가정한다면, podman-docker 패키지를 설치하여 Podman을 즉시 대체 가능한 것으로 만들 수 있습니다.
sudo apt install podman-docker
설치 후, docker 명령어는 Podman으로의 심볼릭 링크가 됩니다:
which docker
# → /usr/bin/docker → symbolic link to podman
이로 인해 기존 Docker 기반 스크립트가 수정 없이 Podman에서 실행될 수 있습니다.
docker-compose를 podman-compose로 대체
다중 컨테이너 환경을 정의하기 위해 Docker Compose를 사용하는 프로젝트의 경우, podman-compose가 호환 가능한 대안을 제공합니다.
호환성은 일반적으로 높지만, 다음 제한 사항을 유의하세요:
- 일부 Compose 옵션(예:
depends_on)은 지원되지 않거나 다르게 동작할 수 있습니다 - 이벤트 로깅 및 헬스 체크 동작에 차이가 있을 수 있습니다
웹 서버와 데이터베이스 조합과 같은 일반적인 구성의 경우, 마이그레이션은 보통 간단합니다.
이미지와 볼륨 마이그레이션
로컬에 저장된 Docker 이미지는 Podman에서 직접 액세스할 수 없습니다. 재다운로드하거나 내보내기 및 가져오기를 해야 합니다.
옵션 1: Podman으로 이미지 재다운로드
podman pull ubuntu:22.04
옵션 2: Docker에서 내보내기 및 Podman으로 가져오기
# Export from Docker
docker save myimage > myimage.tar
# Import into Podman
podman load < myimage.tar
이로 인해 Docker로 빌드된 이미지를 Podman에서 재사용할 수 있습니다.
추가 마이그레이션 고려사항
- Rootless 운영 차이 : Docker는 일반적으로 루트 사용을 가정하지만, Podman은 rootless 운영을 위해 설계되었습니다
- 데몬 아키텍처 : Podman은 데몬리스로, 백그라운드 프로세스 관리 방식이 변경됩니다
- 로그 및 데이터 저장 위치가 다르기 때문에 마이그레이션 중 검토해야 합니다
8. 자주 묻는 질문 (FAQ)
Q1. Podman과 Docker의 주요 차이점은 무엇인가요?
A1. 가장 중요한 차이점은 Podman이 데몬 없이 작동한다는 것입니다. 이는 더 가볍고 안전한 작동을 가능하게 합니다. Podman은 또한 루트리스 모드를 지원하여 권한 상승 없이 컨테이너를 관리할 수 있습니다. Docker와의 CLI 호환성은 매우 높습니다.
Q2. Dockerfile과 Containerfile의 차이점은 무엇인가요?
A2. 기능적인 차이점은 전혀 없습니다. 두 파일 모두 동일한 구문을 사용하여 컨테이너 빌드 지침을 설명합니다.
Containerfile이라는 이름은 Docker 고유 용어를 피하기 위해 OCI 준수 프로젝트에서 선호됩니다. 실제로 Dockerfile은 Podman과 완벽하게 작동합니다.
Q3. Podman과 함께 Docker Compose를 사용할 수 있나요?
A3. Docker Compose는 직접 지원되지 않지만, 대안으로 podman-compose를 사용할 수 있습니다. 이는 Podman 환경에서 docker-compose.yml 파일을 해석합니다.
depends_on과 같은 일부 옵션은 제한적이기 때문에 복잡한 설정의 경우 테스트를 권장합니다.
Q4. Podman은 Ubuntu에서 안정적으로 실행되나요?
A4. 네. Podman은 Ubuntu 20.04 LTS 이상에서 안정적으로 실행됩니다. 공식 Ubuntu 저장소에서 사용할 수 있으며 apt를 사용하여 쉽게 설치할 수 있습니다. 최신 버전의 경우 PPA를 사용하는 것도 옵션입니다.
Q5. 루트리스 모드를 사용할 때 제한 사항이 있나요?
A5. 루트리스 모드는 특정 권한 있는 작업과 1024 미만 포트 바인딩을 제한합니다. 그러나 이러한 제한은 종종 포트 포워딩을 사용하여 우회할 수 있습니다. 대부분의 사용 사례에서 루트리스 모드는 완전히 실용적입니다.
Q6. Podman은 Docker Hub와 동일한 이미지를 가져올 수 있나요?
A6. 네. Podman은 기본적으로 Docker Hub에서 이미지를 가져올 수 있습니다. 일부 환경에서는 레지스트리와 네임스페이스를 명시적으로 지정해야 할 수 있습니다:
podman pull docker.io/library/ubuntu
Podman은 Quay.io 및 GitHub Container Registry와 같은 다른 레지스트리도 지원합니다.
Q7. Podman은 프로덕션 환경에 적합한가요?
A7. 네. Podman은 Kubernetes 호환 포드 개념과 systemd 통합과 같은 프로덕션 사용에 필요한 기능을 포함합니다. 보안이 민감한 환경에서 Podman은 Docker보다 더 나은 선택일 수 있습니다.
Podman은 RHEL과 Fedora의 기본 컨테이너 엔진이며 광범위한 프로덕션 채택을 이루고 있습니다.



