[Docker] 도커는 어려워,,,(1)

Dora_ bang·2025년 3월 10일
post-thumbnail

오늘은 스파로스 6기에 입학하게 되면서 들었던 Docker 강의를 내가 이해할 수 있도록 풀어서 최대한 정리해보려고 한다. 요즘엔 프론트엔드도 배포나 CI/CD에 대해 알아야 한다고 하니 노력해보자,,ㅜ

이전 팀 프로젝트나 개인 프로젝트에서 써본 적은 있지만 원리나 장점, 단점 등을 자세하게 알아본 적이 없었기 때문에 알아가보려고 한다.


Docker에 대해 알아보기 전에 왜 Docker가 생겨나게 됐는지, 주요 개념을 토대로 공부해보자!


예전에는 컴퓨터(서버) 한 대에 하나의 애플리케이션을 실행하는 게 일반적이었다. 하지만 이런 방식에는 문제가 있다.

❌ 기존 서버 환경의 문제점

  1. 자원 낭비 → 서버 성능이 충분해도 하나의 애플리케이션만 실행하면 CPU와 RAM이 놀고 있음
  2. 유지 보수 어려움 → 하나의 서버에 여러 개의 애플리케이션을 설치하면 충돌 발생
  3. 확장성 부족 → 새로운 애플리케이션을 추가하려면 서버를 새로 구매해야 함

이 문제점을 해결하고자 나온 개념이 서버 한 대를 가상 서버처럼 쪼개서 사용하는 가상화이다.


✅ 가상화(virtualization)?

✔ 컴퓨터에서 자원의 추상화를 일컫는 광범위한 용어

위키피디아에서 정의하는 가상화이다. 여기서 컴퓨터 자원은 무엇이며, 컴퓨터 자원를 추상화한다는 말부터가 이해하기 어렵다고 느껴진다.

컴퓨터 자원은 CPU나 메모리, OS, 스토리지, 네트워크 등을 말한다.

그리고 1개의 물리 자원을 여러 논리 자원으로 나누거나 여러 개의 논리 자원을 하나의 물리 자원인 것처럼 생각하는 방식을 자원을 추상화한다고 말할 수 있다.

가상화는 하드웨어(물리 자원)나 소프트웨어 자원(논리 자원)을 추상화하여 물리적인 제약 없이 여러 개의 독립된 환경을 생성할 수 있는 기술이다.

조금 더 쉽게 설명한다고 하면 한 대의 컴퓨터를 여러 대처럼 보이게 하거나, 여러 대를 하나처럼 보이게 하는 기술이라고 할 수 있다.

✅ 가상화를 하는 이유

  1. 자원 효율성 향상 → 하나의 하드웨어를 여러 개의 서버처럼 사용
  2. 비용 절감 → 서버를 여러 대 운영할 필요 없음
  3. 유연성 및 확장성 → 필요할 때 가상 서버를 쉽게 추가 가능

위와 같은 가상화를 가능하게 해주는 것이 바로 가상 머신(VM, Virtual Machine)이다.


🖥 가상 머신(VM)의 원리

가상 머신은 실제 하드웨어 위에서 가상의 하드웨어를 만들어서 운영 체제를 설치하는 방식이다. 그리고 이 가상 머신을 관리해주는 소프트웨어가 바로 하이퍼바이저다.

Host와 Guest?
Host는 물리적인 컴퓨터를 뜻한다. 그리고 Guest는 가상 머신으로 실행되는 가상의 운영 체제를 말한다.


✅ 하이퍼바이저(Hypervisor)?

하이퍼바이저는 가상 머신과 실제 하드웨어 사이에서 자원을 관리하는 역할을 하는 소프트웨어이다.

조금 더 자세히 알아보자면 아래와 같다.

  • 하드웨어 자원을 가상 머신에 분배한다.
  • 각 가상 머신을 독립적으로 실행하고 관리한다.
  • 가상 머신이 요청하는 작업을 실제 하드웨어에서 처리한다.
  • 가상 머신끼리의 자원 충돌을 방지한다.

하이퍼바이저에는 전가상화와 반가상화라는 2가지 종류가 있다.

1️⃣ 전가상화(Full Virtualization) - Type 1

  • 운영 체제 없이 하드웨어 위에서 직접 실행
  • 고성능 서버 환경에서 주로 사용
  • 예시
    • VMware ESXi
    • Microsoft Hyper-v(windows Server 버전)
    • Xen
    • KVM(Linux 기반, Kernel-based Virtual Machine)

2️⃣ 반가상화(Paravirtualization) - Type 2

  • 기존 운영 체제(Windows, macOS, Linux) 위에서 실행됨
  • 개인용 컴퓨터나 개발 환경에서 많이 사용
  • 예시
    • VirtualBox (Oracle)
    • VMware Workstation
    • Parallels Desktop (Mac 용)

가상 머신은 실제 운영 체제(Host)의 커널을 직접 쓰지 않고, 가상 하드웨어를 통해 자체 커널을 실행하는 구조이다. 하지만 가상 머신의 내부 운영 체제가 하드웨어를 사용하려면 결국 하이퍼바이저를 통해 실제 운영 체제(Host)의 커널과 소통해야 한다. 그렇기 때문에 하이퍼바이저는 하드웨어 접근을 중재하는 역할을 한다는 것을 알 수 있다.

가상 머신은 여러 개의 운영 체제를 실행할 수 있다는 것과 각각의 운영 체제가 완전히 독립적이기 때문에 서로 영향을 주지 않는다는 장점이 있다.

그러나 단점도 존재하는데, 운영체제를 통째로 실행하고 있어 부팅 속도가 느려지고, 각 가상 머신이 운영 체제를 따로 실행하고 있어 CPU와 RAM과 같은 자원의 사용량이 많다는 점이다.




여기서 이제 컨테이너라는 개념이 등장하게 된다.

가상 머신이 너무 무겁다면 운영 체제 전체를 가상화 하지 않고 애플리케이션만 격리해 관리하면 어떨까하는 생각에서 나온 것이 컨테이너 기술이다.

✅ 컨테이너의 핵심 아이디어

  • 가상 머신처럼 애플리케이션을 격리하되 운영 체제는 공유
  • 운영 체제 전체를 가상화하는 대신, 필요한 파일과 라이브러리만 포함

✅ Container Runtime?

컨테이너는 애플리케이션을 격리해서 실행하는 기술인데, 컨테이너를 직접 실행하는 역할을 하는 소프트웨어가 필요하다. 이소프트웨어를 컨테이너 런타임이라고 한다.

즉, 컨테이너 런타임은 컨테이너를 생성, 실행, 중지하는 역할을 하는 소프트웨어이다.

각 애플리케이션은 독립적이지만, 운영 체제 커널을 공유한다.

컨테이너는 운영 체제 커널을 공유한다는 게 무슨 뜻일까?

기존의 가상 머신 구조는 실제 운영 체제(Host) 위에 가상 머신을 실행하는 소프트 웨어인 하이퍼 바이저가 각각의 가상의 운영 체제를 실행, 관리하고 있다. 그렇기 때문에 가상 머신은 각각의 운영 체제를 따로 실행해서 무겁고 실행 속도가 느려지게 된다.

하지만 컨테이너의 경우 가상 머신처럼 운영 체제를 부팅할 필요 없이 실제 운영 체제(Host) 위에서 컨테이너 런타임을 통해 애플리케이션과 라이브러리만을 격리시켜 실행하기 때문에 즉시 실행이 가능하다.

또한 가상 머신처럼 운영 체제 전체를 포함하고 있지 않아 CPU 및 RAM의 사용량이 적다. 그리고 한 번 생성한 컨테이너 이미지를 어떤 환경에서도 사용할 수 있기 때문에 이식성이 높다는 것도 장점이다.

그렇다면 컨테이너는 완전히 독립적이지 않은 것일까?

답은 독립적이다. 컨테이너는 실제 운영 체제(Host)의 커널을 공유하지만 서로 독립적인 환경을 가진다. 이것을 가능하게 해주는 기술이 바로 Namespace와 Cgroups다.

✔ Namespace: 컨테이너마다 프로세스, 네트워크, 파일 시스템 등을 분리
✔ Cgroups: 컨테이너별로 CPU & RAM 사용량을 제한

즉, 컨테이너는 같은 운영 체제의 커널을 공유하지만, 마치 개별 환경처럼 동작하도록 격리된다.




오늘은 Docker에 대해 알아보기 전에 Docker 등장 배경에 대해서 알아보았다. 너무 어렵다.

하지만 어떠한 이유에서 이러한 기술들이 등장했는지, 각 기술의 개념은 어떠한 지에 대해 알아보면서 조금 더 해당 기술 스택이 어떻게 동작하고 있는지에 대해 잘 알아볼 수 있는 부분인 것 같아서 좋은 경험이 되었던 것 같다. 이후에 어떠한 문제가 발생해도 어떻게 발생된 문제인 지 등을 유추해보는데 실마리가 되어 주지 않을까,,ㅎㅎ

내일의 내가 조금 더 유능해질 수 있기를,,,

0개의 댓글