rootless podmanの初期設定
한국어 원문으로 표시합니다.
목표
전용 사용자 podster 를 위한 rootless podman 환경을 처음부터 구성하고, podman info 로 검증합니다.
왜 중요한가
rootless podman 은 설치보다 설정이 본론입니다. /etc/subuid 대역이 없으면 단일 UID 모드로 조용히 폴백해 특정 이미지에서만 권한 오류가 나고, 그 원인을 찾는 데 며칠이 걸립니다. graphroot 를 확인하지 않으면 홈 파티션이 차서 서비스가 멈춥니다. unqualified-search-registries 를 안 넣으면 docker 에서 잘 돌던 스크립트가 podman 에서 이미지를 못 찾습니다.
이 실습의 체크리스트는 실무에서 새 서버에 rootless podman 을 세울 때 그대로 쓰는 순서입니다.
단계
/root/pod디렉터리를 만들고, 사용자podster의uid gid 홈경로를 공백으로 구분해 한 줄로/root/pod/user.txt에 적으세요./etc/subuid에podster에게 시작 100000, 개수 65536 대역을 배정하세요./etc/subgid에도 같은 대역을 배정하세요./root/pod/mapping.txt를 다음 3줄로 만드세요.CONTAINER_0=<컨테이너 안 UID 0 에 대응하는 호스트 UID>/CONTAINER_1=<컨테이너 안 UID 1 의 호스트 UID>/CONTAINER_1000=<컨테이너 안 UID 1000 의 호스트 UID>/home/podster/.config/containers/storage.conf를 만드세요.[storage]섹션에driver,runroot,graphroot세 키가 있어야 하고,graphroot는/home/podster/.local/share/containers/storage여야 합니다. 파일 소유자는podster여야 합니다./home/podster/.config/containers/registries.conf를 만드세요.unqualified-search-registries에docker.io가 포함돼야 하고,docker.io를 사내 미러mirror.labhub.local/dockerhub로 보내는[[registry]]블록이 있어야 합니다. 파일 소유자는podster여야 합니다.podster권한으로podman info를 실행해 결과를/root/pod/info.json으로 저장하세요. JSON 형식이어야 하고graphRoot값이 5번에서 지정한 경로여야 합니다./root/pod/checklist.txt를 다음 5줄로 만드세요.SUBUID=yes/SUBGID=yes/ROOTLESS=<info 의 rootless 값 true/false>/GRAPHROOT=<info 의 graphRoot 값>/DRIVER=<info 의 스토리지 드라이버 이름>
참고
- subuid 배정은
usermod --add-subuids 100000-165535 podster또는/etc/subuid에 한 줄 추가로 합니다. - 사용자 권한 실행은
su - podster -c 'podman info --format json'형태입니다. - JSON 파싱에는
jq를 쓸 수 있습니다. 예:jq -r '.store.graphRoot' /root/pod/info.json - 설정 디렉터리를 만든 뒤
chown -R podster:podster /home/podster/.config를 잊지 마세요. - 흔한 실수 1: 4번에서 컨테이너 UID 1 을 100001 로 계산하는 경우. 대역의 첫 값이 UID 1 에 대응합니다.
- 흔한 실수 2: 설정 파일을 root 소유로 만들어 podster 가 못 읽는 경우.
대상 사용자 확인
/root/pod 디렉터리를 만들고, 사용자 podster 의 uid gid 홈경로 를 공백으로 구분해 한 줄로 /root/pod/user.txt 에 적으세요.
id 명령으로 uid, gid, 홈 디렉터리를 확인할 수 있습니다. getent passwd 도 유용합니다.
subuid 대역 배정
/etc/subuid 에 podster 에게 시작 100000, 개수 65536 대역을 배정하세요.
형식은 사용자:시작UID:개수 입니다. usermod 로도, 파일 직접 편집으로도 가능합니다.
subgid 대역 배정
/etc/subgid 에도 같은 대역을 배정하세요.
subuid 와 같은 형식입니다. GID 도 같은 이유로 대역이 필요합니다.
매핑 계산
/root/pod/mapping.txt 를 다음 3줄로 만드세요.
CONTAINER_0=<컨테이너 안 UID 0 에 대응하는 호스트 UID> / CONTAINER_1=<컨테이너 안 UID 1 의 호스트 UID> / CONTAINER_1000=<컨테이너 안 UID 1000 의 호스트 UID>
컨테이너 안 UID 0 은 사용자 본인에게 매핑되고 1부터가 대역의 시작입니다. 오프셋을 조심하세요.
storage.conf 작성
/home/podster/.config/containers/storage.conf 를 만드세요. [storage] 섹션에 driver, runroot, graphroot 세 키가 있어야 하고, graphroot 는 /home/podster/.local/share/containers/storage 여야 합니다. 파일 소유자는 podster 여야 합니다.
사용자별 설정은 홈 아래 .config/containers 에 둡니다. [storage] 섹션에 세 키가 필요합니다.
registries.conf 작성
/home/podster/.config/containers/registries.conf 를 만드세요. unqualified-search-registries 에 docker.io 가 포함돼야 하고, docker.io 를 사내 미러 mirror.labhub.local/dockerhub 로 보내는 [[registry]] 블록이 있어야 합니다. 파일 소유자는 podster 여야 합니다.
unqualified 검색 목록은 배열이고, 미러는 [[registry]] 블록으로 씁니다. prefix 와 location 이 짝입니다.
podman info 로 검증
podster 권한으로 podman info 를 실행해 결과를 /root/pod/info.json 으로 저장하세요. JSON 형식이어야 하고 graphRoot 값이 5번에서 지정한 경로여야 합니다.
그 사용자 권한으로 실행해야 사용자별 설정이 반영됩니다. su - 로 로그인 셸을 여는 편이 안전합니다.
초기 설정 체크리스트
/root/pod/checklist.txt 를 다음 5줄로 만드세요.
SUBUID=yes / SUBGID=yes / ROOTLESS=<info 의 rootless 값 true/false> / GRAPHROOT=<info 의 graphRoot 값> / DRIVER=<info 의 스토리지 드라이버 이름>
앞 단계에서 확인한 실제 값들을 모으세요. 경로는 절대 경로로 적습니다.