가상화와 도커 (Virtualization & Docker)

JISU LIM·2023년 9월 7일
0

CS-Tech

목록 보기
8/16
post-thumbnail
post-custom-banner

⏣ 가상화(Virtualization)

  • 가상화는 컴퓨팅 환경을 논리적으로 분리하거나, 추상화하여 물리적인 하드웨어 리소스를 여러 가상 환경 또는 가상 머신으로 나누는 기술입니다.
  • 주요 목적은 사용자 격리리소스 공유 및 관리를 통해 하드웨어 가용성을 개선하는 것입니다
  • 예를 들어, 가상화를 사용하면 하나의 물리적 서버에서 여러 가상 서버를 호스팅하거나, 하나의 컴퓨터에서 여러 운영 체제를 실행할 수 있습니다.
  • 주로 하이퍼바이저(Hypervisor)라고 불리는 소프트웨어를 사용하여 가상화를 구현합니다. 이 하이퍼바이저는 물리적 하드웨어와 가상 머신 간의 인터페이스 역할을 합니다.

하이퍼바이저 기반 가상화

  • 하이퍼바이저는 물리적 하드웨어 위에 직접 설치되며, 가상 머신을 실행하기 위한 환경을 제공합니다.
  • 예시로 VMware vSphere/ESXi, Microsoft Hyper-V, KVM 등이 있습니다.
  • 이러한 환경에서 가상 머신들은 하이퍼바이저를 통해 물리 리소스에 접근하고 사용합니다.

컨테이너 기반 가상화

  • 컨테이너는 운영 체제 수준에서 가상화를 제공하며, 가상 머신보다 가볍고 빠르게 실행됩니다.
  • 각 컨테이너는 공통 운영 체제 커널을 공유하므로 리소스 사용 효율성이 높습니다.
  • 예시로 Docker, Kubernetes, Podman 등이 있습니다.
  • 컨테이너는 주로 애플리케이션을 패키징하고 배포하는 데 사용됩니다.

주요 차이점

하이퍼바이저 기반 가상화 는 하드웨어에서 전체 컴퓨터를 재생성하며, 이는 다시 전체 OS를 실행한다는 것을 뜻합니다. 이는 전혀 가상화가 없는 것보다는 효율적이지만, 실행하고자 하는 애플리케이션마다 불필요한 코드와 서비스를 여전히 복제하기 때문에 비효율적입니다.

컨테이너 기반 가상화 는 대안적인 접근 방법을 사용합니다. 이는 애플리케이션 및 해당 에플리케이션이 의존하는 소프트웨어 라이브러리 및 환경 변수 등만을 실행하면서 기반 OS 커널을 공유합니다. 따라서 컨테이너는 보다 작아지며 배포 속도가 빨라집니다.

🚀 그렇다면 Docker는?

  • Docker는 컨테이너 가상화 기술에 해당됩니다.
  • 기존 활용되던 Virtual Machine 방식은 하나의 Machine 위에 여러 VM이 동작하고, 각 VM은 OS와 라이브러리, 실행파일 등을 포함하고 있기 때문에 굉장히 무겁다는 단점이 있었습니다.
  • 하지만 Docker는 OS Kernel을 공유하여 독립적인 User Space를 가상화하기 때문에 매우 가벼워 빠르고 쉽게 독립적인 가상 환경을 실행시킬 수 있습니다.
    • 이러한 장점으로 요새 각광받는 MSA(Micro Service Architecture)와 CI/CD 구축에 잘 어울리는 가상화 기술입니다.

Docker의 특징

  1. 가볍고 빠르다: Docker 컨테이너는 가상머신보다 훨씬 가볍고 시작 시간이 짧습니다. 이는 애플리케이션 배포와 확장을 더 빠르게 수행할 수 있게 해줍니다.
  2. 일관성: Docker 컨테이너는 모든 종류의 환경에서 동일하게 작동하도록 패키징되므로 개발 환경, 테스트 환경 및 프로덕션 환경 간의 일관성을 유지하기 용이합니다.
  3. 이식성: Docker 컨테이너는 어디서든 실행할 수 있으므로, 로컬 개발 환경에서 개발한 애플리케이션을 클라우드 또는 다른 환경으로 쉽게 이동할 수 있습니다.
  4. 자동화 및 확장성: Docker 컨테이너는 인프라 구성 및 배포 자동화에 적합하며, 필요에 따라 애플리케이션 인스턴스를 확장할 수 있어 클라우드 네이티브 환경에 적합합니다.
  5. 생태계: Docker는 매우 활성화된 커뮤니티와 생태계를 가지고 있으며, 수많은 컨테이너 이미지와 도구들이 사용 가능합니다.
  6. 리소스 공유: 가상머신보다 컨테이너는 물리적 리소스를 효율적으로 공유하므로 더 많은 컨테이너를 한 대의 서버에서 실행할 수 있습니다.

하나의 Host OS에서 돌아간다면 충분히 한 컨테이너가 다른 컨테이너에 간섭할 수 있는 위험이 있지 않을까요?

  • 기본적으로 각 APP들은 Cgroup(control groups)과 네임스페이스와 독립된 네트워크로 인해 “Wall”이 존재합니다. 도커 데몬은 이렇게 각각의 컨테이너가 정해진 논리 공간에 쉽게 배정될 수 있게 도와주는 역할을 수행해줍니다.

Docker위에 Docker를 올릴 수 있을까?

  • 가능합니다. 도커 위에 도커를 올릴 경우 DinD 방식과 DooD 방식으로 나눠지게 됩니다. 하지만 Low level의 기술적 문제를 많이 일으키므로 권장되지 않습니다.
  • Docker in Docker(DinD) 방식 : 도커 내에서 도커 데몬을 실행하는 방식입니다.
    • 실제 데몬을 동작시켜야 하기 때문에 도커 데몬에 추가 권한이 필요합니다. 그래서 DinD를 만들 때 명령에 --priviledged를 사용해 추가 권한을 부여하는 명령이 포함됩니다. 하지만 이로 인해 컨테이너가 호스트 전체 권한을 갖는 치명적인 결함을 가집니다.
  • Docker Out of Docker(DooD) 방식 : 내부에 새로운 도커 컨테이너를 만들지 않고 기존의 사용하던 컨테이너를 추가로 생성합니다.
    • /var/run/docker.sock 파일은 도커 데몬과 통신할 수 있는 소켓 파일인데 해당 파일을 컨테이너와 공유하면 이 파일을 통해 도커 명령을 수행할 수 있게 됩니다. 해당 방식은 안전한가 생각이 들 수 있지만 사실은 아닙니다. 왜냐하면 공격하는 방향이 바뀔 뿐 막강한 권한을 갖는 것은 동일합니다.

결론적으로 DinD는 컨테이너 안에 새로운 격리된 환경을 만들고 DooD는 컨테이너가 자신이 속한 도커 서비스를 다룰 수 있도록 합니다. 따라서 완전히 별도의 가상환경을 만들 때는 DinD, 가상화된 환경을 다같이 다루고 싶다면 DooD를 선택하시면 됩니다.

도커 데몬이란?

Docker 데몬(Docker Daemon)은 Docker 컨테이너를 관리하고 실행하는 백그라운드 서비스입니다. Docker 데몬은 호스트 운영체제에서 실행되며, 사용자가 컨테이너를 생성, 실행, 관리하는 데 필요한 기능을 제공합니다.

도커 위에 도커를 올릴 때의 장점은?

컨테이너 안에서 개발을 진행하면서도 쿠버네티스처럼 컨테이너가 컨테이너를 관리한다던지, 구름 IDE처럼 컨테이너를 동적으로 생성해 사용자에게 서비스를 제공한다던지, 클라우드 서비스처럼 사용자 요청에 따라 컨테이너를 동적으로 배치해 서버리스 서비스를 제공하는 등의 다양한 작업이 가능합니다.
이처럼 DinD 방식과 DooD 방식은 보안상의 문제가 있음에도, 컨테이너가 컨테이너를 관리하는 데에는 장점이 있습니다.

🙏 본 개념의 정리에 대한 피드백과 질문은 환영입니다!

✏️ Tech Interview Study

본 개념의 다른 정리 및 피드백, 인터뷰 주제의 순서는 테크 인터뷰 스터디 Repository에서 확인 가능합니다.

📚 REFERENCE

벨로그 - Docker와 가상화 기술
티스토리 - [Docker Basic] 15. Docker Container 자원 제한
네이버 블로그 - 도커 컨테이너 안에서 도커 실행하기 (Docker in Docker, Docker Out of Docker)
IBM - 가상화란?
AWS - 가상화란 무엇입니까?
블로그 - Docker is not a hypervisor
티스토리 - 가상화의 종류(호스트, 하이퍼바이저, 컨테이너)
블로그 - 도커 컨테이너는 가상머신인가요? 프로세스인가요?
미디엄 - Understanding the Docker Internals
벨로그 - Docker와 VM의 차이
개발 커뮤니티 - Why is Docker-in-Docker considered bad?
티스토리 - Linux) Doker와 Container의 탄생과 설명, 차이점

profile
Grow Exponentially
post-custom-banner

0개의 댓글