13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] Podman

  • [Cloud] Podman vs Docker: 홈랩 환경에서의 성능 및 관리 비교

    [Cloud] Podman vs Docker: 홈랩 환경에서의 성능 및 관리 비교

    Podman vs Docker: 홈랩 환경에서의 성능 및 관리 비교

    안녕하세요, 13년차의 서버실 주인장입니다. 제 홈랩 이야기를 풀어놓는 곳이죠. 오늘은 많은 분들이 궁금해하실 만한 주제, 바로 Podman(팟맨)과 Docker(도커)에 대해 이야기해보려고 합니다. 저도 처음 인프라 엔지니어 일을 시작할 때부터 Docker를 줄곧 써왔고, 사실 컨테이너 하면 Docker가 거의 대명사처럼 쓰였잖아요? 근데 요즘 들어 Podman이 심상치 않다는 이야기를 많이 듣게 되더라고요. 특히나 개인적인 홈랩 환경에서는 어떤 선택이 더 좋을지 직접 비교해보고 싶어서, 제 홈랩 서버에 둘 다 설치해서 며칠간 굴려봤습니다. 삽질도 좀 했고요. ㅎㅎ

    컨테이너 기술은 이제 선택이 아닌 필수가 되었죠. 마이크로서비스 아키텍처(MSA)부터 CI/CD 파이프라인, 심지어 IoT 디바이스까지, 어디든 컨테이너가 쓰이지 않는 곳이 없습니다. 홈랩에서도 마찬가지예요. 웹서버, 데이터베이스, 각종 모니터링 툴까지 컨테이너로 띄워두면 관리도 편하고 자원도 효율적으로 쓸 수 있거든요. 하지만 두 가지 주요 컨테이너 런타임(Container Runtime), Podman과 Docker 중에서 어떤 것을 선택해야 할지 고민하는 분들이 많으실 겁니다. 저도 그랬거든요.

    Podman과 Docker의 핵심 아키텍처 차이점을 보여주는 다이어그램

    Podman과 Docker의 핵심 아키텍처 차이를 시각적으로 비교한 다이어그램입니다. 데몬 유무, rootless 모드 지원 여부 등에 초점을 맞춥니다.

    Podman과 Docker, 뭐가 다른가요?

    쉽게 말해, 둘 다 컨테이너를 만들고 실행하는 도구죠. 하지만 내부적으로 작동하는 방식에는 꽤 큰 차이가 있어요. 제가 직접 써보면서 느낀 핵심적인 차이점들을 짚어볼게요.

    • Docker (도커): 컨테이너 기술의 사실상 표준이 되었죠. 데몬(Daemon) 기반으로 작동합니다. 즉, dockerd라는 백그라운드 프로세스가 항상 떠 있어서 클라이언트의 명령을 받고 컨테이너를 관리하는 형태예요. 이 데몬이 모든 컨테이너 작업을 총괄하고, API를 통해 명령을 주고받는 클라이언트-서버 아키텍처(Client-Server Architecture)죠.
    • Podman (팟맨): Red Hat에서 주도적으로 개발한 컨테이너 런타임입니다. 가장 큰 특징은 데몬리스(Daemonless)라는 점이에요. 백그라운드 데몬 없이 필요한 시점에만 프로세스가 실행되고, 컨테이너를 직접 생성하고 관리합니다. 그리고 루트리스(Rootless) 모드를 기본적으로 지원해서, 일반 사용자 계정으로도 컨테이너를 실행할 수 있다는 게 강력한 장점이거든요.

    더 자세한 차이점을 표로 정리해볼게요.

    특징 Docker Podman
    데몬 유무 ✅ 데몬(dockerd) 필요 ❌ 데몬 없음 (필요 시 직접 실행)
    루트 권한 기본적으로 루트 권한 필요 (데몬) ✅ 기본 루트리스(Rootless) 지원
    Kubernetes(쿠버네티스) 호환성 Docker Swarm, Docker Compose ✅ Pods 지원 (podman play kube)
    CLI 명령어 docker ... podman ... (Docker와 유사)
    컨테이너 빌드 docker build podman build (Buildah 사용)
    멀티 컨테이너 오케스트레이션 docker-compose podman-compose (별도 설치), podman play kube

    홈랩에서 Podman과 Docker 직접 설치하고 써보기

    제 홈랩 서버는 Ubuntu 22.04 LTS를 사용하고 있습니다. 일반적으로 많이 쓰시는 환경이라 이 기준으로 설명드릴게요.

    1. Docker 설치 및 기본 사용

    Docker는 워낙 유명하니 설치는 비교적 간단합니다. 공식 문서에 따라 진행하면 되죠.

    
    # 기존 Docker 버전 제거 (선택 사항)
    sudo apt-get remove docker docker-engine docker.io containerd runc
    
    # 필수 패키지 설치
    sudo apt-get update
    sudo apt-get install ca-certificates curl gnupg lsb-release
    
    # Docker 공식 GPG 키 추가
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
    # Docker APT 저장소 설정
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    # Docker Engine 설치
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
    # 사용자 계정을 docker 그룹에 추가 (sudo 없이 docker 명령어 사용)
    sudo usermod -aG docker $USER
    newgrp docker # 변경사항 즉시 적용
    
    # Docker 서비스 확인
    systemctl status docker
    
    # Nginx 컨테이너 실행 예시
    docker run -d --name my-nginx -p 8080:80 nginx:latest
    docker ps
    

    설치 후에는 docker run, docker ps 같은 명령어로 컨테이너를 쉽게 관리할 수 있어요. 익숙한 명령어들이죠? docker-compose도 플러그인 형태로 같이 설치되니 멀티 컨테이너 환경 구성에도 편리합니다.

    2. Podman 설치 및 기본 사용 (그리고 Rootless!)

    Podman도 Ubuntu에서는 APT 저장소를 통해 쉽게 설치할 수 있어요.

    
    # Podman 설치
    sudo apt-get update
    sudo apt-get install podman
    
    # Podman 버전 확인
    podman --version
    
    # Nginx 컨테이너 실행 예시 (루트리스 모드)
    podman run -d --name my-nginx-podman -p 8081:80 nginx:latest
    podman ps
    
    # Podman 서비스 활성화 (원격 API나 systemd 통합을 위해)
    # 이 명령은 rootless 모드에서 사용자별 systemd 서비스를 활성화합니다.
    systemctl --user enable --now podman.socket
    
    # Docker CLI처럼 원격으로 Podman 데몬에 연결하는 방법 (선택 사항)
    # DOCKER_HOST 환경 변수를 설정하면 docker CLI 명령어를 podman에 연결할 수 있습니다.
    # export DOCKER_HOST=unix:///run/user/$(id -u)/podman/podman.sock
    # docker ps # 이제 podman 컨테이너를 보여줍니다 (docker CLI 사용)
    

    루트리스 모드(Rootless Mode)가 Podman의 가장 큰 매력 중 하나라고 했잖아요? 위 예시처럼 그냥 podman run을 실행하면 기본적으로 현재 사용자 계정의 권한으로 컨테이너가 실행돼요. 이게 진짜 편하더라고요. 보안 측면에서도 훨씬 안전하고요. 만약 컨테이너에서 어떤 취약점이 발견되더라도, 호스트 시스템의 루트 권한을 직접적으로 탈취하기가 훨씬 어려워지거든요.

    Podman rootless 모드로 컨테이너를 실행하고 확인하는 터미널 화면

    Podman으로 rootless 컨테이너를 실행하고 터미널에서 확인하는 화면입니다. user namespace가 잘 설정되었음을 보여줍니다.

    3. 멀티 컨테이너 오케스트레이션: Docker Compose vs Podman Play Kube

    여러 컨테이너를 함께 띄워야 할 때 Docker Compose(도커 컴포즈)는 정말 유용해요. 하나의 docker-compose.yaml 파일로 서비스들을 정의하고 한 번에 관리할 수 있죠. Podman에서는 비슷한 역할을 하는 podman-compose라는 툴도 있지만, 저는 podman play kube를 주로 사용해봤습니다. YAML 파일을 Kubernetes(쿠버네티스) 형식으로 작성해서 Podman으로 실행하는 방식인데, 미래를 생각하면 이쪽이 더 좋겠다 싶더라고요.

    
    # docker-compose.yaml 예시
    version: '3.8'
    services:
      web:
        image: nginx:latest
        ports:
          - "80:80"
        volumes:
          - ./nginx.conf:/etc/nginx/nginx.conf
      db:
        image: postgres:13
        environment:
          POSTGRES_DB: mydb
          POSTGRES_USER: user
          POSTGRES_PASSWORD: password
    
    
    # Docker Compose 실행
    docker-compose up -d
    
    # Podman Play Kube를 위한 YAML 파일 (Kubernetes Pod 정의)
    # web-pod.yaml 예시
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-web-pod
    spec:
      containers:
        - name: nginx-container
          image: nginx:latest
          ports:
            - containerPort: 80
              hostPort: 8082 # Podman에서는 hostPort를 명시해야 외부 노출
        - name: postgres-container
          image: postgres:13
          env:
            - name: POSTGRES_DB
              value: mydb
            - name: POSTGRES_USER
              value: user
            - name: POSTGRES_PASSWORD
              value: password
    
    
    # Podman Play Kube 실행
    podman play kube web-pod.yaml
    podman ps -a
    

    podman play kube는 Kubernetes의 Pod(파드) 개념을 Podman 환경에서 그대로 사용할 수 있게 해줍니다. 나중에 Kubernetes로 전환할 계획이 있다면, 미리 익숙해질 수 있는 좋은 기회가 되죠.

    ⚠️ 삽질 경험: Podman rootless 모드와 포트 바인딩

    제가 Podman을 처음 쓰면서 가장 삽질했던 부분이 바로 루트리스 모드에서의 포트 바인딩(Port Binding)이었어요. podman run -p 80:80 nginx 처럼 80번 같은 특권 포트(Privileged Port, 1024번 이하)를 바인딩하려고 하면 에러가 나더라고요. 처음엔 이게 뭔가 싶었는데, 일반 사용자 계정은 1024번 이하 포트에 바인딩할 권한이 없기 때문이었습니다.

    해결책:

    1. 비특권 포트 사용: 가장 간단한 방법은 8080, 8000처럼 1024번 이상의 비특권 포트(Non-privileged Port)를 사용하는 거예요. podman run -p 8080:80 nginx 이렇게요. 홈랩에서는 보통 이 방법으로 충분합니다.
    2. rootful Podman 사용: 정말 특권 포트를 써야 한다면 sudo podman run -p 80:80 nginx 처럼 루트 권한으로 실행할 수도 있어요. 하지만 이는 루트리스 모드의 장점을 포기하는 것이 되니, 특별한 경우가 아니면 권장하지 않습니다.
    3. sysctl 설정 (주의 필요!): 극히 드물지만, 일반 사용자도 특권 포트를 사용할 수 있도록 시스템 설정을 변경하는 방법도 있어요. sudo sysctl -w net.ipv4.ip_unprivileged_port_start=80 와 같은 명령어를 사용하는데, 보안상 매우 위험하니 절대 따라 하지 마세요. 제 삽질 경험을 공유하는 차원에서만 언급합니다.

    이 외에도 Podman이 systemd와 통합되는 방식이나, SELinux(에스이리눅스)가 활성화된 환경에서는 추가적인 설정이 필요할 수 있어요. 로그를 확인할 때는 journalctl --user -xeu podman.socket 처럼 사용자별 systemd 저널을 보는 것이 도움이 됩니다.

    성능 비교 및 관리 용이성

    자, 그럼 가장 중요한 부분이죠. 성능과 관리 용이성은 어땠을까요? 제가 직접 여러 컨테이너를 띄워놓고 htop, sar, iostat 같은 도구들로 모니터링해봤습니다.

    성능

    솔직히 말하면, 제 홈랩 환경(저사양 미니 PC)에서는 Podman과 Docker 간의 드라마틱한 성능 차이를 벤치마크 수치로 딱 잘라 말하기는 어려웠어요. 하지만 체감적으로 Podman이 약간 더 가볍게 느껴지는 부분은 있었습니다. 특히 시스템 리소스가 제한적인 홈랩 환경에서는 이 작은 차이가 중요할 수 있더라고요.

    • 메모리 사용량 (Memory Usage): Docker는 dockerd라는 데몬이 항상 일정량의 메모리를 점유하고 있어요. Podman은 데몬이 없으니 이 오버헤드(Overhead)가 없습니다. 여러 개의 컨테이너를 띄우지 않는다면 큰 차이가 아닐 수 있지만, 저처럼 컨테이너를 수십 개씩 띄우는 홈랩에서는 무시할 수 없는 부분입니다.
    • CPU 사용량 (CPU Usage): 마찬가지로 데몬의 존재 유무가 CPU 사용량에도 영향을 미칠 수 있어요. 특히 유휴 상태(Idle State)일 때 Podman이 미세하게 더 낮은 CPU 사용률을 보였습니다.
    • I/O 성능 (Disk I/O): 이 부분에서는 큰 차이를 느끼기 어려웠어요. 컨테이너 런타임보다는 기본 스토리지 드라이버나 실제 디스크 성능에 더 큰 영향을 받더라고요.

    결과 해석 기준: 만약 htop에서 `dockerd` 프로세스가 지속적으로 1% 이상의 CPU를 점유하거나, `top` 명령어로 확인했을 때 `VIRT` (Virtual Memory Size) 값이 수백 MB 이상으로 높게 나온다면, 데몬으로 인한 오버헤드를 고려해볼 만해요. 홈랩처럼 리소스가 제한된 환경에서는 이런 작은 수치들이 전체 시스템 안정성에 영향을 줄 수 있거든요.

    홈랩 환경에서 Podman과 Docker 컨테이너의 리소스 사용량을 비교하는 대시보드

    홈랩 환경에서 Podman과 Docker 컨테이너의 CPU, 메모리, 디스크 I/O 사용량을 비교하는 대시보드 스크린샷입니다. Prometheus, Grafana 같은 툴을 활용한 시각화를 보여줍니다.

    관리 용이성

    • 명령어 호환성: Podman은 Docker CLI 명령어와 거의 100% 호환돼요. docker run 대신 podman run이라고만 바꾸면 되니, 기존 Docker 사용자들이 쉽게 적응할 수 있습니다. 이게 진짜 편하더라고요.
    • systemd 통합: Podman은 systemd와 아주 잘 통합돼요. 컨테이너를 systemd 서비스로 등록해서 자동으로 시작하고 관리할 수 있죠. podman generate systemd --name my-nginx-podman > ~/.config/systemd/user/my-nginx-podman.service 이런 식으로 쉽게 서비스 파일을 만들 수 있어서, 서버 재부팅 시 컨테이너를 수동으로 다시 띄울 필요가 없어집니다.
    • Kubernetes 친화적: podman play kube 기능을 통해 Kubernetes YAML 파일을 직접 실행할 수 있다는 점은 향후 클라우드 환경이나 복잡한 오케스트레이션으로 넘어갈 때 큰 강점이 돼요.

    그래서, 홈랩에는 어떤 컨테이너 런타임이 좋을까요?

    저의 13년차 인프라 엔지니어이자 홈랩 운영자로서의 경험을 바탕으로 명확한 결론과 추천을 드려볼게요.

    • Docker를 추천하는 경우:
      • 이미 Docker에 익숙하고, 복잡한 설정 변경을 원치 않는다면: 기존 Docker Compose 파일들이 많고, 커뮤니티 자료나 플러그인 생태계를 그대로 활용하고 싶다면 Docker가 여전히 좋은 선택이에요.
      • Docker Swarm(도커 스웜)을 활용한 간단한 클러스터가 필요하다면: Podman은 Swarm을 직접 지원하지 않아요.
      • 상대적으로 고사양의 서버를 사용하고 데몬 오버헤드가 크게 문제 되지 않는다면: 데몬의 안정성과 광범위한 사용 사례를 그대로 가져갈 수 있습니다.
    • Podman을 추천하는 경우:
      • 보안을 최우선으로 생각하고, 루트리스 컨테이너를 선호한다면: 홈랩 환경에서 보안은 아무리 강조해도 지나치지 않아요. 루트리스 모드는 잠재적인 보안 위협을 크게 줄여줍니다.
      • 시스템 리소스가 제한적인 저사양 홈랩 서버를 운영한다면: 데몬 오버헤드가 없기 때문에 미세하게라도 자원을 더 효율적으로 사용할 수 있어요.
      • 향후 Kubernetes 환경으로 확장할 계획이 있다면: podman play kube를 통해 Kubernetes YAML 파일에 익숙해질 수 있고, Pod 개념을 미리 체험해볼 수 있습니다.
      • systemd와의 긴밀한 통합을 통해 컨테이너 자동화를 하고 싶다면: Podman의 systemd 통합은 컨테이너 관리를 한층 더 편리하게 만들어줍니다.
    Podman과 Docker의 장단점과 홈랩에서의 선택 기준을 요약한 인포그래픽

    Podman과 Docker의 주요 장단점을 비교하고, 홈랩 환경에 적합한 선택 기준을 시각적으로 요약한 인포그래픽입니다.

    개인적으로는 요즘 Podman에 손이 더 많이 갑니다. 특히 루트리스 모드와 systemd 통합이 저에게는 굉장히 매력적이더라고요. 제 홈랩 서버가 그렇게 고사양은 아니라서 리소스 효율성도 무시할 수 없고요. 물론 Docker가 가진 강력한 생태계와 안정성은 여전히 큰 장점이지만, 새로운 기술을 시도하고 실험해보는 홈랩의 재미를 생각하면 Podman은 충분히 도전해볼 가치가 있는 툴입니다.

    여러분도 이 글을 통해 자신의 홈랩 환경에 맞는 컨테이너 런타임을 선택하는 데 도움이 되셨으면 좋겠어요. 다음 글에서는 Podman으로 Nginx와 Let’s Encrypt를 연동해서 HTTPS 웹서버를 구축하는 방법에 대해 더 자세히 다뤄볼 예정이니 기대해주세요! 그때 또 다른 삽질 경험담과 해결책을 공유해드리겠습니다. 🎉

  • [Cloud] Podman vs Docker: Rootless 컨테이너 보안 및 활용 가이드

    [Cloud] Podman vs Docker: Rootless 컨테이너 보안 및 활용 가이드

    Podman vs Docker: Rootless 컨테이너 보안 및 활용 가이드

    인프라 엔지니어의 고민: 더 안전한 컨테이너 운영을 찾아서

    안녕하세요, 13년차 서버실 지킴이입니다. 요즘 인프라 엔지니어라면 컨테이너(Container) 기술을 빼놓고 이야기하기 어렵죠. 저도 처음엔 도커(Docker)가 세상에 나왔을 때, ‘와, 이거 진짜 물건이다!’ 하면서 열광했던 기억이 납니다. 개발 환경부터 운영 환경까지 컨테이너 덕분에 정말 많은 게 편리해졌거든요. 그런데 말입니다, 편리함 뒤에는 늘 그림자가 따르기 마련이더라고요. 특히 보안(Security) 측면에서는 늘 마음 한편이 불안했어요.

    도커 데몬(Docker daemon)이 항상 루트(root) 권한으로 실행된다는 점, 그리고 컨테이너 탈출(Container Escape) 같은 잠재적인 보안 위협들은 저를 계속해서 고민하게 만들었죠. 홈랩(Home Lab)에서 다양한 서비스를 돌리면서 ‘어떻게 하면 좀 더 안전하게 컨테이너를 운영할 수 있을까?’ 하는 고민은 저만의 숙제는 아닐 겁니다. 혹시 여러분도 이런 고민 해보신 적 있으신가요? 이 지점에서 제가 눈여겨보게 된 것이 바로 Podman(팟맨)입니다.

    오늘 글에서는 컨테이너 보안의 새로운 대안으로 떠오른 Podman과 우리가 오랫동안 써왔던 Docker를 비교하고, 특히 Rootless 컨테이너(Rootless Container) 개념을 중심으로 Podman의 장점과 활용법을 자세히 알려드리려고 합니다. 제가 직접 삽질해가며 얻은 경험들을 바탕으로, 여러분의 컨테이너 운영에 도움이 될 만한 실질적인 팁들을 공유해볼게요! 💡

    Podman과 Docker 아키텍처 비교 다이어그램

    Podman과 Docker의 아키텍처 비교. Podman은 데몬 없이 사용자 프로세스로 실행되어 보안 이점을 가집니다.

    Rootless 컨테이너란 무엇인가?

    쉽게 말해, Rootless 컨테이너는 루트(root) 권한 없이, 일반 사용자(non-root user) 권한으로 실행되는 컨테이너를 말합니다. 기존 도커는 도커 데몬(Docker Daemon)이 호스트(Host) 시스템에서 루트 권한으로 실행되고, 이 데몬이 컨테이너를 관리하는 구조였죠. 이게 왜 문제가 되냐면, 만약 컨테이너에 보안 취약점이 있어서 외부 공격자가 컨테이너를 탈출(Escape)하는 데 성공하면, 호스트 시스템의 루트 권한까지 획득할 수 있는 심각한 상황이 발생할 수 있기 때문입니다. ⚠️

    Podman은 태생부터 이런 보안 문제를 염두에 두고 설계되었어요. Podman은 도커와 달리 데몬(Daemon)이 없거든요. 즉, 백그라운드에서 항상 루트 권한으로 돌아가는 프로세스가 없다는 뜻입니다. Podman 명령어를 실행하면, 해당 명령어는 일반 사용자 권한으로 컨테이너를 생성하고 관리하게 됩니다. 처음 이걸 알았을 땐 ‘아, 이거다!’ 싶었거든요. 이렇게 되면 컨테이너를 탈출하더라도 일반 사용자 권한까지만 접근할 수 있으니, 호스트 시스템의 피해를 최소화할 수 있습니다. 보안적인 측면에서 봤을 때 정말 큰 이점이라고 할 수 있어요.

    Podman vs Docker: 핵심 차이점 비교

    Podman과 Docker는 컨테이너를 관리하는 도구라는 공통점이 있지만, 내부적으로는 꽤 많은 차이가 있습니다. 제가 직접 써보면서 느낀 주요 차이점들을 표로 정리해봤어요.

    특징 Podman Docker
    아키텍처 (Architecture) 데몬리스 (Daemonless): 백그라운드 데몬 없음. 사용자 프로세스로 실행. 데몬 기반 (Daemon-based): Docker 데몬이 루트 권한으로 백그라운드 실행.
    루트 권한 (Root Privileges) 기본 Rootless: 일반 사용자 권한으로 컨테이너 실행. 데몬이 루트 권한으로 실행. Rootless 모드는 실험적 또는 부가 기능.
    보안 (Security) 호스트 시스템에 대한 공격 표면(Attack Surface) 감소. 데몬 취약점 발생 시 호스트 시스템 전체 위험.
    이미지 빌드 (Image Build) Buildah(빌다)를 내부적으로 활용 (podman build). Docker Build 엔진 사용 (docker build).
    오케스트레이션 (Orchestration) Kubernetes Pods(쿠버네티스 파드)와 높은 호환성. podman generate kube로 YAML 생성 가능. Docker Swarm(도커 스웜), Docker Compose(도커 컴포즈) 지원.
    명령어 호환성 (CLI Compatibility) 대부분의 docker 명령어와 유사 (podman으로 대체 가능). 표준 Docker CLI.
    Podman vs Docker 핵심 차이점 비교 인포그래픽

    Podman과 Docker의 주요 특징들을 한눈에 비교한 표입니다. 특히 데몬리스 아키텍처와 Rootless 기본 지원이 Podman의 가장 큰 차이점이죠.

    Podman으로 Rootless 컨테이너 실행하기

    그럼 이제 Podman으로 Rootless 컨테이너를 직접 실행해보면서 그 편리함을 느껴볼 시간입니다! 제가 홈랩에서 주로 쓰는 CentOS Stream 9나 Fedora, 또는 Ubuntu 22.04 이상 환경에서는 Podman 설치가 아주 쉬워요.

    1. 팟맨 설치하기

    저는 CentOS Stream 9에서 진행했습니다. 여러분의 OS에 맞게 설치해주세요.

    
    # CentOS/Fedora
    sudo dnf install podman -y
    
    # Ubuntu/Debian
    sudo apt update
    sudo apt install podman -y
    

    설치가 완료되면, podman info 명령어로 잘 설치되었는지 확인해볼 수 있습니다.

    
    podman info
    

    여기서 중요한 건, 루트 권한 없이 실행해도 잘 동작한다는 점이에요! 🎉

    2. Rootless 컨테이너 실행해보기

    가장 기본적인 컨테이너 실행부터 시작해볼까요? Alpine 리눅스 컨테이너를 실행해보겠습니다.

    
    podman run --rm -it alpine sh
    

    컨테이너 내부에서 whoami 명령어를 실행해보면, root로 나올 거예요. ‘어? Rootless라면서 왜 컨테이너 안에서는 root지?’ 하고 저처럼 당황하실 수 있는데, 이건 컨테이너 내부의 루트 사용자가 호스트 시스템의 일반 사용자에 매핑(mapping)되었기 때문입니다. 즉, 컨테이너 안에서는 여전히 강력한 권한을 가지지만, 호스트 시스템에는 아무런 영향을 주지 못하는 ‘가짜 루트’인 셈이죠.

    이제 Nginx 웹 서버를 Rootless로 띄워볼까요?

    
    podman run -d --name my-nginx -p 8080:80 nginx
    

    잘 실행되었는지 확인하고, 웹 브라우저나 curl로 접속해보세요.

    
    podman ps
    curl localhost:8080
    

    정상적으로 Nginx 초기 페이지가 보인다면 성공입니다! ✅

    3. Podman의 파드(Pod) 기능 활용해보기

    Podman은 쿠버네티스(Kubernetes)의 파드(Pod) 개념을 네이티브(Native)하게 지원합니다. 여러 컨테이너가 동일한 네트워크 네임스페이스(Network Namespace)와 저장소(Storage)를 공유해야 할 때 아주 유용하거든요. 제가 이걸 처음 써봤을 때, ‘홈랩에 간이 쿠버네티스를 구축한 느낌인데?’ 하면서 감탄했어요. 🤭

    먼저 파드를 생성합니다.

    
    podman pod create --name my-web-app-pod -p 8080:80
    

    이제 이 파드 안에 Nginx와 다른 컨테이너를 넣어보죠.

    
    podman run -d --pod my-web-app-pod --name webserver nginx
    podman run -d --pod my-web-app-pod --name data-logger alpine sleep 1h
    

    podman pod ps 명령어로 파드와 그 안에 있는 컨테이너들을 확인할 수 있습니다.

    
    podman pod ps
    

    4. 이미지 빌드하기

    Podman은 Dockerfile을 이용한 이미지 빌드도 완벽하게 지원합니다. docker build 대신 podman build를 사용하면 되죠. Dockerfile 예시를 하나 만들어볼게요.

    
    # Dockerfile
    FROM alpine:latest
    RUN apk add --no-cache nginx
    COPY ./index.html /usr/share/nginx/html/index.html
    EXPOSE 80
    CMD ["nginx", "-g", "daemon off;"]
    

    그리고 간단한 index.html 파일도 만들어줍니다.

    
    <!DOCTYPE html>
    <html>
    <head>
        <title>Hello Podman!</title>
    </head>
    <body>
        <h1>Welcome to my Rootless Nginx with Podman!</h1>
    </body>
    </html>
    

    이제 이 두 파일이 있는 디렉토리에서 이미지를 빌드합니다.

    
    podman build -t my-custom-nginx .
    

    빌드된 이미지를 확인하고 실행해보세요.

    
    podman images
    podman run -d --name my-custom-web -p 8080:80 my-custom-nginx
    curl localhost:8080
    
    Podman 이미지 빌드 프로세스 다이어그램

    Podman을 이용한 이미지 빌드 과정입니다. Docker와 거의 동일한 명령어로 편리하게 이미지를 만들 수 있어요.

    Podman 운영 시 주의사항

    제가 Podman을 처음 접하면서 겪었던 몇 가지 ‘삽질’과 그 해결책을 공유합니다. 저처럼 헤매지 마시길 바라요! ㅎㅎ

    1. 낮은 포트(Low Port) 바인딩 문제: Rootless 컨테이너는 기본적으로 1024번 이하의 포트(예: 80, 443)를 직접 바인딩(Binding)할 수 없습니다. 이는 보안상의 이유로 일반 사용자에게 허용되지 않는 권한이거든요. 처음 Nginx를 80번 포트에 바로 연결하려고 했을 때, ‘왜 안 되지?’ 하면서 한참을 헤맸습니다. 😩
      해결책: 가장 쉬운 방법은 -p 8080:80처럼 1024번보다 높은 포트에 바인딩하는 것입니다. 아니면 Nginx나 Apache 같은 리버스 프록시(Reverse Proxy)를 호스트에 설정해서 80번 포트로 들어오는 트래픽을 컨테이너의 8080번 포트로 포워딩(Forwarding)하는 방법도 있어요. (sysctl net.ipv4.ip_unprivileged_port_start=80 같은 설정을 할 수도 있지만, 보안상 권장하지는 않습니다.)

    2. 볼륨 마운트(Volume Mount) 권한 문제: Rootless 컨테이너에서 호스트의 특정 디렉토리를 볼륨으로 마운트할 때 권한 문제가 발생할 수 있어요. 컨테이너 내부의 UID/GID(User ID/Group ID)가 호스트 시스템의 UID/GID와 매핑되는 방식 때문에 생기는 문제인데, /etc/subuid와 /etc/subgid 파일에 정의된 보조 UID/GID 범위가 적절히 설정되어 있지 않으면 문제가 됩니다.
      해결책: 이 파일들을 수동으로 편집하거나, Podman이 자동으로 설정하도록 합니다. 대부분의 경우 Podman 설치 시 자동으로 설정되지만, 가끔 문제가 생기면 이 파일을 확인해보세요. 저도 특정 디렉토리에 로그를 남기려다가 권한 문제로 고생 좀 했어요.

    3. systemd 통합: Podman은 systemd와 아주 잘 통합됩니다. podman generate systemd 명령어를 사용하면 실행 중인 컨테이너나 파드를 systemd 서비스로 등록할 수 있는 유닛(Unit) 파일을 자동으로 생성해줍니다. 이걸 몰랐을 때는 직접 유닛 파일을 만들었는데, 나중에 이 기능을 알고 얼마나 편했는지 몰라요! 🤩

    검증: Rootless 컨테이너로 더 안전한 운영

    Podman으로 Rootless 컨테이너를 운영하면서 제가 가장 크게 느낀 점은 ‘마음의 평화’입니다. 😅 호스트 시스템에 대한 잠재적인 보안 위협이 크게 줄어들기 때문에, 훨씬 안심하고 컨테이너를 돌릴 수 있게 되었거든요. podman ps, podman inspect 같은 명령어로 컨테이너 상태를 확인해보면, 도커와 거의 동일한 방식으로 작동한다는 걸 알 수 있습니다. 단지 실행 주체가 루트가 아닌 일반 사용자라는 것만 다를 뿐이죠.

    특히 ~/.local/share/containers 경로를 확인해보면, 모든 컨테이너 관련 파일들이 일반 사용자 홈 디렉토리 아래에 생성된 것을 볼 수 있어요. 이게 바로 Rootless 컨테이너의 핵심 증거입니다. 👍

    Rootless 컨테이너 보안 이점 다이어그램

    Rootless 컨테이너는 호스트 시스템의 루트 권한으로부터 격리되어 보안을 강화합니다.

    마무리: 언제 Podman을 써야 할까?

    오늘 Podman과 Docker의 차이점, 그리고 Rootless 컨테이너의 중요성에 대해 이야기해봤습니다. Podman은 다음과 같은 상황에서 특히 강력한 대안이 될 수 있다고 생각해요.

    • 보안이 최우선 고려사항일 때: 특히 다중 사용자 환경이나, 호스트 시스템의 보안을 최대한 강화하고 싶을 때 Rootless Podman은 탁월한 선택입니다.
    • 쿠버네티스 환경을 준비 중일 때: Podman은 쿠버네티스 파드 개념을 네이티브하게 지원하고, podman generate kube 같은 명령어로 쉽게 YAML 파일을 생성할 수 있어 쿠버네티스 학습 및 연동에 유리합니다.
    • 경량화된 컨테이너 환경이 필요할 때: 백그라운드 데몬 없이 필요한 시점에만 프로세스가 실행되므로, 리소스 효율성 측면에서도 장점이 있어요.

    물론 Docker도 여전히 막강한 생태계와 성숙한 도구들을 가지고 있습니다. Docker Compose나 Docker Swarm 같은 기능은 아직 Podman보다 더 안정적이고 편리한 측면이 많죠. 따라서 어떤 도구를 선택할지는 여러분의 특정 요구사항과 환경에 따라 달라질 겁니다.

    저의 13년차 경험상, ‘만능 도구’는 없습니다. 하지만 각 도구의 장단점을 정확히 알고 상황에 맞게 사용하는 것이 진정한 엔지니어의 자세라고 생각합니다. Podman은 컨테이너 보안과 효율성을 한 단계 끌어올릴 수 있는 정말 매력적인 도구임은 분명해요. 다음번에는 Podman Compose를 이용한 다중 컨테이너 애플리케이션 배포에 대해 더 깊이 다뤄보도록 하겠습니다. 긴 글 읽어주셔서 감사합니다! 👋