Podman Installation Guide (Podman 설치 가이드)

Podman 설치 가이드

컨테이너 기술은 현대 소프트웨어 개발 및 배포의 핵심입니다. Podman은 도커(Docker)와 유사하게 컨테이너를 관리하는 도구로, 특히 데몬(Daemon) 없이 컨테이너를 실행할 수 있는 "루트리스(Rootless)" 모드를 지원하여 보안성과 유연성을 높입니다. 이 가이드에서는 다양한 운영 체제에 Podman을 설치하고 기본 설정을 하는 방법을 다룹니다.


1. macOS 및 Windows에 Podman 설치

Podman은 macOS와 Windows에서도 리눅스 가상 머신(Podman Machine)을 통해 컨테이너를 실행합니다. Docker API와 호환되어 기존 Docker 도구도 활용 가능합니다.

1.1 macOS

macOS에서는 Podman 설치 관리자를 다운로드하거나 Homebrew를 통해 설치할 수 있습니다.

  • 설치 관리자 (권장):
    Podman 공식 웹사이트(Podman.io) 또는 GitHub 릴리스 페이지에서 직접 설치 파일을 다운로드합니다.

    ![macOS Installer]

  • Homebrew를 통한 설치 (권장하지 않음):
    Homebrew는 커뮤니티 관리 패키지이므로 안정성을 보장하지 않습니다.
    Homebrew가 설치되어 있지 않다면 먼저 설치합니다: Homebrew 설치
    bash brew install podman

설치 후 Podman Machine을 초기화하고 시작합니다.

podman machine init
podman machine start

설치 정보를 확인합니다.

podman info

1.2 Windows

Windows에서는 WSL2(Windows Subsystem for Linux) 배포판을 통해 Podman Machine이 실행됩니다. PowerShell 또는 CMD에서 podman 명령어를 직접 실행할 수 있습니다. 자세한 내용은 Podman for Windows 가이드를 참조합니다.

![Windows WSL2]


2. Linux에 Podman 설치

대부분의 Linux 배포판에서 Podman은 기본 패키지 관리자를 통해 쉽게 설치할 수 있습니다.

2.1 Linux 배포판별 설치

  • Arch Linux & Manjaro Linux:

    sudo pacman -S podman
    

    루트리스 모드 문제 발생 시 Arch Wiki 참조.

  • Alpine Linux:

    sudo apk add podman
    
  • CentOS Stream 9+:

    sudo dnf -y install podman
    
  • Debian 11 (Bullseye) 이상:

    sudo apt-get -y install podman
    
  • Fedora:

    sudo dnf -y install podman
    

    podman machine 명령어 사용을 위해 다음도 설치합니다.

    sudo dnf -y install podman-machine
    

    루트리스 네트워킹을 위해 slirp4netns 설치를 권장합니다.

    sudo dnf -y install slirp4netns
    
  • Fedora CoreOS, Fedora Silverblue:
    내장되어 있어 별도 설치가 필요 없습니다.

  • Gentoo:

    sudo emerge app-containers/podman
    
  • openSUSE:

    sudo zypper install podman
    
  • openSUSE Kubic:
    내장되어 있어 별도 설치가 필요 없습니다.

  • Raspberry Pi OS arm64 (beta):
    Debian과 동일한 절차를 따릅니다.

  • RHEL:
    Red Hat 공식 문서를 참조합니다.

  • Ubuntu 20.10 이상:

    # Ubuntu 20.10 이상
    sudo apt-get update
    sudo apt-get -y install podman
    
  • Linux Mint:
    Ubuntu (또는 LMDE 사용 시 Debian) 설치 단계를 따릅니다.

2.2 개발 버전 및 최신 버전 설치

  • Fedora 개발 버전:
    updates-testing 저장소를 통해 최신 Podman을 테스트할 수 있습니다.
    bash sudo dnf update --refresh --enablerepo=updates-testing podman
  • 최신(Bleeding-edge) 버전:
    Fedora, CentOS Stream 9+, RHEL 9+에서 main 브랜치 기반의 최신 빌드를 설치합니다. (주의: 프로덕션 환경에 권장되지 않음)
    bash sudo dnf copr enable rhcontainerbot/podman-next -y sudo dnf install podman

3. FreeBSD 14.0에 Podman 설치

FreeBSD용 Podman은 실험 단계이므로 평가 및 테스트 목적으로만 사용합니다.

pkg install podman

buildah, skopeo 등 추가 패키지를 원하면 podman-suite 메타 패키지를 설치합니다.

3.1 초기 설정

fdescfs(5)/dev/fd에 마운트해야 합니다.

mount -t fdescfs fdesc /dev/fd

재부팅 후에도 유지하려면 /etc/fstab에 다음 줄을 추가합니다.

fdesc   /dev/fd         fdescfs         rw      0       0

재부팅 후 Podman을 시작하려면:

service podman enable

3.2 네트워킹

컨테이너 네트워킹은 PF 방화벽을 사용하여 NAT를 설정해야 합니다.

cp /usr/local/etc/containers/pf.conf.sample /etc/pf.conf

/etc/pf.conf를 편집하여 v4egress_if, v6egress_if 변수를 네트워크 인터페이스에 맞게 설정합니다.
PF를 활성화하고 시작합니다.

service pf enable
service pf start

컨테이너 호스트에서 컨테이너 내부 서비스로 연결을 리다이렉트하려면 (FreeBSD 13.3 이상):

echo 'pf_load="YES"' >> /boot/loader.conf
kldload pf
sysctl net.pf.filter_local=1
echo 'net.pf.filter_local=1' >> /etc/sysctl.conf.local
service pf restart

/etc/pf.conf에 다음 줄이 포함되어야 합니다.

nat-anchor "cni-rdr/*"

이제 호스트에서 localhost:1234로 컨테이너 내부의 HTTP 서비스에 접근할 수 있습니다.

fetch -o- http://$(hostname):1234
# 또는
fetch -o- http://localhost:1234

3.3 스토리지

컨테이너 이미지 및 관련 상태는 /var/db/containers에 저장됩니다. ZFS 사용을 권장합니다.

zfs create -o mountpoint=/var/db/containers zroot/containers

ZFS를 사용할 수 없으면 storage.confvfs 스토리지 드라이버로 변경합니다.

sed -I .bak -e 's/driver = "zfs"/driver = "vfs"/' /usr/local/etc/containers/storage.conf

3.4 검증

설치 후 다음 명령어로 기본 이미지를 실행하여 확인할 수 있습니다.

podman run --rm docker.io/dougrabson/hello

3.5 Linux 에뮬레이션

FreeBSD의 Linux 에뮬레이션을 사용하여 Linux 컨테이너 이미지를 실행할 수 있습니다.

sudo sysrc linux_enable=YES
sudo service linux start
sudo podman run --rm --os=linux docker.io/library/alpine cat /etc/os-release | head -1
NAME="Alpine Linux"

4. 소스 코드에서 빌드

일부 환경에서는 Podman을 소스 코드에서 직접 빌드해야 할 수 있습니다.

4.1 빌드 및 실행 종속성

  • Fedora:
    bash # 빌드 종속성 설치 sudo dnf -y builddep rpm/podman.spec # 런타임 종속성 설치 sudo dnf -y install catatonit conmon containers-common-extra
  • RHEL 및 CentOS Stream:
    dnf-builddep 설치 후 다음 명령어를 사용합니다.
    bash sudo dnf -y install 'dnf-command(builddep)' # CentOS Stream 9+ 빌드 종속성 sudo dnf -y builddep rpm/podman.spec --enablerepo=crb # RHEL 9+ 빌드 종속성 sudo dnf -y builddep rpm/podman.spec --enablerepo=codeready-builder-for-rhel-$(rpm --eval %{?rhel})-$(uname -m)-rpms # 런타임 종속성 설치 sudo dnf -y install \ conmon \ containers-common \ crun \ iptables \ netavark \ nftables \ slirp4netns
  • Debian, Ubuntu:
    bash sudo apt-get install \ btrfs-progs \ gcc \ git \ golang-go \ go-md2man \ iptables \ libassuan-dev \ libbtrfs-dev \ libc6-dev \ libdevmapper-dev \ libglib2.0-dev \ libgpgme-dev \ libgpg-error-dev \ libprotobuf-dev \ libprotobuf-c-dev \ libseccomp-dev \ libselinux1-dev \ libsystemd-dev \ make \ netavark \ passt \ pkg-config \ runc \ uidmap
    (참고: netavark가 없으면 containernetworking-plugins를 설치합니다.)
  • openSUSE Leap 15.x 및 Tumbleweed:
    bash sudo zypper -n in libseccomp-devel libgpgme-devel
  • Manjaro (및 기타 Linux 배포판):
    커널이 사용자 네임스페이스를 지원하는지 확인합니다.
    zgrep CONFIG_USER_NS /proc/config.gz CONFIG_USER_NS=y
    사용자 네임스페이스를 활성화합니다.
    sudo sysctl kernel.unprivileged_userns_clone=1
    영구적으로 활성화하려면:
    echo 'kernel.unprivileged_userns_clone=1' > /etc/sysctl.d/userns.conf

4.2 누락된 종속성 빌드

  • golang:
    go version이 1.16.x 이상인지 확인합니다. (최소 요구 버전은 go.mod 파일에서 확인)
    bash export GOPATH=~/go git clone https://go.googlesource.com/go $GOPATH cd $GOPATH cd src ./all.bash export PATH=$GOPATH/bin:$PATH
  • conmon:
    bash git clone https://github.com/containers/conmon cd conmon export GOCACHE="$(mktemp -d)" make sudo make podman
  • crun / runc:
    runc --versionspec: 1.0.1 이상인지 확인합니다.
    bash git clone https://github.com/opencontainers/runc.git $GOPATH/src/github.com/opencontainers/runc cd $GOPATH/src/github.com/opencontainers/runc make BUILDTAGS="selinux seccomp" sudo cp runc /usr/bin/runc

4.3 설정 추가

sudo mkdir -p /etc/containers
sudo curl -L -o /etc/containers/registries.conf https://raw.githubusercontent.com/containers/image/main/registries.conf
sudo curl -L -o /etc/containers/policy.json https://raw.githubusercontent.com/containers/image/main/default-policy.json

4.4 소스 코드 가져오기 및 빌드

go version이 1.16.x 이상인지 확인 후 다음을 실행합니다.

git clone https://github.com/containers/podman/
cd podman
make BUILDTAGS="selinux seccomp" PREFIX=/usr
sudo env PATH=$PATH make install PREFIX=/usr
  • 빌드 태그:
    필요에 따라 BUILDTAGS 변수를 설정하여 특정 기능을 활성화/비활성화할 수 있습니다.
    예시:
    bash make BUILDTAGS='seccomp apparmor'
    RHEL8에서 btrfs 지원 없이 빌드하려면:
    bash make BUILDTAGS="btrfs_noversion exclude_graphdriver_btrfs"
    참고: exclude_graphdriver_devicemapper 태그는 필수입니다.

5. 설정 파일

Podman은 여러 설정 파일을 사용하여 동작을 제어합니다.

5.1 registries.conf

unqualified-search-registries 항목은 이미지 이름을 registry나 도메인 없이 지정했을 때 어떤 컨테이너 레지스트리를 검색할지 순서를 지정합니다. 보안을 위해 완전히 신뢰할 수 있는 레지스트리만 추가해야 합니다.

  • 경로: /etc/containers/registries.conf
  • macOS 또는 Windows의 Podman Machine에서는 podman machine ssh로 접속하여 /etc/containers/registries.conf를 편집합니다.

5.2 mounts.conf

podman run 또는 podman build 실행 시 컨테이너 내부에 자동으로 마운트될 볼륨 마운트 디렉토리를 지정합니다.

  • 경로: /usr/share/containers/mounts.conf/etc/containers/mounts.conf
  • 예시: /usr/share/rhel/secrets:/run/secrets (Red Hat Enterprise Linux 구독 정보를 컨테이너 내에서 사용)

5.3 seccomp.json

컨테이너 내부에서 허용되는 seccomp(보안 컴퓨팅 모드) 규칙의 화이트리스트를 포함합니다. 일반적으로 containers-common 패키지에서 제공합니다.

  • 경로: /usr/share/containers/seccomp.json

5.4 policy.json

이미지 서명 및 신뢰 정책을 정의합니다.

  • 경로: /etc/containers/policy.json
  • 예시:
    json { "default": [ { "type": "insecureAcceptAnything" } ], "transports": { "docker-daemon": { "": [{"type":"insecureAcceptAnything"}] } } }

이 가이드가 Podman 설치 및 설정에 도움이 되기를 바랍니다.

댓글