오늘은 도커(Docker)에 대해서 알아볼게요
도커를 이해하기 전 먼저 가상화에 대한 개념 이해가 필요합니다.
가상화
하나의 실물 컴퓨팅 자원을 마치 여러 개의 가상 자원으로 쪼개서 사용하거나, 여러 개의 실물 컴퓨팅 자원을 묶어 하나의 자원처럼 사용할 수 있도록 하는 기술로,서버의 자원을 효율적으로 분산하여 서버 관리의 유연성을 제공한다.
서버 가상화
하나의 물리적 서버 호스트에서 여러 개의 서버 운영 체제를 게스트로 실행할 수 있게 해주는 소프트웨어 아키텍처
가상 머신(Virtual machine)과 컨테이너(Container)
가상 머신과 컨테이너는 모두 애플리케이션을 격리된 환경에서 실행하기 위한 기술이지만, 동작 방식과 구조에는 차이가 있다.
- 하이퍼바이저
서버 가상화 기술을 구현할 수 있게 하는 소프트웨어로 가상 머신의 자원 할당과 관리를 담당
대표적인 툴 vmare, Virtual Box
가상화 작업은 하이퍼바이저를 반드시 거쳐야 하므로 일반 호스트에 비해 성능 손실이 발생한다. 또한 여러 OS를 사용하기 위한 라이브러리나 커널 등이 전부 포함되어 있기 때문에 용량이 커진다는 단점이 있다.
- 가상 머신
하이퍼바이저 위에서 실행되는 독립된 운영체제와 어플리케이션 환경으로 물리적 하드웨어 자원을 가상화하여 여러 운영체제를 동시에 실행할 수 있도록 한다. 또한 각 가상머신은 독립된 환경에서 실행되어 다른 가상 머신에 영향을 주지 않으므로 오류 발생 시 전체 가상머신에 영향을 주지 않는다.
도커(Docker)
컨테이너 기술에 여러 기능을 추가한 오픈소스 프로젝트
컨테이너
운영체제 수준에서 가상화를 제공하여 애플리케이션과 그 의존성을 격리하는 기술로 프로세스 단위의 격리 환경을( HOST OS와의 격리 ➡️ 독립된 개발 환경 보장 )제공한다.
- 컨테이너에는 애플리케이션 구동에 필요한 라이브러리와 실행 파일만 존재 ➡️ 이미지의 용량을 줄여 가상 머신보다 가볍고 빠르다
- 프로세스의 생명주기를 관리하며 실행하는 하나의 프로세스
➡️ 애플리케이션을 서로 독립된 환경에서 실행할 수 있게 하여 충돌을 방지하고 배포를 간소화함.
도커 엔진(Docker Engine)
유저가 컨테이너를 쉽게 사용할 수 있게 해주는 주체
역할
도커 엔진은 이미지 생성, 저장, 가져오기와 같은 관리 역할, 이미지를 기반으로 한 컨테이너 생성, 실행, 중지, 삭제의 역할을 수행한다. 또한 컨테이너들이 통신할 수 있도록 가상 네트워크를 생성하고, 컨터이너간 데이터를 공유하거나, 데이터 유지를 위한 볼륨 관리 등의 역할을 수행한다.
동작 과정
도커 클라이언트 (CLI)에 명렁어 입력을 통한 실행 요청 ➡️ 도커 데몬 API(dockered) 호출 ➡️ 도커 데몬이 요청을 처리하고 필요한 작업(컨테이너 생성, 이미지 빌드 등) 수행 ➡️ 도커 데몬이 작업 결과를 CLI에 반환 ➡️ CLI가 결과를 사용자에게 출력
도커 스웜(Docker Swarm)
여러 도커 엔진을 클러스터로 묶어 단일 가상 시스템처럼 사용할 수 있도록 도와주는 도와주는 도구 (docker engine에 내장)
- 마이크로서비스 아키텍쳐의 컨테이너를 다루기 위한 클러스터링 기능에 초점
- 필요에 따라 유동적으로 컨테이너 수를 조절
- 컨테이너로의 연결을 분산하는 로드밸런싱 기능을 자체적으로 지원
➡️ 서비스의 확장 및 관리를 편하게 한다.
클러스터란?
💡 클러스터를 실현하기 위해서는 새로운 서버나 컨테이너가 도입 될 때 (유지 보수), 스케줄러, 로드 밸런서, 고가용성 보장에 대한 고려가 필요함 ➡️ 도커 스웜에 필요성
관련 용어
워커 노드(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 파일로 모든 설정을 관리할 수 있으며 간단한 명령어로 컨테이너들의 동작을 제어할 수 있다.
출처
'Server' 카테고리의 다른 글
CI와 CD에 대하여 (Continuous Integration / Deployment ) (0) | 2024.06.14 |
---|---|
RESTful API에 대하여 (0) | 2024.06.10 |
JPA와 MyBatis (ORM, SQL Mapper)에 대하여 (0) | 2024.06.09 |
Stateful과 Stateless (0) | 2024.05.19 |
java.lang.IndexOutOfBoundsException (MyBatis) (0) | 2024.05.18 |