docker

Docker 기초 이론

jhyngu 2025. 1. 21. 15:26

1) Docker


Docker

도커는 애플리케이션과 필요한 실행 환경을 하나의 컨테이너로 묶어 어디서나 동일하게 실행할 수 있도록 도와주는 오픈소스 가상화 플랫폼이다.

특징

  • 컨테이너 기반 : 애플리케이션과 실행 환경을 격리하여 경량화된 가상화 환경 제공
  • 이식성 : 로컬, 서버, 클라우드 등 어디서나 동일하게 실행 가능.
  • 빠름 : 기존 가상머신(VM)보다 가볍고 실행 속도가 빠름.
  • 자동화 : 배포와 관리를 단순화하여 CI/CD 파이프라인에 활용 가능.

구성 요소

  • 도커 이미지(Image) : 컨테이너 실행에 필요한 템플릿.
  • 도커 컨테이너(Container) : 이미지를 실행한 독립적인 환경.
  • 도커 허브(Docker Hub) : 이미지 저장소.
  • 도커 엔진(Docker Engine) : 컨테이너를 관리하는 핵심 소프트웨어.

 

1. Docker 사용 목적


1. 애플리케이션 실행 환경 표준화

  • 도커는 애플리케이션과 그 실행환경(라이브러리, 설정 등)을 컨테이너로 묶어 어디서나 동일한 환경에서 실행되도록 보장한다.
  • 개발 환경에서 잘 작동하던 코드가 운영 환경에서 오류를 일으키는 문제를 방지한다.

2. 배포와 관리의 단순화

  • 컨테이너는 경량화되어 빠르게 생성, 삭제, 재배포가 가능하다.
  • 이를 통해 애플리케이션 배포 속도와 효율성이 크게 향샹된다.

3. 리소스 절약

  • 기존 가상머신처럼 전체 OS를 가상화하지 않기 때문에, CPU와 메모리 사용량이 최소화되고 더 많은 애플리케이션을 실행할 수 있다.

4. 이식성 강화

  • 도커 컨테이너는 로컬 PC, 테스트 서버, 클라우드 등 다양한 환경에서 동일하게 동작한다.
  • 특정 플랫폼에 종속되지 않아 유연성이 높아진다.

5. 자동화와 확장성

  • CI/CD 파이프라인에 통합하여 빌드, 테스트, 배포를 자동화할 수 있다.
  • 마이크로서비스 아키텍처와 잘 맞아 대규모 시스템에서도 확장성을 제공한다.

6. 협업 향상

  • 개발자가 동일한 컨테이너 환경을 공유함으로써, 팀 간 협업이 원활해진다.

 

2. VM(Virtual Machine)과의 차이


Docker

  • 경량화된 컨테이너를 사용해 애플리케이션을 효율적으로 실행하고 배포한다. 빠르고 리소스 사용량이 적다.

VM

  • 독립된 OS 환경이 필요하거나 하드웨어 수준의 격리가 중요한 경우에 적합하다.
항목 도커(Docker) 가상머신(VM)
가상화 방식 프로세스 수준 가상화(컨테이너 기반) 하드웨어 수준 가상화 (호스트 OS 위에 게스트 OS)
운영체제 호스트 OS를 공유, 별도 OS 없음 각 VM마다 게스트 OS 필요
속도 컨테이너 생성/삭제가 수 초 이내로 매우 빠름 VM 부팅/종료는 분 단위로 느림
리소스 사용량 애플리케이션이 필요한 자원만 사용, 경량화된 구조 게스트 OS로 인해 더 많은 CPU, 메모리 소모
이미지 크기 수 MB ~ 수백 MB로 작음 수 GB로 큼
이식성 어디서나 동일한 환경에서 실행 가능 이식성 제한, 하드웨어와 호환성 이슈 발생 가능
유연성 컨테이너 간 격리 가능, 필요 시 자원 공유 가능 VM 간 완전한 격리
관리 도구 Docker CLI, Docker Compose, Kubernetes 등 VM 관리 도구 (vSphere, Hyper-V 등) 사용
주요 용도 애플리케이션 배포, 마이크로 서비스, DevOps 환경 전체 OS 가상화, 다양한 OS 실행, 멀티 OS 테스트

 

3. Docker 아키텍처 및 흐름


 

Docker 아키텍처

1. Client (클라이언트)

  • 역할 : 사용자가 Docker를 제어하는 인터페이스
  • docker CLI(Command Line Interface) 또는 REST API를 통해 Docker Host(Daemon)와 통신.
  • 명령어 예시 : docker build, docker run, docker pull, docker push

2. Docker Host (도커 호스트)

  • 구성 : 
    • Docker Daemon (dockerd) : 컨테이너 관리, 이미지 생성, 네트워크 설정 등 Docker의 핵심 작업 처리.
    • Container Runtime : 컨테이너를 실행하는 엔진 (runC 등).
    • Images : 컨테이너 실행을 위한 템플릿.
    • Containers : 실행 중인 애플리케이션 환경.
  • Docker Host는 클라이언트에서 전달된 명령을 받아 컨테이너를 실행하고 관리한다.

3. Registry (레지스트리)

  • 역할 : Docker 이미지를 저장하고 관리하는 중앙 저장소.
  • Public: Docker Hub (기본 설정).
  • Private : 기업용으로 자체 Docker Registry를 설정 가능.
  • Docker Host는 docker pull 명령으로 이미지를 가져오고, docker push로 이미지를 업로드한다.

 

 

Docker의 동작 흐름

1. Client -> Docker Host

  • 클라이언트(Client)는 도커 명령어를 사용하여 Docker Host로 요청을 보낸다.
    • 예 : docker run, docker build, docker pull, docker push 등.
  • 이 요청은 Docker CLI 또는 REST API를 통해 전달된다.
  • 클라이언트는 사용자가 명령어를 입력하고 도커 호스트에서 작업을 요청하는 사용자 인터페이스 역할을 한다.

2. Docker Host

  • 도커 호스트(Docker Host)는 클라이언트의 요청을 받아 이를 처리한다.
  • 주요 작업 : 
    • 컨테이너 생성/중지/삭제 : 요청에 따라 컨테이너를 실행하거나 중지, 삭제한다.
    • 이미지 관리 : 이미지를 빌드하거나, 로컬 저장소에서 이미지를 검색한다.
    • 네트워크 설정 : 컨테이너 간의 네트워크 연결을 설정하거나 관리한다.
    • 리소스 제어 : 컨테이너의 CPU, 메모리 사용량 등을 제한하거나 관리한다.
  • 구성 요소 :
    • Docker Daemon : 모든 요청을 처리하는 도커의 핵심 엔진.
    • Container Runtime : 컨테이너 실행을 담당(runC 등).

3. Docker Host -> Registry

  • 클라이언트가 이미지 생성(Build) 후, 해당 이미지를 저장하거나 공유하기 위해 Docker Host는 Docker Registry에 이미지를 업로드(docker push)한다.
  • 이미지 다운로드 : Docker Host는 로컬에 필요한 이미지가 없을 경우, 클라이언트 요청에 따라 Docker Registry에서 이미지를 다운로드(docker pull)한다.
  • 이미지 캐싱 : 다운로드된 이미지는 Docker Host의 로컬 캐시에 저장되며, 이후 동일한 이미지를 다시 사용할 때 다운로드하지 않아도 된다.

4. Registry

  • 도커 레지스트리(Registry)는 도커 이미지를 저장하고 관리하는 중앙 집중식 저장소이다.
  • 종류 : 
    • Public Registry : 기본적으로 Docker Hub 사용.
    • Private Registry : 회사나 조직이 내부적으로 이미지를 관리하기 위해 사용하는 비공개 저장소.
  • Registry는 이미지를 팀원 또는 다른 환경에서 재사용 가능하도록 관리하며, Docker Host와 데이터를 주고 받습니다.

5. Docker Host -> Client

  • 클라이언트가 요청한 작업(예 : 컨테이너 실행, 이미지 다운로드 등)이 완료되면, Docker Host는 결과를 클라이언트에 반환한다.
  • 결과 : 
    • 컨테이너 실행 상태.
    • 이미지 빌드 로그.
    • 다운로드된 이미지 목록 등.
  • 클라이언트는 Docker CLI를 통해 이 정보를 사용자에게 출력한다.

전체 흐름 요약

1. Client -> Docker Host : 사용자가 명령어 입력 -> 요청 전달.

2. Docker Host 처리 : 요청에 따라 컨테이너 실행, 이미지 빌드, 네트워크 관리.

3. Docker Host <-> Registry : 필요 시 이미지를 업로드(push)하거나 다운로드(pull).

4. Docker Host -> Client : 작업 결과를 클라이언트에 반환.

 

2) Docker 주요 용어


 

용어 분류 설명
도커 클라이언트 (Docker Client) 아키텍처 요소 도커를 사용하기 위한 커맨드 라인 도구입니다. 도커 호스트와 상호 작용하며, 이미지 관리 및 컨테이너 실행 등을 수행합니다.
도커 호스트 (Docker Host) 아키텍처 요소 도커 이미지를 저장하고, 컨테이너를 실행하며, 도커 클라이언트와 통신하는 역할을 합니다.
도커 레지스트리 (Docker Registry) 아키텍처 요소 도커 이미지를 저장하는 중앙 저장소입니다. 도커 클라이언트는 여기에서 이미지를 검색하고, 푸시(push), 풀(pull)할 수 있습니다.
도커 데몬 (Docker Daemon) 구성요소 도커 호스트에서 실행되는 백그라운드 프로세스로, 도커 클라이언트와 통신하며 이미지와 컨테이너를 관리합니다.
도커 이미지 (Docker Image) 구성요소 컨테이너 실행에 필요한 파일과 설정을 포함한 가볍고 독립적인 실행 패키지입니다. 도커 파일을 사용해 빌드하거나 레지스트리에서 가져옵니다.
도커 컨테이너 (Docker Container) 구성요소 도커 이미지의 실행 인스턴스로, 격리된 환경에서 실행되며 운영 체제 수준의 가상화를 통해 프로세스를 격리합니다.
도커 허브 (Docker Hub) 구성요소 도커 커뮤니티에서 제공하는 공개 도커 레지스트리로, 다양한 이미지를 검색, 공유, 다운로드할 수 있습니다.
도커 파일 (Docker File) 구성요소 도커 이미지를 빌드하기 위한 텍스트 파일로, 이미지 구성을 위한 명령어와 설정을 포함하여 이미지 빌드 프로세스를 자동화합니다.

 

 

1. 도커 클라이언트(Docker Client)


 

 

도커 클라이언트는 사용자가 도커를 조작하고 관리하기 위해 사용하는 주요 인터페이스로, 도커 CLI(Command Line Interface)로 구현되어 있다. 사용자는 명령어를 통해 도커 클라이언트를 호출하고, 이를 통해 도커 호스트나 도커 데몬과 통신한다.

 

도커 클라이언트는 내부적으로 도커 API를 사용하여 요청을 도커 데몬에 전달하고, 도커 데몬이 요청을 처리한 결과를 사용자에게 반환한다.

 

주요 기능

  • 도커 이미지 관리
    • 이미지를 다운로드(pull), 업로드(push), 삭제(remove)할 수 있다.
    • docker pull <이미지명>
    • docker push <이미지명>
  • 컨테이너 실행 및 관리
    • 컨테이너를 생성, 실행, 중지, 삭제하는 명령을 실행한다.
    • docker run <이미지명>
    • docker stop <컨테이너명>
    • docker rm <컨테이너명>
  • 네트워크 및 볼륨 관리
    • 컨테이너 네트워크를 생성하고 관리할 수 있다.
    • 데이터 저장을 위한 볼륨을 생성, 확인, 삭제할 수 있다.
    • docker network create <네트워크명>
    • docker volume create <볼륨명>
  • 도커 환경 점검
    • 도커 설치 버전과 상태를 확인하고, 실행 중인 컨테이너와 이미지를 나열한다.
    • docker -v
    • docker ps -a
    • docker image ls

 

2. 도커 호스트(Docker Host) = 도커 서버(Docker Server)


도커 호스트는 도커 컨테이너와 이미지를 실행하고 관리하기 위한 물리적 서버 또는 가상머신이다.

도커 호스트는 도커 데몬(dockerd)을 실행하며, 도커 클라이언트와의 상호작용을 통해 컨테이너 생성, 삭제, 네트워크 설정 등 다양한 작업을 수행한다.

 

주요 기능 

  • 이미지 관리 : 
    • 도커 호스트는 도커 레지스트리(Docker Registry)에서 이미지를 가져오고, 로컬에 저장한다.
  • 컨테이너 관리 :
    • 컨테이너를 생성, 시작, 중지, 삭제하는 작업을 수행한다.
  • 네트워크 관리 : 
    • 도커 네트워크를 통해 컨테이너 간의 통신을 설정하고 외부 네트워크와 연결한다.
  • 스토리지 관리 :
    • 컨테이너에서 데이터를 저장하거나 공유하기 위해 도커 볼륨과 바인드 마운트를 관리한다.
  • API 제공 : 
    • 도커 호스트는 REST API를 통해 외부 애플리케이션 또는 클라이언트와 상호작용할 수 있다.

 

3. 도커 레지스트리(Docker Registry)


도커 레지스트리는 도커 이미지를 저장하고 배포하는 중앙 저장소이다. 사용자는 도커 레지스트리를 통해 이미지를 업로(푸시)하거나 다운로드(풀)하여 컨테이너 실행에 필요한 이미지를 관리할 수 있다.

 

주요 기능

  • 이미지 업로드(Push) :
    • 로컬에서 생성한 이미지를 레지스트리에 업로드하여 다른 환경에서 재사용할 수 있다.
  • 이미지 다운로드(Pull) :
    • 레지스트리에서 이미지를 가져와 컨테이너를 실행할 수 있다.
  • 이미지 버전 관리 :
    • 동일한 이미지의 여러 버전을 태그(tag)를 통해 관리한다.
  • 보안 및 인증 : 
    • 프라이빗 레지스트리는 인증 및 권한 관리를 통해 보안을 강화할 수 있다.

 

4. 도커 데몬(Docker Daemon)


도커 데몬은 도커의 핵심 백그라운드 프로세스로, 도커 클라이언트와 상호작용하여 도커 컨테이너를 관리하고, 도커 이미지, 네트워크, 볼륨 등을 처리한다. 보통 dockerd라는 이름으로 실행되며, 도커 시스템의 모든 요청을 실제로 처리하는 역할을 한다.

 

 

5. 도커 이미지(Docker Image)


도커 이미지는 컨테이너를 실행하는 데 필요한 모든 파일과 설정을 포함하는 가볍고 독릭적인 실행 가능한 패키지이다.

소프트웨어 배포와 실행을 일관되게 만들기 위해 설계되었다.

 

1. 애플리케이션 배포 : 

  • 애플리케이션과 그 의존성을 포함한 이미지를 생성하여 배포한다.

2. 환경 표준화 : 

  • 동일한 이미지를 사용하여 개발, 테스트, 프로덕션 환경의 일관성을 유지한다.

3. 빠른 배포 : 

  • 도커 이미지를 통해 새로운 컨테이너를 즉시 실행 가능하게 만든다.

 

 

6. 도커 컨테이너(Docker Container)


도커 컨테이너는 도커 이미지의 실행 가능한 인스턴스로, 운영 체제 수준에서 격리된 환경에서 애플리케이션을 실행한다.

컨테이너는 가볍고, 독립적이며, 빠르게 시작 및 중지될 수 있어 현대 애플리케이션 개발과 배포의 핵심이 된다.

 

 

7. 도커 허브(Docker Hub)


도커 허브는 도커 컨테이너 이미지를 공유하고 관리하기 위한 클라우드 기반 레지스트리이다.

도커 허브를 사용하면 컨테이너 이미지를 업로드, 다운로드 및 공유할 수 있다. 또한 도커 허브는 공식적인 이미지 저장소로서 다양한 언어, 프레임워크, 데이터베이스 등의 컨테이너 이미지를 제공한다.

 

사용자는 도커 허브에서 이미지를 검색하고 필요한 이미지를 사용할 수 있다. 도커 허브는 개인 및 조직용 계정을 제공하여 이미지를 관리하고 접근 권한을 제어할 수도 있다. 도커 허브는 도커 생태계에서 핵심적인 역할을 담당하며, 컨테이너 기반 애플리케이션 개발과 배포를 위한 필수 도구이다.

 

 

8. 도커 파일(Dockerfile)


도커 이미지를 만들고 빌드하기 위한 텍스트 파일을 의미한다. 이는 컨테이너 이미지를 구성하는데 필요한 모든 단계와 명령을 정의한다.

 

도커 파일은 일련의 명령을 작성하여 이미지를 빌드하는 방법을 지정한다. 일반적으로 도커 파일은 기본 이미지를 지정하고, 필요한 패키지를 설치하고, 파일을 복사하며, 명령을 실행하는 등의 작업을 수행한다.

 

각 명령은 도커 파일에서 한 줄씩 작성되며, 이전 단계의 결과를 기반으로 수행된다.

 

도커 파일을 사용하면 반복적이고 일관적인 컨테이너 이미지 빌드 프로세스를 자동화할 수 있다. 도커 파일을 작성하고 빌드하면 도커 엔진이 자동으로 이미지를 생성하고 저장할 수 있다.