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.conf
를 vfs
스토리지 드라이버로 변경합니다.
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 --version
이spec: 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 설치 및 설정에 도움이 되기를 바랍니다.
댓글
댓글 쓰기