티스토리 뷰
Docker Image는 여러 개의 레이어로 되어 있다.
도커 이미지는 빌드시 Dockerfile의 각 명령어들에 대한 레이어를 생성한다.
Docker는 매번 모든 Layer를 생성하면 속도가 매우 느려질 수 있다. 따라서, Docker는 Docker Image 빌드 속도를 높이기 위해 Docker Cache를 사용한다. 첫 번째 이미지 빌드에서는 각 레이어별 Cache를 생성하고, 이후 동일한 명령어가 실행되면 기존의 레이어를 재사용한다. 만약 변경되는 단계가 있다면 레이어는 다시 만들어진다.
하지만, COPY같은 경우 jar 파일의 내용이 바뀌었으면, 같은 명령어라도 Cache를 적용할 수 없다.
직접 어플리케이션 코드 변경 후 Dockerfile을 재빌드해 문제를 파악하고, 해결방안을 알아보자.
Docker로 Spring Boot 프로젝트를 실행하는 과정은 다음과 같다.
1. 도커 파일 작성
2. 도커 이미지 생성 (build)
3. 도커 컨테이너 생성 및 프로젝트 실행 (run)
1. Spirng boot 프로젝트를 실행하기 위한 Dockerfile
FROM openjdk:17-alpine
WORKDIR /usr/src/app
COPY ./build/libs/demo-0.0.1-SNAPSHOT.jar ./build/libs/demo-0.0.1-SNAPSHOT.jar
CMD ["java", "-jar", "./build/libs/demo-0.0.1-SNAPSHOT.jar"]
2. Docker Image 생성
$ docker build . -t springbootapp
첫번째 Docker Image 빌드이므로, Dockerfile의 각 명령어에 대한 레이어가 생성된다.
3. 어플리케이션 코드 변경 후 Docker Image 재생성
1. 어플리케이션 코드 변경 후 jar 파일 재생성
2. Dockerfile을 다시 빌드해 Docker Image 재생성
Dockerfile을 보면 COPY를 통해 jar 파일을 컨테이너 내부로 넣어주고 있다. jar 파일에 변경사항이 있다면 다시 jar 파일을 컨테이너 내부로 넣어줘야 한다. 이로 인해 Docker Image가 새로 생성되는 것이다.
4. 해결방안 : Docker Volume
Volume은 로컬에 있는 파일을 컨테이너 내부에서 참조할 수 있도록 하는 것이다. 로컬에서 jar파일이 위치해 있는 경로와 컨테이너 내부의 경로를 연결해주면, 어플리케이션 코드 변경 시 컨테이너에 바로 반영이 된다.
COPY는 로컬에 있는 것을 도커 컨테이너 내부로 그대로 복사해와서 별개로 사용한다. 따라서 어플리케이션 코드 변경 시 Dockerfile을 빌드해 이미지를 재생성 후 컨테이너를 실행해야 변경사항이 반영된다.
$ docker run [옵션] -v [호스트 경로]:[컨테이너 경로] [IMAGE 식별자]
$ docker run -p 5000:8080 -v $(pwd)/build/libs:/usr/src/app/build/libs springbootapp
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker로 Nginx Reverse Proxy 구성하기 (0) | 2023.03.14 |
---|