Docker 작업

OpenJDK 12.0.2 기반 Fat.jar 도커이미지 빌딩

Jungsoomin :) 2021. 1. 1. 23:17

개요, 순서

  • Docker 를 사용하여 SpringBoot 의 Fat.jarDocker Image 로 빌딩하는 작업을 기술한다.
  • 첫번째로 Target Project 를 Gradle 로 build 시킨다.
  • 이후 Docker Image 빌딩에 필수 파일인 Dockerfile을 정의한다.
  • Target ProjectRoot 로 가서 docker 를 이용해 이미지로 빌딩한다.
  • Docker 엔진 내부의 이미지들 중 해당 이름의 이미지가 있는지 확인한다.
  • 서비스를 시작해보고 테스트하고 로그를 확인해본다.

Docker File

  • FROM : 해당 이미지를 사용하여 빌드하겠다.
  • EXPOSE : 다른 컨테이너 해당 포트를 노출시키겠다.
  • ADD : 해당경로의 파일을 도커 이미지에 추가시키겠다.
  • ENTRYPOINT : 이미지 실행시 해당 커멘드를 실행시키겠다. ( java -jar /app.jar)
#Dockerfile

FROM openjdk:12.0.2

EXPOSE 8080

ADD ./build/libs/*.jar app.jar

ENTRYPOINT ["java","-jar","/app.jar"]

 

Gradle Build => Fat.jar

  • Fat.jar 를 만들기위해 절대경로 기준으로 Target Project 를 Gradle 빌드시켰다.
C:\Users\JungSooMin\IdeaProjects\basic-rest-service>gradlew :microservices:product-service:build

 

Docker Build => Docker Image

  • Dockerfile 을 이용하여 Docker 로 빌드한다.   (공백+. 빼먹으면 안된다.)
  • 기술한 product-service 는 Docker Image 이름이다.
docker build -t product-service .


 

Docker Local Engine 안에 Docker Image 가 있는지 확인

  • docker images 키워드로 docker image 목록들을 가져올 수 있다.
  • window 라면 findstr 로 꺼내온다.
#images 키워드로 목록을 가져와 findstr 로 끄집어낸다.
docker images | findstr product-service

product-service         latest             3091063d5540   15 minutes ago   498MB

 

Docker Image 를 이용해 도커 컨테이너에서 Fat.jar 실행하기

  • -e컨테이너 환경변수를 Spring Profile 에 맞게 설정해준다.
  • -p포트 바인딩을 한다.
docker run --rm -p8080:8080 -e "SPRING_PROFILES_ACTIVE=docker" product-service

The following profiles are active: docker < 해당 Docker 프로파일을 사용 중이다.

 

 

  • 주의 깊게 봐야할 점은 serviceAddress 데이터 항목이다.
  • 호출된 서버의 호스트명, 아이피명, 포트명을 찍을 수 있게 해놓은 상태이다.
  • 도커 컨테이너 ID / 도커내부 네트워크 할당 IP / 포트 순이다.
  • 즉, 도커 컨테이너의 ID 와 호스트 이름은 동일하다는 결론이 난다.
curl http://localhost:8080/product/3

Container ID, Command 에 주목


도커 컨테이너를 백그라운드로 실행시켜놓고 로그를 확인하는 법

  • 일반적으로 그냥 실행하면 해당 터미널은 잠금 상태가 된다.
  • 백그라운드에서 실행하기 위해서는 -d 키워드를 사용한다.
  • 해당 컨테이너의 로그를 보고 싶다docker logs [name] 키워드를 사용한다.
  • -f 키워드로 지속적으로 로그를 볼 수 있다.
  • docker logs [name] 키워드에 --tail 0 로 새로운 로그만 볼 수있다.
  • docker logs [name] 키워드에 --since [timeStamp] 로 지난 로그들을 볼 수 있다.
# -d 는 detach, --name 으로 컨테이너 이름 지정
docker run -d -p8080:8080 -e "SPRING_PROFILES_ACTIVE=docker" --name my-prd-srv product-service
292c55d37ae02f755a22ef8f0eb5262523f453fe2585ab70936a90c1385e9e87

# 컨테이너에 이름이 생겼다.
docker ps

CONTAINER ID   IMAGE             COMMAND                CREATED         STATUS         PORTS                    NAMES
292c55d37ae0   product-service   "java -jar /app.jar"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->8080/tcp   my-prd-srv

# docker logs [name] 으로 로깅 화면으로 진입, -f 키워드로 지속적으로 커멘드를 띄운다.
docker logs my-prd-srv -f

반가운 화면

# 새로운 로그들 부터 보고 싶다.
docker logs [name] -f --tail 0

# 지난 로그들을 보고 싶다.
docker logs [name] --since 5m

 


마무리

  • docker rm 으로 해당 컨테이너를 삭제하자.
  • -f 키워드는 실행 중인 컨테이너를 중지하고 제거한다.
# -f 는 실행 중인 컨테이너를 제거하고 종료한다.
docker rm -f my-prd-srv