Podman Concept
Podman Concept
소개
Podman은 Pod Manager Tool의 약자로(POD 관리자) 컨테이너 및 이미지, 컨테이너에 탑재된 볼륨, 컨테이너 그룹으로 만든 포드를 관리하기 위한 OCI 표준으로써 RedHat Enterpise Linux 8 / CentOS 8부터는 Docker 대신 Podman Pod라고 하는 컨테이너 및 컨테이너 그룹을 관리할 수 있는 libpod 라이브러리 기반으로 동작합니다.
공식문서: What is Podman? — Podman documentation
Podman O/S별 설치 명령 Podman Installation | Podman
- Mac
brew install podman podman machine init podman machine start podman info
- CentOS7
sudo yum -y install podman
- Ubuntu
# Ubuntu 20.10 and newer sudo apt-get -y update sudo apt-get -y install podman
- RHEL7
sudo subscription-manager repos --enable=rhel-7-server-extras-rpms sudo yum -y install podman
- RHEL8
sudo yum module enable -y container-tools:rhel8 sudo yum module install -y container-tools:rhel8
- Debian
sudo apt-get -y install podman
- Fedora
sudo dnf -y install podman
Podman 장점
- Daemon을 사용하지 않음으로써 SPOF의 발생이 없다.
- fork/exec 방식으로 동작하므로 컨테이너의 안정적인 실행
- root 권한 불필요
- kubernetes와의 상호작용(kubernetes yaml 생성, kubernetes에 구동중인 Pod 디버깅 등)
Podman 저장소 설정
- 아래 경로에 [registries.search]에 적힌 배열 순서대로 image를 검색한다.
- docker.io에서 검색
- 10.60.100.70:5000 사설 레지스트리 검색
- 10.60.100.70:30001 두 번째 사설 레지스트리 검색
/etc/containers/registries.conf [registries.search] registries = ['docker.io', '10.60.100.70:5000', '10.60.100.70:30001'] [registries.insecure] #registries = ['10.60.100.70:5000']
- 해당 저장소에 어떤 image가 저장되어 있는지 보려면 다음의 명령어를 입력한다.
podman search docker.io podman search 10.60.100.70:5000/ podman search 10.60.100.70:30001/
- 유효하지 않는 ID/PW error가 발생하면 다음 경로에서 해당 파일을 열어 로그인해준다.
ERRO[0000] error getting search results from v2 endpoint "10.60.100.70:30001": unable to retrieve auth token: invalid username/password: unauthorized: authentication required /etc/kubernetes/addon/registry cat dockerconfigjson.txt {"auths":{"10.60.100.70:5000":{"username":"accregistry","password":"yW0Rc95A5dsaOBCD","auth":"YWNjcmVnaXN0cnk6eVcwUmM5NUE1ZHNhT0JDRA=="}}}
설정 문서: image/containers-registries.conf.5.md at main · containers/image
Docker와 차이점
Docker
- 애플리케이션을 빌드하고 컨테이너화를 위한 Docker Engine
- 컨테이너 이미지를 배포하고 제공하기 위한 Dcoker Registry
- 여러 개의 컨테이너를 app으로 정의하고 실행하기 위한 Docker Compose
- 사용자의 로컬 컴퓨터나 클라우드 인스턴스에 도커 호스트를 구성하는 Docker Machine
- 컨테이너 클러스터링 및 스케줄링을 위한 Docker Swarm
docker는 위의 작업들을 Docker Daemon을 통해 수행된다.
그렇기에 Docker Daemon에 문제가 발생하면, Dokcer와 관련된 유틸리티 사용에 어려움이 따른다.
docker show는 다음 링크에서 볼 수 있다.
The future of Linux Containers
Podman
Podman은 Docker와 달리 Daemon이 존재하지 않고, 커맨드로 레지스트리로부터 이미지를 받아와 저장하고,해당 이미지를 사용하여 컨테이너를 실행한다.
즉, 이미지 레지스트리, 컨테이너 및 이미지 저장소와 직접 상호작용한다고 볼 수 있다.
이때 사용하는 것이 Podman 라이브러리로 컨테이너 간에 서로 영향을 주지 않고 동작한다.
※ Docker와 Podman의 가장 큰 차이점은 Daemon의 유무로 볼 수 있다.
Podman Commands
podman ps -a # 모든 컨테이너 조회 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8014c3714ba1 docker.io/library/ubuntu:18.04 bash 42 hours ago Exited (0) 42 hours ago nice_margulis f00cc012fbd6 docker.io/library/centos:7 /bin/bash 45 hours ago Up 45 hours ago friendly_bell 00bb4f48064e localhost/accordion/registry:2 /etc/docker/regis... 11 days ago Up 4 days ago registry podman exec -it [컨테이너 ID] # 컨테이너 내부로 접속 podman run -it [이미지 ID] # 컨테이너 생성, 시작, 접속 - ex) podman run -it ubuntu:18.04 podman run -d [이미지 ID] # 컨테이너 백그라운드 실행 - ex) podman run -d ubuntu:18.04 podman pull [이미지 ID] # 이미지 pull - ex) podman pull centos: podman images # pull 받은 이미지 확인 podman create [컨테이너ID] # 컨테이너 생성 - ex) podman create centos: podman start [컨테이너ID] # 컨테이너 시작 - ex) podman start centos: podman attach [컨테이너ID] # 컨테이너 접속 - ex) podman attach centos:8 podman inspect [컨테이너ID] # 상세설명 확인 podman volume ls # 볼륨 목록 확인 podman volume create [이름] # 볼륨 생성 podman network ls # 네트워크 목록 확인 podman network create [이름] # 네트워크 생성 podman rm -f [컨테이너ID] # 동작중인 컨테이너 삭제 podman rmi -f [이미지 ID] # pull 받은 이미지 삭제 podman logs [컨테이너ID] # 컨테이너 log 확인
이슈
prune –filter 옵션 미지원(Podman 1.7.0 이하 버전)
[이슈 발견]
- 환경
podman version 1.6.4
- 현상
- podman prune –filter 옵션 미지원
podman container prune --help Remove all stopped containers Description: podman container prune Removes all exited containers Usage: podman container prune [flags] Flags: -f, --force Force removal of a running container. The default is false
docker 19.03.5 버전을 설치 후 동일 명령 입력 시 –filter라는 옵션 확인가능
docker container prune --help Usage: docker container prune [OPTIONS] Remove all stopped containers Options: --filter filter Provide filter values (e.g. 'until=<timestamp>') -f, --force Do not prompt for confirmation
[원인]
- podman v1.7 이하 사용
[해결방안]
- github podman 릴리즈 노트에는 v1.7.0-RC1에 –filter 플래그를 지원
- podman v1.7 이상 사용
podman 릴리즈노트: Releases · containers/podman
Podman builds bad container images: invalid tar header error 이슈
1826559 – Podman builds bad container images: invalid tar header error
[이슈 발견]
- 환경
podman version 1.6.4
- 현상
- podman으로 build한 image가 kubernetes에서 인식이 안되는 현상
- 2021. 1. 21 유형욱 사원님의 소방공제회 이슈로, Podman으로 build시 일부 layer를 찾지 못하는 이슈 발생
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m28s default-scheduler Successfully assigned focu-ops/www-5c55fdb5f7-jsdvf to fcuiw3 Normal Pulling 7m11s kubelet Pulling image "192.168.200.100:5000/apm-agent:2.6.1" Normal Pulled 7m11s kubelet Successfully pulled image "192.168.200.100:5000/apm-agent:2.6.1" in 54.623716ms Normal Created 7m11s kubelet Created container apm-agent Normal Started 7m10s kubelet Started container apm-agent Normal Pulled 7m9s kubelet Container image "192.168.200.100:30001/accregistry/www-8b72c018-9c556be5:15" already present on machine Normal Created 7m9s kubelet Created container war Normal Started 7m9s kubelet Started container war Warning Failed 7m8s kubelet Failed to pull image "192.168.200.100:5000/wildfly24-focu:jre8-v2": rpc error: code = Unknown desc = failed to pull and unpack image "192.168.200.100:5000/wildfly24-focu:jre8-v2": failed to extract layer sha256:613be09ab3c0860a5216936f412f09927947012f86bfa89b263dfa087a725f81: mount callback failed on /var/lib/containerd/tmpmounts/containerd-mount921807804: archive/tar: invalid tar header: unknown Warning Failed 6m52s kubelet Failed to pull image "192.168.200.100:5000/wildfly24-focu:jre8-v2": rpc error: code = Unknown desc = failed to pull and unpack image "192.168.200.100:5000/wildfly24-focu:jre8-v2": failed to extract layer sha256:613be09ab3c0860a5216936f412f09927947012f86bfa89b263dfa087a725f81: mount callback failed on /var/lib/containerd/tmpmounts/containerd-mount220043507: archive/tar: invalid tar header: unknown Warning Failed 6m26s kubelet Failed to pull image "192.168.200.100:5000/wildfly24-focu:jre8-v2": rpc error: code = Unknown desc = failed to pull and unpack image "192.168.200.100:5000/wildfly24-focu:jre8-v2": failed to extract layer sha256:613be09ab3c0860a5216936f412f09927947012f86bfa89b263dfa087a725f81: mount callback failed on /var/lib/containerd/tmpmounts/containerd-mount228104681: archive/tar: invalid tar header: unknown Warning Failed 6m26s (x3 over 7m8s) kubelet Error: ErrImagePull Normal BackOff 5m58s (x4 over 7m7s) kubelet Back-off pulling image "192.168.200.100:5000/wildfly24-focu:jre8-v2" Normal Pulling 5m45s (x4 over 7m9s) kubelet Pulling image "192.168.200.100:5000/wildfly24-focu:jre8-v2" Warning Failed 2m3s (x20 over 7m7s) kubelet Error: ImagePullBackOff
- crictl 명령으로는 실패
- podman pull 명령을 통해 받아올 수 있음
[root@fcuiw3 containers]# crictl pull 192.168.200.100:5000/wildfly24-focu:jre8-v2 FATA[0001] pulling image failed: rpc error: code = Unknown desc = failed to pull and unpack image "192.168.200.100:5000/wildfly24-focu:jre8-v2": failed to extract layer sha256:613be09ab3c0860a5216936f412f09927947012f86bfa89b263dfa087a725f81: mount callback failed on /var/lib/containerd/tmpmounts/containerd-mount189950891: archive/tar: invalid tar header: unknown [root@fcuiw3 containers]# podman pull 192.168.200.100:5000/wildfly24-focu:jre8-v2 Trying to pull 192.168.200.100:5000/wildfly24-focu:jre8-v2... Getting image source signatures Copying blob 21288346767d done Copying blob 9af90439f63c done Copying blob 2b2f96f81b05 done Copying blob abd1e48df6c5 done Copying blob cd947dac491c done Copying blob 11284a0709aa done Copying blob 4ed6b0d0ef8d done Copying blob 6d567a1e07fc done Copying blob 50c2788fc50e done Copying blob 40f68e47e76e done Copying blob 73c039b4dac9 done Copying blob 4939d1c28683 done Copying blob 06328477ad18 done Copying blob 241211dbe87b done Copying blob 6f477c92c13d done Copying config 70150cbd58 done Writing manifest to image destination Storing signatures 70150cbd58b0ab4032b1a1a8e9591a06acadd01ba45b863eff986aa94b00082a
[원인]
- 재현이 되지않아 원인불명(2022. 02. 21)
[해결방안]
- docker 명령을 통한 build
- buildah 명령을 통한 build
- –format docker 옵션 사용
–format docker: 이미지의 manifest 및 구성 데이터의 형식을 제어하는 명령어로 OCI(기본값) 와 docker가 존재한다.
Buildah에서 생성된 이미지는 기본적으로 OCI 형식이며, ONBUILD 명령을 지원하지 않는다.
OCI 형식은 --format=docker
옵션으로 Docker 형식을 지정하거나 BUILDAH_FORMAT 환경 변수를 ‘docker’로 설정하여 Buildah에서 재정의할 수 있다.(export BUILDAH_FORMAT=docker
)
buildah/03-on-build.md at main · containers/buildah
※ 관련 링크: 1826559 – Podman builds bad container images: invalid tar header error
위의 Podman은 container image 관리에 초점을 맞추어 개발되었다. 그러면 어떤 툴로 build를 해야할까?
CRI-O 프로젝트로 나온 툴들 중 buildah를 사용하면 된다.
CRI-O 프로젝트에 대한 자세한 설명은 다음 링크에 자세히 나와있다.
CRI-O : Kubernetes 를 위한 표준 컨테이너 런타임 – Opennaru, Inc. buildah
소개
Buildah는 CRI-O에서 image를 build 할 때 docker의 종속성을 제거하기 위해 개발되었으며 Dockerfile 없이 다른 스크립트 언어를 사용해 컨테이너 이미지를 빌드하는 것을 목표로 한다.
(Dockerfile도 당연히 지원)
OCI 컨테이너 이미지에서 build 와 push 역할을 맡은 툴로 개발되었다.
※ 공식문서: Buildah
설치 buildah/install.md at main · containers/buildah
- CentOS7
sudo yum -y install buildah
- Debian
sudo apt-get update sudo apt-get -y install buildah
- Fedora
sudo dnf -y install buildah
- openSUSE
sudo zypper install buildah
- RHEL7
sudo subscription-manager repos --enable=rhel-7-server-extras-rpms sudo yum -y install buildah
- Ubuntu
# Ubuntu 20.10 and newer sudo apt-get -y update sudo apt-get -y install buildah
dockerfile의 onbuild 명령 테스트
아래와 같은 간단한 예제를 생성한다.
cat << EOF > Dockerfile FROM fedora:latest RUN touch /foo ONBUILD RUN touch /bar EOF
- buildah를 사용한 build 명령을 사용한다.
buildah build-using-dockerfile -t onbuild-image --format=docker -f Dockerfile . STEP 1: FROM fedora:latest STEP 2: RUN touch /foo STEP 3: ONBUILD RUN touch /bar STEP 4: COMMIT onbuild-image Getting image source signatures Copying blob 389adea752cd skipped: already exists Copying blob 32aaaa9276c4 done Copying config 1236c96869 done Writing manifest to image destination Storing signatures 1236c96869b9e33c53f0249ab3d2cf2c5de07d7675c4258ff7fb38af4b686983 1236c96869b9e33c53f0249ab3d2cf2c5de07d7675c4258ff7fb38af4b686983
- –format=docker 라는 명령어가 존재하지 않으면, ONBUILD 명령에서 오류가 발생한다.
buildah bud -t onbuild-image -f Dockerfile . STEP 1: FROM fedora:latest STEP 2: RUN touch /foo STEP 3: ONBUILD RUN touch /bar STEP 4: COMMIT onbuild-image ERRO ONBUILD is not supported for OCI image format, RUN touch /bar will be ignored. Must use `docker` format
- bud 와 build-using-dockerfile은 동일한 명령이다.
- dockerfile에서 onbuild 명령을 사용할 시 ‘–format=docker’ 옵션을 준다.
Related articles
Replacing Docker with Podman – Power of Podman
Introduction — Podman documentation
podman 4.0.0
- podman 4.0.0은 github 파일을 build 해야한다.(Podman Installation | Podman )
podman version Client: Podman Engine Version: 4.0.0-dev API Version: 4.0.0-dev Go Version: go1.16.12 Git Commit: f4d6e8777213880204ccbce92201c47c74b33036 Built: Mon Mar 7 09:34:13 2022 OS/Arch: linux/amd64
- 설치 환경
root@localhost /etc/containers # cat /etc/*release CentOS Linux release 8.5.2111 NAME="CentOS Linux" VERSION="8" ID="centos" ID_LIKE="rhel fedora" VERSION_ID="8" PLATFORM_ID="platform:el8" PRETTY_NAME="CentOS Linux 8" ANSI_COLOR="0;31" CPE_NAME="cpe:/o:centos:centos:8" HOME_URL="https://centos.org/" BUG_REPORT_URL="https://bugs.centos.org/" CENTOS_MANTISBT_PROJECT="CentOS-8" CENTOS_MANTISBT_PROJECT_VERSION="8" CentOS Linux release 8.5.2111 CentOS Linux release 8.5.2111
podman 4.0.0 릴리즈노트(Releases · containers/podman )
podman image prune
명령에--external
명령을 줘서 buildah 등 외부에서 생성한 컨테이너를 정리할 수 있다.
podman image prune --external Options: -a, --all Remove all images not in use by containers, not just dangling ones --external Remove images even when they are used by external containers (e.g., by build containers) --filter stringArray Provide filter values (e.g. 'label=<key>=<value>') -f, --force Do not prompt for confirmation
podman inspect
명령에 컨테이너 체크포인트 또는 복원 시기에 대한 정보와 체크포인트/복원 로그 경로를 포함하여 체크포인트 및 복원된 컨테이너에 대한 추가 출력 필드를 지원한다.
root@localhost ~ # podman inspect 363 | grep -i check "CheckpointedAt": "0001-01-01T00:00:00Z",
podman secret
명령으로 컨테이너에 사용될 secret을 생성할 수 있다.(Exploring the new Podman secret command )
podman create secret [OPTION_1] [OPTION_2]
podman load
명령으로 https 파일을 받아올 수 있다.
root@localhost ~/test # podman load -i https://mail.aegee.org/oci-images/ldap-2021-09-11.tar Getting image source signatures Copying blob bc523d70bbe7 done Copying config f0937f9440 done Writing manifest to image destination Storing signatures Loaded image(s): localhost/2021-09-11:latest root@localhost ~/test # podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/2021-09-11 latest f0937f9440d3 5 months ago 6.34 MB
podman volume bind
옵션을 root가 아니여도 사용할 수 있다.
podman volume create -o type=bind -o device=/tmp mytmp podman inspect mytmp [ { "Name": "mytmp", "Driver": "local", "Mountpoint": "/var/lib/containers/storage/volumes/mytmp/_data", "CreatedAt": "2022-03-07T10:52:58.9208475+09:00", "Labels": {}, "Scope": "local", "Options": { "device": "/tmp", "type": "bind" }, "MountCount": 0, "NeedsCopyUp": true, "NeedsChown": true } ]
podman system reset
명령으로 볼륨, 파드, 컨테이너 이미지, 네트워크 전부 삭제할 수 있다.
root@localhost ~ # podman system reset WARNING! This will remove: - all containers - all pods - all images - all networks - all build cache Are you sure you want to continue? [y/N] y A storage.conf file exists at /etc/containers/storage.conf You should remove this file if you did not modify the configuration.
podman volume rm --force
으로 실행 중인 볼륨에 종속된 컨테이너를 제거한다(이전에는 중지된 컨테이너만 제거함).podman saerch
에 사용되는--no-trunc
명령이 기본값으로True
로 적용된다.
Related articles
GitHub – containers/podman: Podman: A tool for managing OCI containers and pods.
- 페이지:JMeter 부하테스트
- 페이지:Podman