[Docker] Docker의 핵심 구조 이해하기
2026. 5. 16. 16:28

 

 Docker를 사용하는 이유에 대하여 학습한 것에 이어 핵심 구조에 대하여 이해해보는 시간을 가졌다. 

 

1. Docker의 기본 아키텍처

 Docker는 클라이언트(Client) - 서버(Host)의 구조로 동작한다. 사용자가 명령어를 입력하면 Docker 데몬이 이 명령어를 해석하고 실행하는 방식으로 동작한다.

 

● Docker Client: 사용자가 docker build, docker run 등의 명령어를 입력하면 REST API로 변환하여 데몬에게 전달. 로컬뿐만 아니라 원격에 있는 Docker 데몬도 제어할 수 있음.

● Docker Host(Daemon): API 요청을 수신하여 실제로 컨테이너를 관리하고 이미지, 네트워크, 볼륨 등을 생성하는 핵심 엔진(dockerd). 

● Docker Registry: 이미지를 저장하고 공유하는 저장소 (ex. Docker Hub)

 

 

 

2. Docker의 3대 핵심 구성 요소

 Docker의 3대 요소로는 이미지(Image), 컨테이너(Container), 레지스트리(Registry)가 있다.

 

● 이미지(Image)

  - 여러 개의 Read-Only(읽기 전용) 레이어로 구성된다. Dockerfile의 각 명령어(FROM, RUN, COPY 등)는 새로운 레이어를 생성한다. 

  - 서로 다른 이미지라도 베이스 이미지가 같다면 해당 레이어를 공유하여 용량을 절약한다.

 

● 컨테이너(Container)

  - 컨테이너를 실행하면 이미지 레이어 위에 아주 얇은 Container Layer(Read-Write)가 추가된다.

  - 모든 변경 사항(파일 수정, 로그 등)은 이 쓰기 층에만 기록된다.

  - 컨테이너가 삭제되면 이 레이어도 사라지기 때문에, 데이터를 영구 저장하기 위해서는 Volume이 필수적이다. 

 

● 레지스트리(Registry)

  - 이미지(Image)를 보관하고 배포하는 장소이다.

  - 이미지를 push, pull 하는 등 공유한다.

  ● 동작 흐름

   1. 소스 코드 작성: 애플리케이션 코드 작성

   2. Dockerfile 정의: 코드를 실행할 환경(OS, 런타임, 환경변수)을 명시

   3. CI(Build & Push): Github Actions나 Jekins 같은 도구가 코드를 이미지로 빌드하고 레지스트리에 업로드

   4. CD(Pull & Run): 서버에서 최신 이미지를 내려받아 컨테이너 교체

 

 

3. Docker가 경량인 이유

 Docker가 기존의 가상 머신(VM)보다 가벼운 이유는 커널을 공유하며 리눅스 자체의 기술을 사용하기 때문이다. 

 

 1) 레이어 저장 방식(Union File System)

  Docker 이미지는 여러 개의 레이어(Layer)로 겹쳐져 있어 만약 이미지가 수정되어도 바뀐 부분만 새로운 레이어로 쌓이기 때문에 용량이 획기적으로 줄어들게 된다.

 

 2-1) 격리 기술(Namespaces)

  각 컨테이너가 독립된 공간(IP, 파일 시스템, 프로세스 ID 등)을 가진 것처럼 속이는 기술이다.

  • pid: 프로세스 번호 격리 (컨테이너 안의 1번 프로세스)
  • net: 네트워크 인터페이스 격리(컨테이너만의 고유 IP)
  • mnt: 파일 시스템 마운트 지점 격리
  • uts: 호스트네임 격리

  2-2) 격리기술(Control Groups)

  컨테이너가 사용할 CPU, 메모리 등의 자원 할당량을 제한하는 기술로, 호스트의 모든 CPU나 메모리를 점유하여 다른 프로세스에 영향을 주는 것을 방지한다.

 

 

 

4. Docker의 네트워크와 볼륨 (데이터와 통신)

 1) Docker Network

 Docker 네트워크는 격리된 컨테이너들이 서로 or 외부와 어떻게 연결되는지를 정의한다. 

 

  ① 네트워크 드라이버 종류

  Docker는 목적에 따라 여러 네트워크 모드를 제공한다.

  • Bridge(기본값): 동일한 Docker 호스트 내의 컨테이너들이 서로 통신할 때 사용하는데, docker0라는 가상 브릿지를 통해 각 컨테이너에 사설 IP가 할당된다.
  • Host: 컨테이너가 호스트의 네트워크 환경을 그대로 사용한다. 포트 포워딩 없이 호스트의 포트를 직접 점유하며, 네트워크 성능이 가장 빠르다.
  • None: 네트워크 연결을 아예 차단한다. 로컬 작업만 필요한 보안용 컨테이너에 사용한다.
  • Overlay: 여러 대의 Docker 호스트(Swarm 또는 클러스터)에 흩어져 있는 컨테이너들을 하나의 네트워크로 묶어준다.

  ② 포트 포워딩(Port Fowarding)

  컨테이너 내부에서 도는 서비스(ex. 8080포트)를 외부 사용자가 접속할 수 있게 호스트의 포트와 연결하는 기술로, -p 80:8080으로 호스트의 80포트로 접속하면 컨테이너의 8080포트로 전달하게 한다.

 

 2) Docker Volume & Mount 

 컨테이너의 파일 시스템은 컨테이너가 삭제되면 함께 사라지는데, 이를 방지하기 위해 호스트의 저장 공간을 컨테이너에 연결(Mount)하는 세 가지 방법이 있다.

 

  ① Volume(도커 관리형)

  Docker가 직접 호스트의 특정 영역(/var/lib/docker/volumes)에 저장 공간을 만들어 관리한다.

 ● 특징: Docker의 명령어로 관리 가능하며, 호스트의 파일 시스템 구조에 의존하지 않아 가장 권장되는 방식이다.

 ● 장점: 여러 컨테이너가 안전하게 데이터를 공유할 수 있고, 백업 및 이동이 쉽다.

 

  ② Bind Mount(사용자 지정형)

  사용자가 호스트의 특정 경로를 컨테이너 내부와 직접 연결한다.

 ● 특징: C:\Users\Project 같은 경로를 직접 지정할 수 있다.

 ● 장점: 개발 중인 소스 코드를 컨테이너에 실시간으로 동기화하여 바로 확인할 때 매우 유용하다.

 

  ③ tmpfs Mount(임시 저장형)

  데이터를 디스크가 아닌 호스트의 메모리(RAM)에 저장한다.

 ● 특징: 컨테이너가 중단되면 데이터가 사라진다.

 ● 장점: 보안상 중요한 정보(비밀번호 등)를 저장하거나, 아주 빠른 입출력이 필요한 임시 작업에 사용한다.

 

 

 5. 마무리하며

 이번에 Docker에 대한 개념을 공부해보았으니, 다음에는 Spring Boot에서 Dockerfile을 작성하는 방법에 대해서 공부해보고 실제로 작성해보아야겠다. Dockerfile까지 작성할 수 있게 된다면 프로젝트를 배포하는데에 한 발자국 더 가까워졌다는게 실감날 것 같다.

'[INFRA] > [DOCKER]' 카테고리의 다른 글

[Docker] Docker를 사용하는 이유  (0) 2026.05.15