Docker가 등장한 배경
개발자의 로컬 환경에서는 잘 동작하던 애플리케이션이 서버에 배포하면 오류가 나는 상황은 매우 흔하다. 운영체제 버전, 라이브러리 버전, 환경 변수, 디렉토리 구조 등 환경 차이가 원인이다. Docker는 이 문제를 근본적으로 해결하기 위해 등장했다. 애플리케이션과 그 실행에 필요한 모든 의존성을 하나의 패키지(컨테이너)로 묶어 어떤 환경에서든 동일하게 동작하도록 보장한다.
이미지와 컨테이너
Docker의 핵심 개념은 이미지(Image)와 컨테이너(Container)다. 이미지는 애플리케이션 실행에 필요한 코드, 런타임, 라이브러리, 설정 파일을 모두 포함한 읽기 전용 템플릿이다. 컨테이너는 이 이미지를 기반으로 실제로 실행 중인 인스턴스다. 하나의 이미지에서 여러 개의 컨테이너를 동시에 띄울 수 있다. 클래스와 객체의 관계에 비유하면 이해가 쉽다. 이미지가 클래스, 컨테이너가 그 클래스로 생성된 객체다.
Dockerfile
Docker 이미지를 만드는 설계도가 Dockerfile이다. 베이스 이미지를 지정하고(FROM), 필요한 패키지를 설치하고(RUN), 소스 코드를 복사하고(COPY), 실행 명령어를 정의하는(CMD) 순서로 작성한다. Dockerfile을 docker build 명령어로 빌드하면 이미지가 생성된다. 이 Dockerfile을 Git에 함께 관리하면 누구든 동일한 이미지를 재현할 수 있어 환경 일관성이 보장된다.
Docker Hub와 레지스트리
Docker Hub는 Docker 이미지의 공개 저장소다. nginx, mysql, python, node 같은 공식 이미지를 누구나 무료로 다운로드(pull)할 수 있다. docker pull nginx 한 줄이면 최신 Nginx 이미지를 로컬에 받아올 수 있다. 기업 환경에서는 사내 전용 이미지를 보관하기 위해 프라이빗 레지스트리(Harbor, AWS ECR, GCP Artifact Registry)를 운영한다.
Docker Compose
실제 서비스는 단일 컨테이너로 동작하지 않는 경우가 많다. 웹 애플리케이션, 데이터베이스, 캐시 서버가 함께 동작해야 한다. Docker Compose는 여러 컨테이너의 설정을 docker-compose.yml 파일 하나에 정의하고, docker compose up 한 줄로 전체 스택을 한꺼번에 실행할 수 있게 해준다. 개발 환경에서 복잡한 멀티 컨테이너 구성을 간편하게 관리하는 도구로 사실상 필수다.
Docker의 한계와 오케스트레이션
Docker는 단일 호스트에서 컨테이너를 관리하는 도구다. 서버가 여러 대로 늘어나면 어떤 서버에 어떤 컨테이너를 배치할지, 컨테이너가 죽으면 어떻게 재시작할지, 트래픽 증가 시 컨테이너를 몇 개까지 늘릴지를 자동으로 판단하는 시스템이 필요하다. 이 역할을 하는 것이 컨테이너 오케스트레이션 도구이며, Kubernetes가 사실상의 표준이다. Docker가 컨테이너를 만들고 실행하는 엔진이라면, Kubernetes는 그 컨테이너들을 클러스터 규모에서 관리하는 지휘자다.
답글 남기기