초이로그

[Docker] 도커는 왜 사용하는가? 본문

etc

[Docker] 도커는 왜 사용하는가?

수연초이 2022. 8. 7. 15:46

도커(Docker)란?

  • 리눅스 컨테이너에 여러 기능을 추가함으로써 애플리케이션을 컨테이너로서 좀 더 쉽게 사용할 수 있게 만들어진 오픈소스 프로젝트
  • Go 언어로 작성돼 있으며 2013.03에 첫 릴리스가 발표
  • 기존에 쓰이던 가상화 방법인 가상 머신과 달리 성능의 손실이 거의 없어 차세대 클라우드 인프라 솔루션으로 주목받고 있다.
  • 도커와 관련된 프로젝트는 도커 컴포즈, 레지스트리, 도커 허브, Docker for Descktop 등 여러가지가 있지만 일반적으로 도커 엔진 혹은 도커에 관련된 모든 프로젝트를 의미. 보통 도커 엔진이라는 의미로 많이 쓰이며 도커 엔진은 컨테이너를 생성하고 관리하는 주체로 이 자체로도 컨테이너를 제어할 수 있고 다양한 기능을 제공하는 도커의 주 프로젝트이다.
  • 도커 생태계의 여러 프로젝트들은 도커 엔진을 더 효율적으로 사용하기 위한 것에 불과. 즉, 도커 엔진이 핵심이다. 도커 엔진을 사용하는 방법을 익히는 것은 도커와 관련된 모든 프로젝트를 능숙하게 다루기 위한 첫걸음이다.

 

가상머신과 도커 컨테이너

기존의 가상화 기술(가상 머신)

  • 하이퍼바이저(호스트 컴퓨터에서 다수의 운영 체제를 동시에 실행하기 위한 논리적 플랫폼)를 이용해 여러 개의 운영체제를 하나의 호스트에서 생성해 사용하는 방식
  • 여러개의 운영체제는 가상 머신이라는 단위로 구별되고, 각 가상 머신에는 우분투, CentOS 등의 운영체제가 설치되어 사용
  • 하이퍼바이저에 의해 생성되고 관리되는 운영체제는 게스트 운영체제(Guest OS)라고 하며, 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용
  • VirtualBox, VMware 등이 대표적인 가상화 툴

[단점]

  • 각종 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 하이퍼바이저를 반드시 거쳐야하므로 일반 호스트에 비해 성능 손실 발생
  • 가상 머신은 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 이미지의 크기 또한 커짐

[정리]

완벽한 운영체제를 생성할 수 있다는 장점이 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다.

 

도커 컨테이너

가상화된 공간을 생성하기 위해 리눅스 자체 기능은 chroot, 네임스페이스(namespace), cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다. 

컨테이너에 필요한 커널은 호스트의 커널을 공유해 사용. 컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상 머신에 비해 대폭 줄어든다. 따라서 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다.

도커 컨테이너와 가상 머신의 구조

 

도커의 장점

애플리케이션의 개발과 배포가 편리해진다

독립된 개발 환경 보장: 도커 컨테이너는 호스트 OS(서버를 부팅할 때 실행되는 운영체제) 위에서 실행되는 격리된 공간이므로 컨테이너 자체에 특별한 권한을 주지 않는 한, 컨테이너 내부에서 수많은 소프트웨어를 설치하고 설정 파일을 수정해도 호스트 OS에 영향을 끼치지 않는다. 

개발/운영 환경의 통합: 컨테이너 내부에서 여러 작업을 마친 뒤, 이를 운영 환경에 배포하는 경우, 해당 컨테이너를 도커 이미지라고 하는 일종의 패키지로 만들어 운영 서버에 전달하면 된다. 새로운 패키지 설치나 라이브러리로 인한 의존성 고려 없이, 서비스를 개발했을 때 사용했던 환경을 다른 서버에서도 컨테이너로서 똑같이 복제할 수 있다. 

가벼운 용량 & 빠른 속도: 가상 머신의 이미지와 달리 커널을 포함하지 않으므로 이미지 크기가 상대적으로 작다. 이미지 내용을 레이어 단위로 구성하고, 중복되는 레이어의 재사용이 가능하다.

여러 애플리케이션의 독립성과 확장성이 높아진다

  • 여러 모듈을 독립된 형태로 구성하는 마이크로 서비스 구조로, 언어에 종속되지 않고 변화에 빠르게 대응 가능. 각 모듈 관리가 쉽다.
  • 컨테이너는 수 초 내로 생성, 시작이 가능하며 여러 모듈에게 독립된 환경을 동시 제공 가능하므로 마이크로서비스 구조에서 가장 낳이 사용되고 있는 가상화 기술이다.
  • 컨테이너 기반의 마이크로 서비스는 개발자가 그 구조를 직접 구현하기 부다는 도커 스웜 모드, 쿠버네티스 등의 컨테이너 오케스트레이션 플랫폼을 통해 사용하는 것이 일반적

이 외에도 도커 컨테이너를 사용하는 이유는 프로젝트 자체의 성숙도나 확장성, 편의성 등이 있다.

 

도커 엔진 - 이미지와 컨테이너

이미지와 컨테이너? 도커 엔진에서 사용하는 기본 단위

 

도커 이미지

  • 컨테이너를 생성할 때 필요한 요소로, 가상 머신을 생성할 때 사용하는 iso 파일과 비슷한 개념
  • 이미지는 여러 계층으로 된 바이너리 파일로 존재하고, 컨테이너를 생성하고 실행할 때 읽기 전용으로 사용
  • 기본적으로 [저장소 이름]/[이미지 이름]:[태그] 형식으로 구성(예: alicek/ubuntu:24.04, ubuntu:latest)
    • 저장소 이름: 이미지가 저장된 장소. 명시되지 않은 경우 도커에서 기본으로 제공하는 이미지 저장소인 Docker Hub의 공식 이미지를 의미. 생략 가능
    • 이미지 이름: 해당 이미지의 역할. 생략 불가
    • 태그: 이미지의 버전 관리 혹은 리비전 관리에 사용. 생략하는 경우 도커는 이미지의 태그를 latest로 인식
  • 우분투, CentOS 등 기본적인 리눅스 운영체제부터 아파치 웹 서버, MySQL 데이터베이스 등의 각종 애플리케이션, 하둡이나 스파크, 스톰 등의 빅데이터 분석 도구까지 갖가지 종류가 있다.

 

도커 컨테이너

  • 도커 이미지의 목적에 맞는 파일이 들어 있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성
  • 대부분의 도커 컨테이너는 생성될 때 사용된 도커 이미지의 종류에 따라 알맞은 설정과 파일을 가지고 있으므로 도커 이미지의 목적에 맞도록 사용되는 것이 일반적. 웹 서버 도커 이미지로부터 여러개의 컨테이너를 생성하면 그 개수만큼 웹 서버가 생성되고, 외부에 웹 서비스가 제공된다는 의미
  • 컨테이너는 이미지를 읽기 전용으로 사용하되, 이미지에서 변경된 사항만 컨테이너 계층에 저장하므로 원래 이미지는 영향을 받지 않는다. 생성된 각 컨테이너는 각기 독립된 파일 시스템을 제공받으며 호스트와 분리돼 있으므로 특정 컨테이너에서 어떤 애플리케이션을 설치하거나 삭제해도 다른 컨테이너와 호스트는 변화 없음

도커 이미지와 컨테이너는 1:N 관계

 

Docker Github: https://github.com/docker

출처: [책] 시작하세요! 도커/쿠버네티스

 

OS 전공 수업 때 VirtualBox로 리눅스 돌리던 시절이 떠오르면서,, 도커가 왜 빠른지 납득이 되는 정리였다✨

'etc' 카테고리의 다른 글

[Kubernetes] 쿠버네티스  (0) 2022.08.07