Linux

RHEL Podman 빌드 및 컨테이너 서비스 파일 생성

새싹싹이 2024. 4. 14. 18:50

http://classroom.example.com/Containerfile 에서 파일을 다운로드

수정 금지

다운받은 컨테이너 파일로 이미지 빌드

 

 

 

밑에 문제 때문에 루트 유저가 아닌 xanadu 유저로 접속

 

#  ssh xanadu@servera

servera의 xanadu 의 사용자로 접속

 

 

$ wget http://classroom.example.com/Containerfile

(하지만 나는 혼자 연습용이기 때문에 vi 편집기로 Containerfile 생성)

 

$  vi Containerfile

# syntax=docker/dockerfile:1
FROM registry.access.redhat.com/ubi9/ubi

ENV PATH="/usr/local/bin:${PATH}"

CMD ["bash", "-c", "while true; do echo 'Hello, World!'; sleep 10; done"]

 

 

 

$  podman build -t myimage:v1 .

-t 태그 지정 옵션 / 이미지 이름: myimage / 태그: v1

 

 

$  podman images

이미지 확인


컨테이너가 자동으로 실행되게 구성

- 이전에 빌드했던 이미지를 사용하여 컨테이너를 만들어라

- 서비스 /opt/file 디렉토리가 컨테이너 내부의 /opt/incoming  디렉토리에 자동으로 마운트 되게 구성

- xanadu 유저만 실행할 수 있게 해당 컨테이너를 systemd 권한으로 구성

- 이 서비스를 mycontainer라고 명명하고 시스템 재부팅 시, 수동 개입없이 자동 설정하게 설정 

 

 

루트 사용자

# chown xanadu /opt/processed/

xanadu 에게 /opt/processed/ 소유주 권한 부여

 

# chown xanadu /opt/file

 

# ssh xanadu@servera

 


xanadu   사용자

 

 

$ podman run -d --name mycontainer -v /opt/file:/opt/incoming:Z -v /opt/processed/:/opt/outgoing:Z localhost/myimage:v1

-d : 컨테이너를 백그라운드(detached) 모드로 실행 

--name : 컨테이너 이름을 mycontainer로 실행

-v /opt/file:/opt/incoming : 호스트의 /opt/file 디렉토리를 컨테이너 내부의 /opt/incoming 디렉토리로 마운트

:Z : SELinux 보안 컨텍스트를 컨테이너와 일치시킴

-v /opt/processe/:/opt/outgoing:Z : 호스트의 /opt/processe/ 디렉토리를 컨테이너 내부의 /opt/outgoing 디렉토리로 마운트

:Z : SELinux 보안 컨텍스트를 컨테이너와 일치시킴

localhost/myimage:v1 : localhost 레지스트리에 위치한 myimage 이미지의 v1 태그 사용

 

 

$ podman ps -a

컨테이너 생성 확인

 

 

# loginctl show-user xanadu

systemd의 loginctl 유틸리티를 사용하여 사용자 xanadu에 대한 정보 출력

Linger=no 로 비활성화 되어 있으면 로그아웃되면  작업이 종료

 

 

$ loginctl enable-linger

Linger 활성화

 

 

$ mkdir -p ~/.config/systemd/user

서비스 파일을 저장할 디렉토리 생성

 

$ cd .config/systemd/user


$ podman generate systemd --name mycontainer --files

podman generate systemd : systemd 서비스 파일을 생성

--name mycontainer : 생성할 systemd 서비스의 이름을 지정

--files : systemd 서비스 파일을 생성하면 해당 서비스가 관리하는 파일 시스템을 자동으로 마운트하도록 설정

 

$ ls

생성 확인

 

$ cat container-mycontainer.service

 

 

 

$ podman stop mycontainer

컨테이너 중지

 

 

$ systemctl --user start container-mycontainer.service

--user: 현재 사용자의 systemd 유닛을 관리 (현재 xanadu로 로그인 되어 있기 때문에 xanadu의 systemd 유닛 관리)

container-mycontainer.service 의 서비스 시작

 

$ podman ps

 

 

$ systemctl --user stop container-mycontainer.service

서비스 중단

 

 

$ systemctl --user enbale container-mycontainer.service

 

 

podman stop mycontainer: Podman으로 컨테이너 중지
systemctl --user stop container-mycontainer.service: systemd를 통해 "사용자 서비스"를 중지

 

 

 

<참고>

https://youtu.be/_csC_cUpwh8?si=neg8tgunqm55F_-1