사내에는 Jenkins CI/CD를 통해 배포 파이프라인이 구축되어 있었다. 인프라 개선 프로젝트를 진행하면서 Auto Scaling, Jenkins pipeline, CodeDeploy 등이 추가로 적용되면서 Docker 컨테이너화도 함께 추가하게 되었다.
Docker를 선택한 이유와 방법에 대해 공유해봅니다.
FROM amazoncorretto:18
COPY build/libs/*.jar app.jar
ENTRYPOINT [ \
"java", \
"-jar", \
"app.jar" \
]
#1 FROM : Docker file의 베이스가 되는 이미지를 선택한다. Java 18버전으로 Spring boot를 실행할 예정이기 때문에 기존에 사용중이던 amazon corretto 18 이미지를 선택하였다.
#3 COPY : Spring 서버를 실행하기 위한 jar 파일을 COPY 명령어를 통해 도커 파일 시스템으로 복사해온다. *.jar를 통해 해당 경로에 있는 생성된 jar 파일의 이름에 영향받지 않고 복사할 수 있다. Dockerfile의 컨텍스트 경로를 따로 지정하지 않는 경우에 Dockerfile이 존재하는 폴더 경로가 최상단 경로가 되며 외부 경로에 접근할 수 없다.
#5 ENTRYPOINT : 실제 서버가 실행되는 시점에 사용할 Shell 스크립트이다. java -jar app.jar 명령어를 통해 Spring Boot 서버를 실행한다. 명렁어의 공백 단위로 분리하여 배열 형태로 ENTRYPOINT 명령어에 전달한다.
version: "3"
services:
application:
build:
context: ../
dockerfile: Dockerfile
container_name: sample
ports:
- "8080:8080"
volumes:
- ./logs:/logs
environment:
TZ: Asia/Seoul
#1 version : docker-compose의 버전을 명시한다. 버전별 지원하는 옵션들이 일부 다를 수 있어 오류가 난다면 버전을 확인해볼수있다.
#2 services : docker를 통해 실행된 컨테이너들을 나열한다.
#3 application : application 이라는 이름의 서비스를 정의한다.
#4 build : Dockerfile을 통해 이미지를 빌드하고 빌드한 이미지를 통해 컨테이너를 실행하기 위한 옵션. context 경로와 dockerfile의 경로를 지정해준다.
#7 container_name : 실행될 컨테이너의 이름을 정의한다.
#8 ports : 외부 환경과 도커 내부 환경의 포트를 연결해준다.
#10 volumes : Spring boot의 로그 파일이 생성되면 도커 파일시스템 내부에 있기 때문에 파일에 접근할 수 없다. 외부에서도 파일에 접근 가능하게 하기 위해 외부 시스템의 파일 경로와 도커 내부 파일시스템의 파일 경로를 연결해준다.
#12 environment : 추가로 필요한 환경변수를 정의한다. 정의된 환경변수는 Dockerfile 내에서 사용 가능하다.
docker-compose up -d --build
명령어를 통해 빌드 및 실행[+] Building 1.7s (8/8) FINISHED docker:desktop-linux
=> [application internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 226B 0.0s
=> [application internal] load metadata for docker.io/library/amazoncorretto:18 1.7s
=> [application internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [application 1/3] FROM docker.io/library/amazoncorretto:18@sha256:1128cff77f7fb4512215a4ded2bf0a6ec3cd2bf0f414a72136b1bb1d5f6b0518 0.0s
=> [application internal] load build context 0.0s
=> => transferring context: 315B 0.0s
=> CACHED [application 2/3] COPY build/libs/*.jar app.jar 0.0s
=> CACHED [application 3/3] COPY deploy/opentelemetry-javaagent.jar agent.jar 0.0s
=> [application] exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:3994d6e283de0d9fe614ddd32ace1e6d78a6e3bdae869f93f22be98d19ed129f 0.0s
=> => naming to docker.io/library/deploy-application 0.0s
[+] Running 1/0
✔ Container sample Running 0.0s
docker-compose logs -f ${컨테이너명}
명령어를 통해 실행된 컨테이너의 로그를 확인할 수 있다.
docker-compose down
명령어를 통해 실행중인 컨테이너들을 종료시킬 수 있다.