컨테이너 기초 (podman)
3. 코드 예제
예제 1: Containerfile 전체
FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:latest
USER 0
RUN mkdir -p /opt/myapp/logs && chown -R 185:0 /opt/myapp
USER 185
WORKDIR /opt/myapp
COPY app.jar /opt/myapp/app.jar
ENV JAVA_OPTS="-Xms256m -Xmx512m -Duser.timezone=Asia/Seoul"
EXPOSE 8080
ENTRYPOINT ["sh", "-c", "exec java $JAVA_OPTS -jar /opt/myapp/app.jar"]잠시 root(0) 로 폴더를 만들고 다시 기본 사용자 185 로 돌아옵니다. 이미지 안 프로세스가 root 가 아니어야 10 레슨의 최소 권한 원칙이 컨테이너에서도 지켜집니다.
예제 2: 빌드·실행·확인 — podman_demo.sh 발췌
podman build -t myapp:1.0 -f Containerfile .
podman run -d --name myapp -p 8080:8080 -v /opt/myapp/logs:/opt/myapp/logs:Z --restart=on-failure myapp:1.0
podman ps
podman logs --tail 5 myapp
curl -s localhost:8080/actuator/healthSTEP 1/9: FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:latest
...
Successfully tagged localhost/myapp:1.0
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
3f2a9c1b7d21 localhost/myapp:1.0 Up 5 seconds 0.0.0.0:8080->8080/tcp myapp
... Started OrderApp in 3.4 seconds
{"status":"UP"}리눅스 서버 출력 예시입니다. 스크립트는 podman 이 없으면 [dry] 접두어로 명령만 출력합니다.
예제 3: quadlet 등록 — podman_demo.sh 발췌
sudo cp myapp.container /etc/containers/systemd/
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
systemctl status myapp --no-pager | head -n 5● myapp.service - MyApp container
Loaded: loaded (/etc/containers/systemd/myapp.container; generated)
Active: active (running) since Fri 2026-09-11 09:10:02 KST; 3s ago
Main PID: 4521 (conmon)generated 가 quadlet 이 유닛을 만들었다는 표시입니다. 이후 재부팅·재시작·로그가 모두 systemctl 로 됩니다.
예제 4: 반입 절차 — podman_demo.sh 발췌
podman save -o myapp-1.0.tar myapp:1.0
sha256sum myapp-1.0.tar > myapp-1.0.tar.sha256
sha256sum -c myapp-1.0.tar.sha256
podman load -i myapp-1.0.tar
podman images myappmyapp-1.0.tar: OK
Loaded image: localhost/myapp:1.0
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/myapp 1.0 8a1f3e2c9b04 5 minutes ago 420 MB운영 묶음 04 의 jar 반입 절차에서 파일이 이미지 tar 로 바뀐 것뿐입니다.