컨테이너 기초 (podman)
4. 응용 변형 예제
4.1 두 단계 빌드
FROM registry.access.redhat.com/ubi9/openjdk-21:latest AS build
WORKDIR /src
COPY . .
RUN ./mvnw -q package -DskipTests
FROM registry.access.redhat.com/ubi9/openjdk-21-runtime:latest
COPY --from=build /src/target/app.jar /opt/myapp/app.jar
ENTRYPOINT ["java", "-jar", "/opt/myapp/app.jar"]빌드 도구는 첫 단계에만 있고 최종 이미지에는 JRE 와 jar 만 남아 작습니다. 폐쇄망은 Maven 저장소 미러가 필요해 대개 PC 에서 jar 를 만들어 반입합니다.
4.2 compose 로 여러 컨테이너
services:
app:
image: localhost/myapp:1.0
ports: ["8080:8080"]
environment: { JAVA_OPTS: "-Xmx512m" }
depends_on: [db]
db:
image: localhost/postgres:16
volumes: ["/opt/pgdata:/var/lib/postgresql/data:Z"]podman-compose up -d 로 앱과 DB 를 함께 띄웁니다. 개발·검증 서버에서 유용하고 운영은 quadlet 로 개별 등록하는 편이 관리하기 쉽습니다.
4.3 컨테이너 안 진단
podman exec myapp jps -l
podman exec myapp jstack 1 > td.txt
podman exec myapp jcmd 1 GC.heap_info
podman top myapp자바가 PID 1 이라 jstack 1 입니다. 운영 묶음 09 의 도구가 podman exec 뒤에 붙는 것만 다릅니다.
4.4 이미지 안 확인
podman run --rm -it myapp:1.0 sh # 임시로 들어가 보기
podman run --rm myapp:1.0 java -version
podman image inspect myapp:1.0 --format '{{.Config.Env}}'--rm 은 끝나면 컨테이너를 지웁니다. 이미지에 든 JDK 버전과 환경 변수를 실행 전에 확인합니다.
4.5 로그를 호스트 logrotate 로
podman run -d -v /var/log/myapp:/opt/myapp/logs:Z myapp:1.0앱이 파일 로그를 볼륨에 쓰면 운영 묶음 06 의 logrotate 설정이 그대로 적용됩니다. stdout 만 쓰는 앱은 journalctl -u myapp 이 로그이고 journald 상한으로 관리합니다.