Docker 란?
리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트.
Docker는 컨테이너를 위한 운영 체제(또는 런타임)이다. 컨테이너를 실행하려는 각 서버에 Docker Engine이 설치되어 컨테이너를 구축, 시작 또는 중단하는 데 사용할 수 있는 간단한 명령 세트를 제공한다.
구조
도커는 클라이언트-서버 아키텍처를 사용한다. Docker 클라이언트는 Docker 데몬과 REST API를 사용하여 UNIX 소켓 또는 네트워크 인터페이스를 통해 통신한다. Docker 데몬은 Docker 컨테이너를 빌드, 실행 및 배포하는 무거운 작업을 수행한다.
- 도커 데몬
Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 개체를 관리한다. 다른 데몬과 통신하여 도커 서비스를 관리할 수 있다.
- 도커 클라이언트
사용자가 Docker와 상호 작용하는 기본 방법(커맨드). 사용자가 cmd, powershell 등을 통해 명령어를 입력하면 도커 클라이언트가 REST API로 변환하여 데몬에게 전달한다. 클라이언트는 둘 이상의 데몬과 통신할 수 있다.
- 도커 데스크톱
Mac 또는 Windows 환경에 쉽게 설치할 수 있는 응용프로그램으로, 컨테이너형 응용프로그램과 마이크로 서비스를 구축하고 공유할 수 있다. 도커 데스크톱에는 도커 데몬(dockerd), 도커 클라이언트(docker), 도커 컴포지트, 도커 콘텐츠 트러스트, 쿠버네티스 및 자격 증명 도우미가 포함된다.
- 도커 레지스트리
Docker 이미지를 저장하는 곳. 도커 허브는 누구나 사용할 수 있는 공용 레지스트리이며, 도커는 기본적으로 도커 허브에서 이미지를 검색하도록 구성되어 있다.
구성 요소
도커의 구성요소에는 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 등이 있다.
- Images
Docker 컨테이너를 만드는 지침이 포함된 읽기 전용 템플릿. 응용 프로그램을 실행하는 데 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정)을 포함하는 가벼운 독립 실행 소프트웨어 패키지를 의미한다.
- Container
컨테이너는 이미지의 실행 가능한 인스턴스. 기본적으로 컨테이너는 다른 컨테이너와 해당 호스트 시스템으로부터 격리되어 있다. 컨테이너는 휘발성이라 도커 볼륨을 사용해야한다.
컨테이너 이미지는 런타임에 컨테이너가 되며 도커 컨테이너의 경우 이미지가 도커 엔진에서 실행될 때 컨테이너가 된다. Linux 및 Windows 기반 애플리케이션 모두에서 사용할 수 있는 컨테이너형 소프트웨어는 인프라에 관계없이 항상 동일하게 실행된다. 컨테이너는 소프트웨어를 환경으로부터 격리하고 개발 및 스테이징 간의 차이에도 불구하고 소프트웨어가 균일하게 작동하도록 보장한다.
도커 컨테이너 특징
- 표준: Docker는 컨테이너에 대한 산업 표준을 만들어 이식성을 높임
- 경량: 컨테이너는 시스템의 OS 시스템 커널을 공유하므로 애플리케이션당 OS가 필요하지 않으므로 서버 효율성을 높이고 서버 및 라이센스 비용을 절감
- 보안: 애플리케이션은 컨테이너에서 더 안전하며 Docker는 업계에서 가장 강력한 기본 격리 기능을 제공
Docker를 사용하면 어디서나 안정적으로 실행할 수 있는 단일 객체를 확보하게 된다. Docker의 간단한 구문을 사용해 완벽하게 제어할 수 있다.
작동 방식
https://avengersrhydon1121.tistory.com/287
도커는 이미지를 통째로 생성하지 않고, 바뀐 부분만 생성한 뒤 부모 이미지를 계속 참조하는데 이 계층을 레이어라고 부른다. 이미지는 여러개의 읽기 전용 레이어로 구성되고 파일이 추가/수정되면 새로운 레이어가 생성된다. 도커는 여러 개의 layer를 묶어서 하나의 파일 시스템으로 사용할 수 있게 해준다.
조금 더 쉬운설명을 하자면, ubuntu 이미지가 레이어 a,b,c으로 구성되어있고, ubuntu 이미지를 베이스로 만든 nginx 이미지는 ubuntu가 가지고 있는 레이어에 nginx의 레이어가 추가되고, web app 이미지를 nginx 이미지 기반으로 만들었다면 nginx 레이어 위에 source 레이어가 추가된다. web app 이미지를 수정하면, 레이어 a,b,c, nginx 를 제외한 새로운 source(v2) 레이어만 다운 받으면 되기때문에 효율적으로 레이어 관리를 할 수 있다. 이것이 도커허브 및 개인 저장소에서 버전을 관리하는 원리이다.
컨테이너를 생성할때도 레이어 방식을 사용하며, 기존의 이미지 레이어 위에 읽기/쓰기 레이어를 추가한다. 컨테이너가 실행 중일 때 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장이 되기 때문에 여러개의 컨테이너를 생성해도 최소한의 용량만 사용한다.
그리고 이미지는 Url방식으로 관리하며 태그를 붙일 수 있다.
위 그림에서 docker.io/library/는 생략가능하여 바로 ubuntu:14.04 로 사용 할 수 있다.
도커 스웜
Docker에서 제공하는 네이티브 클러스터링 및 오케스트레이션 도구. 여러 호스트에서 도커 컨테이너를 효율적으로 관리하고 배포할 수 있게 해준다. 즉, 하나의 클러스터에서 여러 도커 컨테이너를 실행하고 관리할 수 있는 기능을 의미한다.
주요 기능
- 컨테이너 오케스트레이션: 여러 컨테이너를 클러스터에 배포하고, 실패 시 자동으로 복구합니다.
- 로드 밸런싱: 서비스에 대한 요청을 여러 노드에 분산하여 처리합니다.
- 자동화된 배포: 원하는 상태를 정의하면, 스웜이 클러스터 전체에서 이를 자동으로 유지합니다.
- 확장 및 축소: 서비스의 컨테이너 수를 쉽게 확장(Scale-out)하거나 축소(Scale-in)할 수 있습니다.
- 롤링 업데이트: 서비스 업데이트 시 중단 없이 단계적으로 새 버전의 컨테이너를 배포합니다.
- 보안: 노드 간 통신을 암호화하며, TLS 인증을 통해 보안을 강화합니다.
쿠버네티스와 비교
특징 | 도커 스웜 | 쿠버네티스 |
설치 및 설정 | 간단하고 빠름 | 비교적 복잡함 |
학습 곡선 | 쉬움 | 다소 어려움 |
기능 | 기본적인 오케스트레이션 및 로드 밸런싱 | 고급 기능(네트워킹, 볼륨 관리 등) |
확장성 | 중소규모에 적합 | 대규모 애플리케이션에 적합 |
커뮤니티 지원 | 제한적 | 활발한 커뮤니티 및 생태계 |
도커 컴포즈
다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구. YAML 형식의 설정 파일을 사용하여 여러 컨테이너를 한 번에 실행하고 관리할 수 있다. 예를 들어 웹 애플리케이션과 데이터베이스를 함께 실행해야 하는 경우, 도커 컴포즈를 사용하면 각각의 컨테이너를 하나의 명령으로 실행할 수 있다. 이를 통해 개발 및 배포 워크플로우를 효율적으로 관리할 수 있다.
주요 기능
- 다중 컨테이너 관리: 여러 컨테이너를 정의하고 함께 실행할 수 있습니다.
- YAML 파일 사용: docker-compose.yml 파일로 설정을 쉽게 관리할 수 있습니다.
- 서비스 간 네트워크 생성: 각 컨테이너 간 자동으로 네트워크를 설정합니다.
- 볼륨 및 환경 변수 설정: 데이터 지속성과 설정 관리를 용이하게 합니다.
- 명령어 단순화: 여러 컨테이너를 한 번에 시작, 중지, 재시작할 수 있습니다.
도커 컴포즈 vs 도커 스웜
특징 | 도커 컴포즈 | 도커 스웜 |
목적 | 로컬 및 소규모 개발 환경에서 다중 컨테이너 관리 | 대규모 분산 환경에서 컨테이너 오케스트레이션 |
설정 파일 | docker-compose.yml | docker-compose.yml + 스웜 명령어 |
네트워크 범위 | 단일 호스트 | 여러 노드(호스트)에 걸쳐 분산 |
확장성 | 제한적 | 높은 확장성 및 내장된 로드 밸런싱 |