홈 › 리눅스 운영 › 13 / 13

Docker 실무

Dockerfile·다단계 빌드·실행 옵션·Compose·레지스트리·폐쇄망 반입 (podman 대응)
섹션 7진행 0 / 13

3. 코드 예제

예제 1: Dockerfile 전체 (다단계 빌드)

dockerfile
FROM eclipse-temurin:21-jdk AS build
WORKDIR /src
COPY Main.java .
RUN javac Main.java

FROM eclipse-temurin:21-jre
WORKDIR /app
COPY --from=build /src/Main.class .
USER 1001
EXPOSE 8080
ENTRYPOINT ["java", "-XX:MaxRAMPercentage=75", "Main"]

USER 1001 로 비root 사용자를 지정해 컨테이너 탈출 시 피해를 줄입니다. ENTRYPOINT 가 exec 형식이라 java 가 PID 1 이 되어 완전 종료 신호를 바로 받습니다.

예제 2: 빌드·실행·확인 — docker_demo.sh 발췌

bash
run docker build -t study/app:1.0 "$HERE"
run docker run -d --name study-app -p 18080:8080 --memory 256m study/app:1.0
run curl -s localhost:18080/health
run docker inspect -f '{{.State.ExitCode}} {{.HostConfig.Memory}}' study-app

run() 함수는 docker 명령이 없거나 데몬 연결이 안 되면 DRY_RUN=1 로 자동 전환해 명령만 출력합니다. 검증 시점 이 PC 의 Docker 데몬이 꺼져 있어 아래 실행 결과는 실제로 DRY_RUN=1 bash docker_demo.sh 로 얻은 것입니다.

text
== 1. 데몬 확인 ==
  데몬 연결 불가 또는 강제 DRY_RUN, 이후 명령은 출력만 합니다

== 2. 이미지 빌드 ==
  [dry] docker build -t study/app:1.0 .../linux-src/13_docker

== 3. 컨테이너 실행 ==
  [dry] docker run -d --name study-app -p 18080:8080 --memory 256m study/app:1.0

== 4. 기동 대기 후 헬스 확인 ==
  [dry] curl -s localhost:18080/health

데몬이 켜져 있는 환경이라면 docker build 에 1~2분(베이스 이미지 내려받기 포함)이 걸리고, curl 응답은 {"status":"UP"} 이 됩니다.

예제 3: compose 문법 검증 — docker_demo.sh 발췌

bash
run docker compose -f "$HERE/compose.yaml" config -q

config -q 는 YAML 문법과 참조를 검사만 하고 아무것도 띄우지 않습니다. 이 레슨은 -q 실행도 데몬 없이는 되지 않아 DRY_RUN 으로 명령만 확인했습니다.

text
== 7. compose 문법 검증 ==
  [dry] docker compose -f .../compose.yaml config -q

예제 4: 폐쇄망 반입 — docker_demo.sh 발췌

bash
docker save study/app:1.0 | gzip > /tmp/app.tar.gz
sha256sum /tmp/app.tar.gz

데몬이 있는 환경에서는 이미지를 파일로 묶고 체크섬을 남깁니다. 이 레슨의 검증에서는 DRY_RUN 이라 아래처럼 명령만 출력됩니다.

text
== 8. 폐쇄망 반입용 저장 ==
  [dry] docker save study/app:1.0 | gzip > /tmp/app.tar.gz
  [dry] sha256sum /tmp/app.tar.gz