podman
1. 정의
컨테이너 및 컨테이너 이미지를 개발, 관리, 실행하기 위한 도구이다.
docker와 유사한 명령어 및 인터페이스를 제공하며, 기본적으로 데몬 프로세스를 필요로 하지 않고 사용자 공간에서 실행된다.
또한 컨테이너를 루트 권한 없이 실행할 수 있기 때문에 보안 측면에서 유용하며, 일부 시스템에서 더 적은 권한으로 작업할 수 있다.
2. podman 과 docker의 차이점
아키텍처 | 권한 | 이미지 저장 | 호환성 | |
podman | 단일 바이너리 실행 파일로 구성. 별도의 서버가 필요하지 않고, 컨테이너를 직접 관리. |
root 권한 없이 사용 가능. | 로컬 이미지 스토리지 사용. | docker와 호환 가능한 cli를 제공하기 때문에 docker 환경에서 도구와 파일 형식을 사용할 수 있다. |
docker | 클라이언트-서버 아키텍처 | root 권한 필요. | docker hub와 같은 중앙이미지 레지스트리 사용. | 컨테이너화된 애플리케이션을 다른 docker 환경에서도 동일하게 실행할 수 있는 호환성을 가지고 있다. |
3. 관련 명령어
- podman build [옵션] [이미지] [경로]
Containerfile을 사용하여 컨테이너 이미지를 빌드한다.
- -t
생성된 이미지에 태그를 지정한다.
- podman images
로컬 스토리지의 이미지를 나열한다.
- podman pull [이미지]
registries에서 이미지를 다운로드한다.
- podman ps [옵션]
현재 실행되고 있는(up 상태)인 컨테이너 목록을 보여준다.
- -a (--all)
실행 중인 컨테이너뿐만 아니라 종료된 컨테이너도 포함하여 모든 컨테이너 목록을 출력한다.
- podman create [옵션] [이미지]
이미지에서 나중에 실행할(당장 실행 X) 컨테이너를 생성한다.
- podman start [컨테이너 ID]
생성된 컨테이너를 실행한다.
- podman stop [컨테이너 ID]
동작 중인 컨테이너를 중지한다.
- podman run [옵션] [이미지] [명령어]
컨테이너를 실행하는 데 이미지가 저장되어 있지 않다면 다운로드하여 실행한다.
- -d (--detach)
컨테이너를 백그라운드에서 실행하고 새 컨테이너 ID를 출력한다.
- -a (--attach)
컨테이너를 포그라운드에서 실행한다.
- -p (--publish)
컨테이너의 포트와 호스트의 포트를 연결한다.
- -v (--volume)
호스트의 디렉토리와 컨테이너의 디렉토리를 연결하여 볼륨을 마운트한다.
- -t (--tty)
가상 터미널(tty)을 활성화한다. (주로 -i와 함께 사용)
- -i (--interactive)
컨테이너의 표준 입력(stdin)을 활성화한다. (주로 -t와 함께 사용)
- -e (--env)
컨테이너 내에서 사용할 환경변수를 설정한다.
- -n (--name)
컨테이너 이름을 지정한다.
- --rm
종료 시 컨테이너를 자동으로 제거한다. 컨테이너를 성공적으로 생성하거나 시작할 수 없는 경우 컨테이너가 제거되지 않는다.
- podman inspect [컨테이너 ID]
컨테이너, 이미지, 볼륨 등의 구성을 표시한다.
- podman cp [소스 경로] [컨테이너 ID:대상 경로] # 로컬 파일에서 컨테이너로 복사
- podman cp [컨테이너 ID:소스 경로] [대상 경로] # 컨테이너에서 로컬 파일로 복사
로컬 파일 시스템과 컨테이너 간에 파일 또는 디렉토리를 복사한다.
- podman rm [컨테이너 ID]
컨테이너를 제거한다.
- podman rmi [컨테이너 ID]
로컬의 컨테이너 이미지를 제거한다.
- podman search
레지스트리에서 이미지를 검색한다.
- podman exec [옵션] [컨테이너 ID]
컨테이너 내부에서 명령어를 실행한다.
- -t (--tty)
가상 터미널(tty)을 활성화한다. (주로 -i와 함께 사용)
- -i (--interactive)
컨테이너의 표준 입력(stdin)을 활성화한다. (주로 -t와 함께 사용)
- buildah
컨테이너 이미지 빌드, 이미지 관리, 컨테이너 관리, 이미지 및 컨테이너 저장소와의 상호 작용 등을 수행하는 도구이다.
- skopeo
컨테이너 이미지와 이미지 리포지토리를 조작, 검사, 서명, 전송하기위한 도구이다.
- runc
OCI 컨테이너 런타임 중 하나로, 주로 리눅스 컨테이너를 실행하기 위해 사용되는 경량 컨테이너 런타임이다. 많은 사용자가 기반돼 있으며, 안정성과 호환성이 뛰어나다.
- crun
runc의 대안으로 개발되었으며, 보다 뛰어난 경량성과 실행속도가 장점이다.
4. 레드햇 레지스트리
레지스트리 | 콘텐츠 | 인증되지 않은 액세스 지원 | Red Hat 로그인 지원 | 레지스트리 토큰 지원 |
registry.access.redhat.com | Red Hat products | Yes | No | No |
registry.redhat.io | Red Hat products | No | Yes | Yes |
registry.connect.redhat.com | Third-party products | No | Yes | Yes |
5. Podman unshare
컨테이너에서 권한이 없는 작업의 문제를 해결하는 데 사용한다.
컨테이너에 영구 볼륨을 마운트할 때 파일의 권한을 사용할 유저의 UID, GID가 설정되어 있어야 한다. 하지만 파일이 기본적으로 일반 유저 권한이기 때문에 컨테이너 내부 사용자는 사용할 수가 없다.
podman unshare 명령어를 통해 사용자 네임스페이스에 대한 UID 매핑을 가져올 수 있다.
[admin@localhost ~]$ podman exec -it web cat /proc/self/uid_map 0 1000 1 1 100000 65536 |
컨테이너에서 0번은 시스템에서 1000번에 매핑됨을 보여준다.
컨테이너에서 1번은 100000에 매핑되어 이후는 1씩 증가한다.
예를 들어 mysql 999:999에 매핑하려면 아래와 같이 입력해주면 된다.
[admin@localhost ~]$ podman unshare chown 999:999 db_data [admin@localhost ~]$ ls drwxr-xr-x. 5 100998 100998 4096 Jun 9 10:56 db_data |
실행한 결과 컨테이너 내부 999는 시스템에서 100998에 해당되므로 해당 UID 및 GID로 변경되었다.
이후 사용자가 컨테이너를 실행하면 정상적으로 사용할 수 있다.
루트의 경우 호스트 시스템의 UID 및 GID가 컨테이너 내부의 UID 및 GID와 일치하게 설정되어 있어 별도의 설정이 필요 없다.
하지만, 컨테이너가 rootless인 경우 동일한 방식으로 동작하지 않는다. rootless 컨테이너에서는 podman이 사용자 네임스페이스 내에서 컨테이너를 시작하기 때문에 사용자는 컨테이너 내에서 root 액세스 권한을 갖는다.
[admin@localhost run]$ echo $XDG_RUNTIME_DIR /run/user/1000 |
'리눅스-podman > 실습' 카테고리의 다른 글
podman 실습 - 컨테이너 유닛 생성 (0) | 2023.09.01 |
---|---|
podman 실습 - mariadb 생성 및 설정 (0) | 2023.09.01 |
podman 실습 - 레지스트리 등록과 이미지 사용 (0) | 2023.09.01 |