1. Docker의 개념: 컨테이너 기반 가상화 vs. VM
VM과 컨테이너의 구조를 비교하면, VM은 하이퍼바이저 위에서 각각 게스트 OS를 포함하는 반면, 컨테이너는 Docker와 같은 컨테이너 엔진 위에서 호스트 OS의 커널을 공유하며 애플리케이션과 라이브러리만 포함한다.
컨테이너는 운영체제 수준에서 격리된 가상화 환경을 제공하며, 별도의 게스트 OS를 포함하지 않기 때문에 VM보다 훨씬 경량이고 빠르게 실행된다.
또한, 컨테이너는 프로세스 격리를 통해 애플리케이션을 다른 환경과 분리함으로써 시스템 간 간섭을 최소화한다.
Docker는 이러한 컨테이너 기술을 활용해 애플리케이션을 패키징하고 배포하는 플랫폼이다. Docker 컨테이너의 주요 이점은 다음과 같다.
- 경량성 & 효율성시작 속도가 수 초 이내로 매우 빠르며, 동일한 자원에서 VM보다 많은 수의 컨테이너를 실행할 수 있다.
- 컨테이너는 게스트 OS를 포함하지 않아 이미지 크기가 작고 메모리 사용량이 적다.
- 이식성 (Portability)이로 인해 로컬 PC, 서버, 클라우드 등 어느 환경에서도 일관되게 실행된다.
- Docker 컨테이너는 애플리케이션과 모든 의존성을 하나의 표준화된 패키지로 묶는다.
- 격리 및 일관성불변(immutable) 이미지를 기반으로 하기 때문에 배포 시 항상 동일한 상태를 유지한다.
- 각 컨테이너는 고립된 사용자 공간에서 실행되어 서로 간섭하지 않으며, 호스트 시스템에도 영향을 최소화한다.
- 확장성과 유연성필요에 따라 컨테이너 인스턴스를 신속히 확장하거나 축소할 수 있으며, 오케스트레이션 도구와 연계하여 자동 확장이 가능하다.
- 애플리케이션을 작은 단위로 나누어 배포할 수 있어 마이크로서비스 아키텍처에 적합하다.
2. Docker의 기본 구성 요소 및 개념
Docker를 효과적으로 사용하기 위해서는 다음과 같은 기본 개념을 숙지해야 한다.
2.1 Docker 이미지(Image)와 컨테이너(Container)
- 이미지(Image):애플리케이션 코드, 라이브러리, 종속성, 설정 등이 계층(layer)별로 저장된다.
- 컨테이너 실행에 필요한 파일 시스템과 설정을 모두 담은 불변(읽기 전용) 템플릿이다.
- 컨테이너(Container):읽기 전용 이미지 위에 읽기/쓰기 레이어를 추가하여 동작하며, 하나의 이미지로부터 여러 컨테이너를 생성할 수 있다.
- 이미지를 기반으로 실행되는 인스턴스이다.
2.2 Dockerfile – 이미지 빌드 스크립트
- Dockerfile:
이미지를 생성하기 위한 설정 파일이다.
텍스트 형태의 명령어 지침을 통해 기반 이미지 선택(FROM
), 패키지 설치(RUN
), 소스 코드 복사(COPY
), 컨테이너 시작 명령(CMD
/ENTRYPOINT
) 등을 기술한다.
Dockerfile을 기반으로docker build
명령을 통해 이미지를 생성한다.
2.3 레지스트리(Registry)와 Docker Hub
- 레지스트리(Registry):로컬 저장도 가능하나, 팀원이나 다른 서버와의 공유를 위해 레지스트리에 업로드한다.
- 빌드된 Docker 이미지들을 저장하고 공유하는 중앙 저장소이다.
- Docker Hub:기본 설정으로 제공되며, 공개 이미지를 push/pull할 수 있다.
- 기업 환경에서는 AWS ECR, Azure ACR, Google GCR 등의 클라우드 레지스트리 또는 사설 레지스트리를 사용할 수 있다.
- 가장 널리 사용되는 공개 이미지 레지스트리이다.
2.4 데이터 관리: 볼륨(Volume)과 네트워크(Network)
- 볼륨(Volume):데이터베이스와 같이 상태를 유지해야 하는 애플리케이션에서 주로 사용하며, 컨테이너 삭제 후에도 데이터를 유지할 수 있다.
- 컨테이너의 휘발성 파일 시스템과 별개로 데이터를 영구적으로 저장하기 위한 메커니즘이다.
- 네트워크(Network):기본적으로 Docker는 브리지(bridge) 네트워크를 생성하며, 컨테이너 실행 시
-p
옵션으로 포트 매핑을 통해 외부 접근을 허용한다. - 컨테이너 간 통신 및 외부 네트워크와의 연결을 위한 가상 네트워크를 제공한다.
2.5 Compose와 Orchestration (Docker Compose 및 Kubernetes)
- Docker Compose:
docker-compose.yml
파일에 각 서비스를 정의한 후docker-compose up
명령으로 관련 컨테이너들을 일괄 실행한다. - 주로 단일 호스트 환경에서 로컬 개발 및 테스트 용도로 사용된다.
- 다중 컨테이너 애플리케이션을 정의하고 한꺼번에 실행할 수 있도록 하는 도구이다.
- Kubernetes:컨테이너의 배포, 확장, 로드밸런싱, 모니터링 등을 자동화하며, 대규모 분산 환경에서 안정적 운영을 지원한다.
- Docker로 빌드한 이미지를 Kubernetes가 받아 컨테이너(파드)를 생성하고 관리한다.
- 다수의 컨테이너를 자동으로 관리하기 위한 오케스트레이션 도구이다.
3. Docker의 기본 도구 및 용어
Docker 환경에서 자주 사용되는 도구와 용어는 다음과 같다.
3.1 Docker CLI와 주요 명령어
docker build
보통-t
옵션으로 이미지에 태그를 부여하며, 빌드 컨텍스트(일반적으로 현재 디렉토리)를 지정한다.- Dockerfile을 해석하여 새로운 이미지를 생성한다.
docker run
이미지가 로컬에 없으면 자동으로 pull한 후 컨테이너를 생성한다.- 옵션으로 포트 공개(
-p
), 백그라운드 실행(-d
), 볼륨 마운트(-v
) 등을 지정할 수 있다. - 지정한 이미지를 기반으로 새 컨테이너를 실행한다.
docker ps
docker ps -a
를 사용하면 중지된 컨테이너까지 모두 확인할 수 있다.- 현재 실행 중인 컨테이너 목록을 표시한다.
docker stop
필요에 따라 일정 시간 후 강제 종료(SIGKILL)할 수 있다.- 실행 중인 컨테이너에 SIGTERM 신호를 보내어 정지시킨다.
docker rm
docker rm -f
명령을 사용하면 실행 중인 컨테이너를 강제 정지 및 삭제할 수 있다.- 중지된 컨테이너를 삭제한다.
- 기타 명령어
docker images
: 로컬에 존재하는 이미지 목록 표시docker rmi
: 이미지 삭제docker pull
: 레지스트리로부터 이미지 다운로드docker push
: 이미지를 레지스트리에 업로드docker exec
: 실행 중인 컨테이너 내부에서 명령 실행docker logs
: 컨테이너 로그 출력
3.2 Docker Compose
Docker Compose는 별도의 CLI 도구로 제공되며, Compose YAML 파일(일반적으로 docker-compose.yml
)에 여러 컨테이너 서비스를 정의한 후 docker-compose up
명령을 통해 모든 서비스를 빌드 및 실행한다.
이 도구는 멀티 컨테이너 애플리케이션을 코드로 정의하여 로컬 개발 환경을 효율적으로 구성하고 온보딩 시간을 단축하는 데 기여한다.
단, Compose는 클러스터 관리 기능을 제공하지 않으므로 복잡한 분산 배포에는 Kubernetes 등 다른 오케스트레이션 도구를 사용해야 한다.
3.3 Docker Registry
레지스트리는 Docker 이미지들을 저장하는 중앙 저장소이다.
- 공개 레지스트리 (Docker Hub):
- 전 세계 개발자들이 공유하는 기본 공개 레지스트리이다.
- 사설 레지스트리:
- 기업 내부에서 운영되는 전용 레지스트리로, 접근 권한을 제어하여 민감한 애플리케이션 이미지를 안전하게 관리한다.
Docker는 이미지 이름을 <레지스트리 주소>/<계정>/<이미지이름>:태그
형식으로 지정하여 특정 레지스트리에서 이미지를 pull할 수 있다.
3.4 컨테이너 네트워크 드라이버
Docker는 여러 네트워크 드라이버를 제공하여 컨테이너 간 통신 및 외부 네트워크 연결을 지원한다.
- Bridge:별도로 지정하지 않으면 모든 컨테이너가 기본
bridge
네트워크에 연결된다. - 기본 네트워크 드라이버로, 하나의 호스트 내에서 컨테이너들이 내부 가상 네트워크를 통해 서로 통신하도록 한다.
- Host:별도의 가상 네트워크 없이 호스트의 네트워크를 공유하므로, 컨테이너 내부 포트가 곧 호스트 포트가 된다.
- 컨테이너가 호스트의 네트워크 네임스페이스와 완전히 통합된다.
- None:
- 컨테이너에 네트워크 인터페이스를 할당하지 않아 모든 네트워크 기능을 비활성화한다.
- Overlay:Docker Swarm이나 Kubernetes 환경에서 여러 노드의 컨테이너들을 하나의 논리적 네트워크로 연결한다.
- 다중 호스트에 걸쳐 분산 네트워크를 구성할 때 사용된다.
3.5 스토리지: 볼륨 vs. 바인드 마운트
컨테이너에서 데이터를 유지하거나 공유하기 위해 마운트(Mount) 기능을 사용한다.
- 볼륨 (Docker Volume):여러 컨테이너 간 데이터 공유가 가능하며, 컨테이너가 삭제되어도 데이터는 유지된다.
- Docker가 관리하는 전용 디렉토리에 데이터를 저장하여 컨테이너 수명과 별개로 영구적으로 보존한다.
- 바인드 마운트 (Bind Mount):개발 시 소스 코드 디렉토리를 컨테이너에 마운트하여 바로 테스트하는 용도로 유용하다.
- 단, 호스트 OS의 파일 시스템을 직접 사용하므로 권한 제어나 보안에 주의해야 한다.
- 호스트의 특정 디렉토리나 파일을 컨테이너에 직접 연결한다.
4. Docker 활용 사례: 백엔드 개발 및 DevOps
4.1 로컬 백엔드 개발 환경
- Docker를 활용해 필요한 DB, 캐시(redis), 메시지 브로커 등의 서비스를 컨테이너로 쉽게 띄울 수 있다.
- Docker Compose를 사용하면 여러 서비스를 한 번에 정의하고 실행할 수 있어, 팀 내 모든 개발자가 동일한 환경에서 작업할 수 있다.
- 컨테이너 격리를 통해 개발 머신에 불필요한 패키지 설치를 방지하고, 새로운 팀원이 빠르게 환경을 구축할 수 있다.
4.2 CI/CD 파이프라인과 DevOps
- 코드 변경 시 CI 서버가 자동으로 Docker 이미지를 빌드하고, 해당 이미지로 테스트를 수행한다.
- 테스트를 통과하면 빌드된 이미지를 레지스트리에 푸시하고, CD 단계에서 운영 환경에 컨테이너로 배포한다.
- Docker 이미지가 애플리케이션 버전의 불변 아티팩트로 관리되어, 롤백이나 배포 추적이 용이하다.
4.3 컨테이너 오케스트레이션과 Kubernetes 연계
- 운영 환경에서 수십~수백 개의 컨테이너를 관리하기 위해, Kubernetes와 같은 오케스트레이션 도구를 사용한다.
- Kubernetes는 컨테이너의 배포, 확장, 로드밸런싱, 모니터링을 자동화하며, 컨테이너 상태를 지속적으로 체크하고 자체 치유 기능을 제공한다.
- 개발 단계에서 Docker로 이미지를 생성하고, 운영 단계에서는 Kubernetes가 해당 이미지를 받아 컨테이너를 생성 및 관리하는 구조로 파이프라인을 구축할 수 있다.
출처
- Docker 공식 문서
- IBM Cloud Tech
- CircleCI 블로그
'WEB BE > 배포 및 운영' 카테고리의 다른 글
백엔드 개발자를 위한 서버, 프록시 서버, 로드 밸런싱 면접 질답 (0) | 2025.03.10 |
---|---|
CI/CD 와 무중단 배포 (0) | 2025.03.10 |