본 글은 Udemy의 Docker & Kubernetes: 실전 가이드 - 2022년판을 수강하며 공부하고자 남긴 글입니다.
(부족한 부분이 있을 수 있음을 알려드립니다. 부족한 부분 댓글로 남겨주시는 것 환영입니다. 👍)
Spring 애플리케이션 배포하는 과정에서 빌드시 관련 파일인 리소스와 속성파일 등을 패키징한 압축 파일인 jar나 war 파일이 만들어진다. 도커도 이와 비슷하게 빌드를 하면 애플리케이션을 구성하는 코드와 종속성을 포함한 이미지라는 것을 만들 수 있다. 그런데 이제 실행하는데 필요한 도구인 실행 환경을 곁들인. 🧐
이미지는 애플리케이션을 구성하는 코드와 실행하는데 필요한 도구인 실행 환경을 포함한 패키지이며 공유가 가능하다.
컨테이너는 실행 중인 인스턴스를 의미하며, 이미지는 컨테이너의 청사진, 즉 DNA🧬와 같다고 할 수 있다.
이미지는 모든 설정 명령과 모든 코드가 포함된 공유 가능한 패키지이다. 컨테이너는 그러한 이미지의 구체적인 실행 인스턴스이다. 이미지는 컨테이너에 필요한 모든 논리와 모든 코드를 보관하는데 사용된다.
일단 컨테이너가 실행되면 다른 실행 중인 컨테이너들과는 독립적이다. (Stand-Alone 하다.) 여러 컨테이너가 서로 간섭하지 않고 동일한 이미지를 기반으로 실행될 수 있다. 컨테이너는 서로 분리되어 있으며, 디폴트로 공유되는 데이터나 상태가 없다.
Dockerfile의 모든 세부 명령어를 기반으로 이미지 레이어를 생성한다. 이미지를 빌드할 때마다 도커는 모든 명령 결과를 캐시한다. 이미지를 다시 빌드할 때 변경 사항이 없으면 캐시된 결과를 사용한다.
이미지를 빌드할 때 변경된 레이어가 있으면 해당 명령부터 이후의 모든 레이어 (명령)가 재실행된다. 이것을 레이어 기반 아키텍처라고 한다. 도커는 다시 실행해야 하는 항목만 재실행하여, 이미지 생성 속도를 높인다.
이미지를 기반으로 컨테이너를 실행하면 애플리케이션 이미지 위에 실행할 때만 활성화되는 최종 레이어가 추가된다.
이미지를 빌드할 때 소스 코드를 이미지로 복사하는 시점에 소스 코드의 스냅샷을 만든다. 이미지는 Read only 이므로 일단 빌드되면 끝이다. 이후에 소스 코드를 편집하면 변경 사항은 이미지의 소스 코드에 포함되지 않는다. 업데이트된 소스 코드를 이미지에 포함시키려면 이미지를 다시 빌드해야 한다. (편리한 도구를 사용하여 재빌드하지 않아도 변경사항을 업데이트할 수 있다. 추후 관련 내용 추가 예정)
Dockerfile을 만들어 커스텀 이미지를 빌드할 수 있다.
프로젝트 디렉토리에 Dockerfile 파일 생성 후 세부 명령어를 작성한다. 어떤 베이스 이미지를 사용하는지, 어떤 코드와 종속성을 복사하는지, npm install과 같은 설정 단계와 외부에서 컨테이너를 다룰 수 있도록 수신대기를 하는 것 등을 작성한다.
Visual Studio Code 사용시 도커 확장 프로그램을 설치하는 것을 추천한다. 도커 명령 코드 작성하는 것을 쉽게 할 수 있도록 도와준다.