1. Dockerfile 작성

FROM openjdk:11-jdk-slim
WORKDIR /app 
COPY build/aws-v3-0.0.3.jar ./application.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "application.jar"]
#CMD ["--server.port=8080"]

 

WORKDIR 

  • 모든 작업이 해당 디렉토리에서 진행되도록 처음 시작 디렉토리를 지정.
  • 사용자가 터미널로 접근 했을 때도 /app 디렉토리로 바로 접근된다. (docker attach, docer exec -it ~ bash)
  • COPY와 같이 상대경로로 설정되어있다면 처음 시작지점이 WORKDIR에서 지정한 폴더가 된다.
    (  ./application.jar === /app/application.jar)

COPY (vs ADD)

  • build/aws-v3.0.0.3.jar를 복사하는데 파일명은 application.jar로 변경
  • ADD와의 차이점 : ADD는 압축도 풀린다고함. ADD 압축파일.zip ./ #이렇게 하면 압축풀림

ENTRYPOINT

  • 명령어를 실행해주는 것.
  • CMD와 비슷하다.
  • 파라미터로 넘겨받은 것들을 합쳐서 컨테이너 실행 시 실행시켜 준다.
  • Dockerfile을 빌드해서 컨테이너가 실행되면 java -jar -Dspring.profiles.active=dev application.jar 명령어가 자동으로 실행된다. (물론 /app 디렉토리에서)

ENTRYPOINT vs CMD

  • ENTRYPOINT는 컨테이너가 실행될 때 무조건 실행되는 명령어
  • CMD도 컨테이너가 실행될 때 실행되는 명령어 이지만 외부의 값에 따라서 대체가 가능하다. (옵셔널) CMD는 ENTRYPOINT의 파라미터로 넘겨지기도 한다.
CMD ["--server.port=3000"]

이렇게 해놓아도

docker run -d -p 9097:5000 java-server --server.port=5000

컨테이너를 실행할 때 위와 같이 실행시키면 --server.port=5000 으로 실행된다. (Dockerfile에 있는 CMD 대체)

 

정리하자면 무조건 대체제없이 실행되어야할 것들은 ENTRYPOINT로 실행하면될거같고, 내가 run할 때마다 바꿀수도있는 값은 CMD로 설정해두면 될거같다.

 

2. 실습에 필요한 jar 파일 다운로드

https://github.com/codingspecialist/aws-v3/tree/release

 

GitHub - codingspecialist/aws-v3: elastic bean stalk

elastic bean stalk. Contribute to codingspecialist/aws-v3 development by creating an account on GitHub.

github.com

spring project가 jar로 압축되어있는 파일이다.

해당 파일을 build디렉토리에 넣어주자. (Dockerfile에 COPY build/aws-v3.0.0.3.jar 로 해놨으니까.)

2. Dockerfile build

docker build -t java-server:1.0 ./

docker build -t [생성할이미지명][생성할태그] [Dockerfile 위치] 

3. Docker image확인

docker images

빌드 결과가 제대로 생성되었는지 이미지를 확인해주자.

 

4. 컨테이너 실행

docker run -d -p 9097:8081 java-server:1.0

 

현재는 Dockerfile의 CMD 명령어가 없어서 spring.profiles.active=dev가 실행되어 8081이 기본포트로 잡힌다.

(ENTRYPOINT로 -Dspring.profiles.active=dev 를 설정하였기 때문에.)

 

만약에 Dockerfile에 CMD를 추가한다면?

FROM openjdk:11-jdk-slim
WORKDIR /app 
COPY build/aws-v3-0.0.3.jar ./application.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=dev", "application.jar"]
CMD ["--server.port=8080"]

이렇게 되면 8080 포트가 잡힌다. java -jar -Dspring.profiles.active=dev application.jar --server.port=8080 이라는 명령어가 실행된 것과 같기 때문에.

 

근데 Dockerfile에도 추가하고 run 옵션으로도 추가하면? run옵션으로 추가한 것이 Dockerfile의 CMD 명령어를 대체한다.

docker run -d -p 9097:8800 java-server:1.0 --server.port=8800

이렇게 되면 spring의 내장 tomcat은 8800으로 실행된다.

 

5. 컨테이너 로그 확인

컨테이너 내부의 로그를 보기 위해서는 아래와 같은 명령어로 확인한다.

docker logs [CONTAINER ID]

+ Recent posts