지난 시간에 컨테이너 표준을 다루면서 docker와 podman을 다뤘습니다.
이번시간은 podman을 어떻게 사용할 수 있는지를 다뤄보고 도커와의 차별점을 다룹니다. 도커의 기능인 이미지 관리, 컨테이너 관리는 podman도 동일한 명령어 체계를 가집니다. podman에서 이미지, 컨테이너 관리는 가볍게 다루고 도커와의 차별점인 파드, 쿠버네티스와 조합, rest api 서버를 중점적으로 다루겠습니다.
- 이미지 관리
- 컨테이너 관리
- 파드
- 큐브(쿠버네티스)
- rest api 서버
사실 네트워크도 다뤄야 하는데 네트워크는 추후에 별도로 다루겠습니다.
※ podman 설치확인
version, info 명령어를 통해 버전정보 및 시스템 정보를 조회할 수 있습니다.
info 명령어는 시스템 정보 및 podman 버전정보를 확인할 수 있습니다.
※ 명령어 리스팅
각 명령어에 따라 사용할 수 있는 옵션을 별도로 있습니다. 예를들어 pod 명령어의 옵션을 알고 싶다면 다음과 같이 확인할 수 있습니다.
팟맨은 머신의 개념이 있습니다.
● 머신
머신은 윈도우와 맥에서 가상의 리눅스 환경을 구성합니다.
팟맨을 통해 관리되는 컨테이너는 가상의 리눅스 환경인 머신에서 실행되고 관리합니다.
cpu, dist, memory의 제한을 조절할 수 있습니다.
● 이미지 관리
이미지는 프로그램과 프로세스의 관계에서 프로그램 역할을 수행합니다.
· images - 이미지 목록
이미지 목록은 images를 이용하여 조회할 수 있습니다.
· pull - 이미지를 받아오지
pull을 이용하여 원격 저장소에서 이미지를 받아올 수 있습니다.
도커도 그렇고 팟맨도 마찬가지로 컨테이너를 생성할 때 이미지가 없으면 pull을 수행하여 이미지를 다운받기 때문에 매번 pull을 할 필요는 없습니다.
· rmi - 이미지 삭제
rmi 명령어는 이미지를 삭제합니다. 단, 해당 이미지로 구동된 컨테이너가 없을 때 삭제를 진행합니다.
· build - Dockerfile으로 이미지 만들기
build 명령어를 통해 Dockerfile로 작성된 내용으로 이미지를 만들 수 있습니다.
먼저, Dockerfile을 작성합니다.
build 명령어 체계는 다음과 같습니다.
my-server 이름을 가진 이미지를 생성했습니다. 해당 이미지는 아파치 웹 서버가 동작하는 ubuntu를 실행합니다.
버전을 명시하지 않으면 latest가 붙습니다.
● 컨테이너 관리
컨테이너는 이미지로 생성된 격리된 환경을 가진 프로세스 입니다.
· run - 컨테이너 생성 및 실행
run 명령어를 수행할 때 해당 이미지가 없으면 pull을 하여 이미지를 다운받습니다. ps는 컨테이너 목록을 조회합니다. -a 옵션을 주어 모든 상태의 컨테이너 목록을 조회할 수 있습니다.
status가 Exited가 의미하는 바는 동작중의 상태가 아닙니다.
컨테이너를 생성할 때 다양한 옵션을 추가할 수 있습니다.
많이 사용하는 옵션이니, 잘 숙지해둡시다.
ubuntu의 bin/bash를 실행합니다. 별도의 터미널을 띄우고 ps 명령어를 수행하면 다음과 같이 컨테이너 목록을 확인할 수 있습니다.
방금 생성한 컨테이너는 활성화(up 상태) 된 상태이기 때문에 -a 옵션을 주지 않더라도 확인할 수 있습니다.
팟맨 스럽게는 다음과 같이 명령어를 구성합니다.
· start, restart, stop, rm - 컨테이너 시작, 재시작, 스톱, 삭제
stop은 컨테이너를 중지합니다.
start는 컨테이너를 실행합니다.
restart는 컨테이너를 다시 시작합니다.
컨테이너를 지울 땐 rm 명령어를 사용합니다. 한 가지 주의할 점은 컨테이너를 제거할 땐 up상태이면 안됩니다.
stop으로 멈춘 후 rm으로 지워야 합니다.
· 옵션을 활용하여 컨테이너 생성 및 실행
앞에서 우리가 만든 이미지를 이용하여 웹 서버가 동작하는 컨테이너를 만들어보겠습니다.
이제 localhost:8080으로 접속하면 컨테이너의 80포트로 포워딩 되어 아파치가 제공하는 서비스를 마음껏 누릴 수 있습니다 (마음껏이라고 해봤자 제공하는 서비스가 딱히 없습니다.).

▶ 제공하는 페이지 수정하기
exec로 bash 실행하여 나만의 서비스를 제공하는 index.html을 추가하겠습니다.
exec를 이용하여 방금 우리가 생성한 격리된 공간의 컨테이너의 bash를 실행합니다. 이제 여기서 사용하는 명령어는 host os(메인 운영체제)가 아닌 컨테이너 상에서 명령어를 수행합니다.

멋진 사이트가 완성되었습니다.
▶ 볼륨 마운트
아 그런데 굳이 컨테이너의 bash를 실행하여 수정해야하는가?
당연히 더 편안 방법이 있습니다. 바로 볼륨 마운트를 이용하면 됩니다. 볼륨 마운트랑 호스트의 디렉터리를 컨테이너에 마운트하는 방법입니다. 마운트란 공유로 생각하면 됩니다.
다음과 같이 --volume 옵션을 추가합니다.
localhost:8080으로 접속하면 다음과 같이 보여집니다.

또한 호스트에 있는 index.html를 수정하면 컨테이너의 index.html로 변경되므로 바뀐 서비스를 경험할 수 있습니다.
호스트 경로의 index.html을 다음과 같이 수정합니다.

이 외에도 cp를 이용하여 포스트 경로의 파일(디렉터리)를 컨테이너로 복사할 수 있습니다.
▶ 환경변수 확인하기
앞에서 컨테이너를 생성할 때 -e 옵션으로 TEST_ENV=10이라고 추가했는데 이는 컨테이너의 환경변수를 등록하는 과정입니다.
· commit - 컨테이너를 이미지로 패키징
commit 명령어를 이용하여 컨테이너를 정적인 이미지로 패키징 할 수 있습니다.
1.0 이미지로 컨테이너를 생성해보겠습니다.
앞의 두 명령어는 존재하는 모든 컨테이너를 멈추고 제거합니다.
다음으로 방금 우리가 새롭게 만든 이미지를 기반으로 컨테이너를 생성합니다.
● 파드(pod)
podman은 파드(pod) 개념이 있습니다. 파드(pod)는 컨테이너보다 상위개념 입니다. 하나의 파드(pod)는 다수의 컨테이너를 가질 수 있습니다. podman의 파드(pod)는 쿠버네티스(k8s)의 pod와 유사합니다.
· create - 파드 생성하기
팟맨의 파드(pod)는 인프라 컨테이너(infra container)를 가집니다. INFRA ID가 바로 그것입니다. 인프라 컨테이너는 파드가 생성되는 순간 슬립(sleep)모드로 전환합니다. 파드(pod)는 격리된 ipc, net, pid namespace, cgroups을 가집니다. 즉, 팟맨은 우리가 원하면 별도의 격리된 공간을 만들 수 있습니다. 인프라 컨테이너는 파드에 다른 컨테이너를 연결하는 역할을 수행합니다.
파드에 포함된 컨테이너는 컨테이너 모니터(common)에게 감시를 받습니다. 감시받는 컨테이너가 죽으면 상태를 저장합니다. 그리고 tty를 열어두어 팟맨이 분리모드(백그라운드)로 실행될 때 팟맨은 종료되더라도 컨테이너 모니터는 실행되기 때문에 컨테이너는 계속 실행됩니다.
인프라 컨테이너도 컨테이너이기 때문에 컨테이너 조회시 다음과 같이 목록에 표시됩니다.
컨테이너 조회시 --pod 옵션을 추가하면 해당 컨테이너가 소속된 파드를 확인할 수 있습니다.
· 컨테이너 생성 시 파드에 넣기
run을 이용하여 컨테이너를 생성할 때 --pod 옵션을 이용하여 생성된 컨테이너를 파드(pod)에 연결할 수 있습니다.
여기서 파드에 연결된 컨테이너는 해당 컨테이너에서 사용하는 리소스가 파드에 의해 관리됩니다.
앞의 에러는 포트 번호가 파드에 정의되어 있지 않기 때문에 해당 컨테이너를 파드에 연결할 수 없습니다. 하지만 파드는 설정을 바꿀 수 없습니다. 즉 8081:80을 바인딩하는 파드를 새롭게 만들어주어야 합니다.
▶ 파드 생성
state가 create이기 때문에 running 상태로 바꿔주기 위해 start 명령을 수행합니다.
▶ 컨테이너 생성
--pod에 new:파드이름 형태로 전달하면 새로운 파드(pod)를 만들고 새롭게 생성된 파드에 생성된 컨테이너를 넣습니다. new:가 없다면 기존에 존재하는 파드에 해당 컨테이너를 연결합니다.
이미 존재하는 파드에 연결할 땐 해당 컨테이너가 외부로부터 요청을 받기위해 포트를 바인딩할 필요가 없습니다. 파드가 대신 수행합니다. 파드에 포트가 바인딩 되어 있기 때문에 컨테이너에선 별도의 리소스를 바인딩하지 않습니다.
· 파드제거
파드 제거시 파드에 인프라 컨테이너 이외의 컨테이너가 연결되어 있다면 삭제할 수 없습니다.
또한 인프라 컨테이너는 podman rm [인프라 컨테이너 이름]으로 지울 수 없습니다.
인프라 컨테이너는 파드를 지울 때 함께 제거됩니다.
● 큐브(쿠버네티스)
팟맨은 kube 명령어를 통해 쿠버네티스의 파드를 생성할 수 있습니다.
· play
쿠버네티스 yaml 파일을 기반으로 적절히 파드를 생성합니다.
pod.yaml
파드와 컨테이너를 생성합니다.
· generate
generate는 팟맨에서 생성된 파드를 쿠버네티스에서 파드로 생성할 수 있도록 pod 파일을 만들어줍니다.
· down
down은 play로 생성된 파드를 지웁니다.
사용가능한 API를 공식문서를 통해 확인할 수 있습니다.
· 서버구동
앞에서 팟맨을 위해 리눅스 가상환경을 ssh로 접속합니다.
여기서 팟맨 서버를 띄워줍니다.
▶ 컨테이너 상태 조회
▶ 이미지 조회
· podman.socket
만약 소켓으로 서버를 열려면 tcp:허용 아이피:포트를 지우고 실행합니다
socket 경로는 machine inspect에서 알 수 있습니다.
ConnectionInfo.PodmanSocket.Path 입니다. 해당 URL이 호스트에서 podman이 실행중인 가상 리눅스 서버와 통신할 수 있는 소켓입니다.
해당 소켓 path로 요청하면 가상 리눅스 서버의 소켓으로 바인딩 됩니다. 가상 리눅스 서버에서 관리되는 소켓은 podman system으로 확인할 수 있습니다.
만약, 가상 리눅스에서 요청하려면 system connection list로 나온 경로로 요청하면 됩니다.
이걸 이용하면 나만의 podman-desktop을 만들 수 있습니다.


[출처] [podman] 도커를 대체할 podman 살펴보기|작성자 멍개
'컴퓨터 활용(한글, 오피스 등) > 기타' 카테고리의 다른 글
| [CICD] Podman desktop 설치 (podman) (1) | 2025.07.23 |
|---|---|
| Docker podman (0) | 2025.07.23 |
| OpenShift를 최소 사양으로 설치하기 위한 기본적인 요구사항 (0) | 2025.07.22 |
| .NET 9.0을 사용하여 Alpine 3.21에서 PostgreSQL을 실행 (1) | 2025.07.22 |
| 마크다운 보고서 양식 (1) | 2025.07.21 |