Docekr란?
도커란 애플리케이션에 필요한 모든 의존성과 라이브러리를 격리된 환경인 컨테이너로 패키징하여 실행하는 컨테이너 기반 가상화 플랫폼이다. 이를 통해 애플리케이션을 서로 다른 환경에서도 일관되게 실행할 수 있고, 개발환경과 운영환경 사이의 차이로 인한 문제를 줄일 수 있다.
주요 개념
- Image
: 실행할 애플리케이션과 그에 필요한 모든 환경설정을 포함한 템플릿으로, 변경이 불가능하다.
- Container
: 이미지를 기반으로 실행중인 애플리케이션 인스턴스로, 각 컨테이너는 서로 격리되어 있으며 자원을 공유할 수 있다.
- Dockerfile
: 이미지를 생성할 때 사용되는 스크립트 파일로, 애플리케이션의 실행환경과 설정방법을 정의한다.
- Docker Hub
: Docker 이미지의 저장소로, public/private 이미지 등을 관리한다.
Docker 컨테이너 구조
Image Layer
- 여러 레이어로 구성된 읽기전용 템플릿으로, 애플리케이션과 그 실행에 필요한 환경을 포함한다.
- 각 레이어는 파일시스템의 상태변화를 나타내며, Dockerfile의 명령어(RUN, COPY, ADD 등)에 따라 새로운 레이어가 생성된다.
- 이미지는 변경할 수 없으며, 수정시에는 새로운 레이어가 기존이미지 위에 추가된다.
- 여러 컨테이너가 동일한 이미지 레이어를 공유할 수 있어 자원을 효율적으로 사용할 수 있다.
- 빌드 과정에서는 변경 가능성이 적은 요소 (e.g. 시스템 패키지 설치 및 의존성 설치 등)를 먼저 정의하고, 변경 가능성이 큰 요소 (e.g. 코드, 설정 파일 등)를 나중에 추가하는 것이 효율적이다.
Container Layer
- 이미지를 실행한 결과로, 이미지 맨 위에 읽기/쓰기가 가능한 레이어를 추가하여 작동한다.
- 실행중인 애플리케이션이 파일을 수정하거나 데이터를 생성할 때 사용되며, 해당 컨테이너가 실행되는 동안에만 유지된다.
- 컨테이너를 중단하거나 삭제하면 해당 읽기/쓰기 레이어의 변경사항은 사라지며, 새 컨테이너를 시작하면 원래의 이미지 레이어가 다시 사용된다.
- 컨테이너가 실행되는 동안 발생한 모든 변경사항은 최상단에 위치한 읽기/쓰기가 가능한 레이어에 저장된다.
VM vs 컨테이너 비교
VM(Virtual Machine)은 독립적인 운영체제를 실행하기 때문에 자원소모가 큰 반면, 컨테이너는 OS커널을 공유하므로 같은 호스트에서 여러 컨테이너를 쉽게 실헹할 수 있다. 따라서, 컨테이너는 VM에 비해 가볍고 빠르며, 개발 및 배포 프로세스를 간소화할 수 있다.

예시 : MacOS로 Windows기반 애플리케이션을 실행하는 경우
- VM 사용
: VMware 또는 VirtualBox와 같은 가상머신 소프트웨어를 사용하여 Windows를 가상환경에 설치한다. 이 때 Windows는 가상머신 안에서 독립적으로 실행되는 운영체제이며, 그 위에 Windows기반 애플리케이션을 설치하여 실행해야한다.
- 컨테이너 사용
: Docker와 같은 컨테이너 기술을 통해 컨테이너화하며, 대부분의 컨테이너는 리눅스 커널을 사용하므로 리눅스 기능을 활용하여 애플리케이션을 실행한다. 컨테이너에는 필요한 모든 라이브러리가 포함되어있기 때문에 별도로 Windows를 설치할 필요가 없다.
Docker 사용
Docker 설정 시기
도커는 프로젝트가 복잡해질수록 적용하기 어려워지므로 프로젝트 초기단계에 설정하는 것이 좋다. 초기단계에서 Dockerfile과 Docker Compose를 설정하면 개발과 배포 환경의 일관성을 유지할 수 있고, 개발자 간의 협업이 더 원할해질 수 있다. 따라서 프로젝트 완료 후에 도커를 추가할 수 있지만 초기부터 설계에 포함시키는 것이 일반적이다.
컨테이너화 & 오케스트레이션
컨테이너화 플랫폼
- Docker
: 애플리케이션을 컨테이너로 패키징하고 실행하기 위해 사용한다.
오케스트레이션 도구
- Docker Compose
: 다중 서비스 애플리케이션의 구성 및 관리를 위한 도구로, 로컬 개발환경에서 여러 컨테이너가 필요한 경우에 사용한다. 단, 컨테이너 수가 많아지거나 복잡한 오케스트레이션이 필요해지면 관리하기 어려워질 수 있다.
- Docker Swarm
: 여러 도커 엔진을 클러스터로 묶어 자동 스케일링 및 로드 밸런싱 기능을 제공하는 도구로 소규모 클러스터에서 간단한 오케스트레이션이 필요한 경우에 적합하다.
- Kubernates
: 복잡한 대규모 애플리케이션의 배포, 관리, 스케일링을 지원하는 오케스트레이션 시스템이다.
Docker로 SpringBoot 구축하기
- Dockerfile
: 애플리케이션의 이미지 빌드를 위한 설정 파일로 프로젝트의 루트 디렉토리에 작성한다.
- Docker Compose
: 여러 컨테이너를 함께 정의하고 관리하는 도구로 프로젝트 루트 디렉토리에 docker-compose.yml 파일을 작성한다.
- Spring Boot Gradle Plugin
: Spring Boot 애플리케이션을 jar/war로 패키징하고, 도커 이미지로 빌드할 때 사용할 수 있는 여러 설정을 제공하는 플러그인으로 build.gradle에 추가한다.
Docker로 배포하기
- 컨테이너화된 애플리케이션을 실제 운영환경에 배포하며 사용자가 애플리케이션에 접근할 수 있도록 설정하고, 필요에 따라 업데이트 및 유지보수를 수행한다.
- 이미지를 만들어 Docker Hub와 같은 저장소에 올리거나, 로컬/원격 서버에서 Docker를 실행하여 애플리케이션을 배포한다.
- Dockerfile을 사용하여 이미지를 생성한 후, Docker Hub와 같은 레지스트리에 Push하고, 오케스트레이션 도구를 사용하여 관리하며, 필요한 환경에서 해당 이미지를 Pull하여 컨테이너를 실행한다.