Server

도커(Docker)에 대하여

지화자_ 2024. 6. 22. 23:56

오늘은 도커(Docker)에 대해서 알아볼게요

도커를 이해하기 전 먼저 가상화에 대한 개념 이해가 필요합니다.


 

가상화

하나의 실물 컴퓨팅 자원을 마치 여러 개의 가상 자원으로 쪼개서 사용하거나, 여러 개의 실물 컴퓨팅 자원을 묶어 하나의 자원처럼 사용할 수 있도록 하는 기술,서버의 자원을 효율적으로 분산하여 서버 관리의 유연성을 제공한다.

 

서버 가상화

 

하나의 물리적 서버 호스트에서 여러 개의 서버 운영 체제를 게스트로 실행할 수 있게 해주는 소프트웨어 아키텍처

 

 

가상 머신(Virtual machine)과 컨테이너(Container)

가상 머신과 컨테이너는 모두 애플리케이션을 격리된 환경에서 실행하기 위한 기술이지만, 동작 방식과 구조에는 차이가 있다.

출처 docker

  • 하이퍼바이저

서버 가상화 기술을 구현할 수 있게 하는 소프트웨어로 가상 머신의 자원 할당과 관리를 담당

대표적인 툴 vmare, Virtual Box

 

가상화 작업은 하이퍼바이저를 반드시 거쳐야 하므로 일반 호스트에 비해 성능 손실이 발생한다. 또한 여러 OS를 사용하기 위한 라이브러리나 커널 등이 전부 포함되어 있기 때문에 용량이 커진다는 단점이 있다.

  • 가상 머신

하이퍼바이저 위에서 실행되는 독립된 운영체제와 어플리케이션 환경으로 물리적 하드웨어 자원을 가상화하여 여러 운영체제를 동시에 실행할 수 있도록 한다. 또한 각 가상머신은 독립된 환경에서 실행되어 다른 가상 머신에 영향을 주지 않으므로 오류 발생 시 전체 가상머신에 영향을 주지 않는다.


 

 

도커(Docker)

컨테이너 기술에 여러 기능을 추가한 오픈소스 프로젝트

 

출처: docker

컨테이너

운영체제 수준에서 가상화를 제공하여 애플리케이션과 그 의존성을 격리하는 기술로 프로세스 단위의 격리 환경을( HOST OS와의 격리 ➡️ 독립된 개발 환경 보장 )제공한다.

 

- 컨테이너에는 애플리케이션 구동에 필요한 라이브러리와 실행 파일만 존재 ➡️ 이미지의 용량을 줄여 가상 머신보다 가볍고 빠르다

- 프로세스의 생명주기를 관리하며 실행하는 하나의 프로세스

 

➡️ 애플리케이션을 서로 독립된 환경에서 실행할 수 있게 하여 충돌을 방지하고 배포를 간소화함.

 

도커 엔진(Docker Engine)

유저가 컨테이너를 쉽게 사용할 수 있게 해주는 주체

출처 docker

 

역할

도커 엔진은 이미지 생성, 저장, 가져오기와 같은 관리 역할, 이미지를 기반으로 한 컨테이너 생성, 실행, 중지, 삭제의 역할을 수행한다. 또한 컨테이너들이 통신할 수 있도록 가상 네트워크를 생성하고, 컨터이너간 데이터를 공유하거나, 데이터 유지를 위한 볼륨 관리 등의 역할을 수행한다.

 

동작 과정

도커 클라이언트 (CLI)에 명렁어 입력을 통한 실행 요청 ➡️ 도커 데몬 API(dockered) 호출 ➡️  도커 데몬이 요청을 처리하고 필요한 작업(컨테이너 생성, 이미지 빌드 등) 수행 ➡️ 도커 데몬이 작업 결과를 CLI에 반환 ➡️ CLI가 결과를 사용자에게 출력

 

 

도커 스웜(Docker Swarm)

여러 도커 엔진을 클러스터로 묶어 단일 가상 시스템처럼 사용할 수 있도록 도와주는 도와주는 도구 (docker engine에 내장)

  • 마이크로서비스 아키텍쳐의 컨테이너를 다루기 위한 클러스터링 기능에 초점
  • 필요에 따라 유동적으로 컨테이너 수를 조절
  • 컨테이너로의 연결을 분산하는 로드밸런싱 기능을 자체적으로 지원

 

➡️ 서비스의 확장 및 관리를 편하게 한다.

 

클러스터란?

더보기
각기 다른 서버들을 하나로 묶어 하나의 시스템 같이 동작하게 하는 것

 

💡 클러스터를 실현하기 위해서는 새로운 서버나 컨테이너가 도입 될 때 (유지 보수), 스케줄러, 로드 밸런서, 고가용성 보장에 대한 고려가 필요함 ➡️ 도커 스웜에 필요성

출처 docs.docker.com

 

관련 용어

워커 노드(Worker Node)

- 실제 컨테이너가 생성되고 관리되는 도커 서버

 

매니저 노드(Mananger Node)

- 워커 노드를 관리하기 위한 도커 서버 + 워커 노드의 역할을 포함💡다른 매니저 노드 다운 시 다른 매니저 노드가 대신 클러스터를 관리함

 

서비스(Service)

- 도커 스웜에서의 제어 단위같은 이미지에서 생성된 컨테이너의 집합 

➡️ 서비를 제어하면 해당 서비스 내의 컨테이너에 같은 명령이 수행

 

테스크(Task)

- 서비스 내 컨테이너

➡️ 서비스의 정의에 따라 테스크를 할당할 적합한 노드 선택 ➡️ 선택된 노드에 태스크를 분산해서 할당

 

레플리카(Replica)

- 서비스를 실행할 컨테이너의 개수. 함께 생성된 테스크(Task), 서비스에 설정된 레플리카의 수만큼 테스크가 스웜 클러스터 내에 존재해야 함 

 


도커 컴포즈(Docker Compose)

여러 개의 컨테이너로 구성된 서비스를 정의하고 실행할 수 있는 툴 (Docker Engine 내에 존재하지 않아 따로 설치 필요)

➡️ 컨테이너의 생성을 편리하게 해줌

 

 

기능

- YAML 파일을 통해 애플리케이션의 서비스, 네트워크, 볼륨 등을 정의할 수 있어 복잡한 환경 설정을 간단하게 관리할 수 있음

 

예시 코드 (Nginx, MySQL 정의)

version: '3'

services:
  web:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html

  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

 

도커 컴포즈를 사용하면 하나의 YAML 파일로 모든 설정을 관리할 수 있으며 간단한 명령어로 컨테이너들의 동작을 제어할 수 있다.

 

 

출처