RHEL Podman 빌드 및 컨테이너 서비스 파일 생성
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