컨테이너와 쿠버네티스의 관계

이영진·2025년 3월 23일
1

클라우드

목록 보기
4/6

1. 컨테이너 기술과 가상 머신의 차이점 및 활용

컨테이너 기술의 이해

컨테이너 기술은 운영 체제 수준에서 가상화를 제공하여, 여러 애플리케이션이 동일한 운영 체제에서 독립적으로 실행될 수 있게 합니다.

컨테이너는 호스트 운영 체제의 커널을 공유하면서, 필요한 애플리케이션과 의존성만 포함하여 실행됩니다.

이는 가상 머신과 달리 별도의 운영 체제가 필요하지 않아, 자원 사용이 효율적이고 시작 시간이 빠릅니다.

가상 머신의 이해

가상 머신(Virtual Machine)은 하이퍼바이저를 통해 물리적 서버 위에 완전한 운영 체제를 실행하는 기술입니다.

각 가상 머신은 독립적인 운영 체제를 가지며, 이는 자원 사용이 많고 시작 시간이 느립니다. 가상 머신은 다양한 운영 체제를 동일한 하드웨어에서 실행할 수 있어, 이기종 시스템 간의 이식성이 높습니다.


하이퍼바이저(Hypervisor)란 무엇인가?

하이퍼바이저는 가상화 기술의 핵심 요소로, 단일 호스트 컴퓨터에서 여러 개의 가상 머신(VM)을 동시에 실행할 수 있게 해주는 소프트웨어입니다.

하이퍼바이저는 물리적 하드웨어의 자원을 가상화하여 각 가상 머신에 할당하고, 이를 통해 다양한 운영 체제가 독립적으로 실행될 수 있게 합니다.

하이퍼바이저의 주요 기능

  1. 가상 머신 생성 및 관리: 하이퍼바이저는 물리적 하드웨어 위에서 여러 개의 가상 머신을 생성하고 관리합니다.
  2. 리소스 할당: CPU, 메모리, 스토리지 등의 자원을 가상 머신에 할당하여 효율적으로 사용할 수 있게 합니다.
  3. 독립성 보장: 각 가상 머신이 독립적으로 운영 체제를 실행할 수 있도록 하여, 하나의 가상 머신에서 발생하는 문제가 다른 가상 머신에 영향을 미치지 않도록 합니다.

하이퍼바이저의 유형

  1. Type 1 하이퍼바이저 (베어 메탈 하이퍼바이저): 물리적 하드웨어 위에서 직접 실행되며, 운영 체제 없이 독립적으로 작동합니다. 예: VMware vSphere, Microsoft Hyper-V.
  2. Type 2 하이퍼바이저 (호스트형 하이퍼바이저): 호스트 운영 체제 위에서 실행되며, 호스트 OS의 자원을 사용하여 가상 머신을 관리합니다. 예: VirtualBox.

하이퍼바이저의 활용

  • 서버 통합: 여러 물리적 서버를 하나의 서버로 통합하여 자원을 효율적으로 사용할 수 있습니다.
  • 테스트 환경 구축: 다양한 운영 체제를 동일한 하드웨어에서 테스트할 수 있어 개발 및 테스트 환경에 유용합니다.
  • 클라우드 서비스: 클라우드 환경에서 가상 머신을 생성하고 관리하여 확장성과 유연성을 제공합니다.

컨테이너와 가상 머신의 차이점

특징컨테이너가상 머신
운영 체제호스트 OS의 커널 공유독립적인 OS 필요
자원 사용효율적, 낮은 메모리 사용높은 메모리 사용
시작 시간빠른 시작 시간 (수초)느린 시작 시간 (수분)
이식성동일 OS 계열에서만 가능다양한 OS 지원
크기작은 이미지 크기 (MB)큰 이미지 크기 (GB)

컨테이너 기술의 장점

  1. 빠른 시작 시간: 컨테이너는 OS 부팅이 필요 없으므로 시작 시간이 매우 빠릅니다.
  2. 효율적인 자원 사용: 컨테이너는 별도의 OS가 필요 없으므로 메모리와 CPU 사용이 적습니다.
  3. 이식성: 컨테이너는 환경에 구애받지 않고 실행 가능합니다.
  4. 모듈화: 애플리케이션을 모듈화하여 관리하기 쉽습니다.

Docker와 컨테이너 이미지

Docker는 컨테이너 기술을 구현하는 인기 있는 플랫폼으로, Dockerfile을 통해 컨테이너 이미지를 생성합니다. Dockerfile은 이미지 생성에 필요한 명령어를 포함한 파일입니다.
Docker 이미지는 읽기 전용으로, 실행 중에 변경 사항은 볼륨을 통해 저장할 수 있습니다.


컨테이너 이미지 구조 및 빌드 과정

1. 컨테이너 이미지의 정의

컨테이너 이미지는 정적 파일로, 실행 가능한 코드를 포함하여 컴퓨팅 시스템에서 컨테이너를 생성할 수 있게 합니다. 이 이미지는 불변성을 가지며, 환경에 구애받지 않고 일관되게 배포될 수 있습니다.

컨테이너 이미지는 애플리케이션 코드, 런타임 환경, 시스템 유틸리티, 라이브러리, 구성 파일 등을 포함합니다.

2. 컨테이너 이미지 구조

컨테이너 이미지는 레이어로 구성됩니다. 각 레이어는 이전 이미지에 추가된 변경 사항을 나타내며, 이를 통해 다양한 구성 요소를 재사용할 수 있습니다.
이러한 레이어링은 유니언 파일 시스템을 통해 구현되며, 이는 여러 레이어를 하나의 파일 시스템으로 통합하여 컨테이너가 실행될 때 사용됩니다.

3. 컨테이너 이미지 빌드 과정

컨테이너 이미지를 빌드하는 과정은 주로 Dockerfile을 사용하여 수행됩니다. Dockerfile은 이미지 빌드에 필요한 명령어를 포함한 텍스트 파일입니다.

빌드 과정의 단계

  1. Dockerfile 생성: Dockerfile에 필요한 명령어를 작성합니다. 예를 들어, 베이스 이미지 지정, 파일 복사, 명령어 실행 등이 포함됩니다.

  2. 이미지 빌드: docker build 명령어를 사용하여 Dockerfile을 기반으로 이미지를 생성합니다. 이 과정에서 각 명령어는 새로운 레이어를 생성합니다.

  3. 이미지 저장 및 배포: 생성된 이미지는 Docker Hub와 같은 레지스트리에 푸시되어 다른 사용자가 가져다 쓸 수 있습니다.

4. 빌드 최적화

  • 최소한의 베이스 이미지 사용: 필요한 패키지만 포함된 작은 베이스 이미지를 사용하여 빌드 시간을 단축합니다.
  • 레이어 최적화: 레이어를 효율적으로 구성하여 이미지 크기를 줄이고 성능을 향상시킵니다.
  • CI/CD 통합: 지속적인 통합 및 배포 파이프라인을 통해 자동화된 빌드 및 배포를 수행합니다.

5. 결론

컨테이너 이미지는 애플리케이션 배포의 효율성을 높이는 중요한 요소입니다. Dockerfile을 통해 이미지 빌드를 자동화하고, 최적화된 레이어링을 통해 이미지 크기를 줄일 수 있습니다. 이러한 기술은 현대의 클라우드 네이티브 애플리케이션 개발에서 필수적입니다.


컨테이너 오케스트레이션

컨테이너 오케스트레이션은 여러 컨테이너의 배포, 관리, 확장을 자동화하는 기술입니다.
Kubernetes는 가장 인기 있는 오케스트레이션 도구로, 컨테이너의 생명 주기를 관리하고 워크로드를 자동화합니다. Kubernetes는 Master NodeWorker Node로 구성되며, POD라는 단위로 컨테이너를 관리합니다.


2. 웹 서비스 실행 컨테이너 만들기

웹 서비스 실행 컨테이너 만들기

1. 파일 복사 및 디렉토리 이동

cp –rf /config/collaboration/cloud /config/workspace/
cd /config/workspace/cloud/container/00.container-linux
  • 파일 복사: /config/collaboration/cloud 디렉토리의 내용을 /config/workspace/로 복사합니다.

  • 디렉토리 이동: /config/workspace/cloud/container/00.container-linux 디렉토리로 이동합니다.

2. Docker 이미지 빌드

sudo docker build --tag container-linux:1.0 .
  • Docker 이미지 빌드: 현재 디렉토리에서 Dockerfile을 기반으로 container-linux:1.0이라는 이름의 Docker 이미지를 생성합니다.

3. Docker 이미지 확인

sudo docker images
  • Docker 이미지 목록 확인: 로컬에 생성된 Docker 이미지 목록을 출력합니다.

4. 공유 디렉토리 생성 및 Docker 컨테이너 실행

mkdir ./mydata
sudo docker run --rm -d -v $(pwd)/mydata:/mydata --name my-first-container container-linux:1.0
  • 공유 디렉토리 생성: 현재 작업 디렉토리 내에 mydata라는 폴더를 생성합니다.

  • Docker 컨테이너 실행: container-linux:1.0 이미지를 기반으로 my-first-container라는 이름의 컨테이너를 실행합니다. -v 옵션을 사용하여 호스트의 mydata 디렉토리를 컨테이너의 /mydata 디렉토리와 마운트합니다.

5. 실행 중인 컨테이너 확인 및 접속

sudo docker ps
sudo docker exec -it my-first-container /bin/bash
  • 실행 중인 컨테이너 목록 확인: 현재 실행 중인 Docker 컨테이너 목록을 출력합니다.

  • 컨테이너에 접속: my-first-container에 접속하여 내부에서 명령어를 실행할 수 있습니다.

6. 컨테이너 내부 작업

cd mydata
ls
  • mydata 디렉토리로 이동: 컨테이너 내부에서 /mydata 디렉토리로 이동합니다.

  • 디렉토리 내용 확인: 현재 디렉토리 내의 파일 목록을 출력합니다.

7. 호스트에서 파일 복사 및 컨테이너 내부에서 실행

cp webserver.py ./mydata
cd ./mydata
ls
python webserver.py
  • 호스트에서 파일 복사: 호스트의 webserver.py 파일을 mydata 디렉토리로 복사합니다.

  • 컨테이너 내부에서 파일 실행: 컨테이너 내부에서 webserver.py 파일을 실행합니다.

8. tar 명령어

tar 명령어는 여러 개의 파일과 디렉토리를 하나의 파일로 묶거나 풀 때 사용됩니다. Docker 이미지를 만드는 과정에서 필요한 프로그램과 패키지를 설치된 상태로 복사하여 다른 환경에서 사용할 수 있도록 하는 파일들의 묶음으로 생각할 수 있습니다.

정리

  • Docker 이미지: 필요한 프로그램과 패키지가 설치된 상태로 복사하여 다른 환경에서 실행할 수 있는 파일들의 묶음입니다.

  • Docker 컨테이너: Docker 이미지를 기반으로 실행되는 격리된 환경입니다.

  • tar 명령어: 여러 파일을 하나의 파일로 묶는 명령어로, Docker 이미지 생성 과정에서 유사한 개념으로 이해할 수 있습니다.

이러한 과정은 Docker를 사용하여 웹 서비스를 실행하는 데 필요한 단계를 설명하며, Docker의 장점인 환경 독립성효율적인 자원 사용을 활용하여 애플리케이션을 배포하는 방법을 보여줍니다.


3.컨테이너 구조

Docker와 컨테이너 기술

1. Docker Engine

Docker Engine은 Docker 이미지를 빌드하고, 컨테이너를 실행하며, 오케스트레이션, 볼륨 관리, 네트워킹 확장을 담당하는 핵심 구성 요소입니다.

Docker Engine은 사용자가 Docker 명령어를 통해 컨테이너를 관리할 수 있게 합니다.

2. Containerd와 runc

  • Containerd: Docker Engine과 독립적으로 사용할 수 있는 컨테이너 런타임입니다. 컨테이너 이미지를 저장하고 전송하며, runc를 호출하여 컨테이너를 시작하고 관리합니다.

  • runc: 컨테이너의 실행을 담당하는 프로세스로, OCI(Open Container Initiative) 런타임을 따릅니다. runc는 컨테이너의 프로세스를 시작하고 관리하는 표준적인 방법을 제공합니다.

3. Docker 자원의 가상화

Docker는 네임스페이스cgroup을 사용하여 컨테이너 간의 자원을 격리합니다.

  • 프로세스 테이블: 각 컨테이너는 독립적인 프로세스 테이블을 가지며, 다른 컨테이너의 프로세스에 접근할 수 없습니다.

  • CPU, 메모리 장치: 컨테이너에서 사용할 수 있는 CPU와 메모리 범위를 제한할 수 있습니다.

  • 파일 시스템: 각 컨테이너는 독립적인 루트 파일 시스템을 가지며, 특정 디렉토리를 루트로 보이게 할 수 있습니다.

  • 네트워크: 네트워크 네임스페이스를 사용하여 각 컨테이너에 독립적인 네트워크 설정을 제공합니다. 가상 NIC(veth)를 통해 컨테이너 내부 네트워크를 구성합니다.

4. 네임스페이스

네임스페이스는 컨테이너 내 프로세스를 격리하여 독립적으로 관리할 수 있게 합니다. 네임스페이스는 프로세스, 네트워크, 마운트, PID, IPC 등 다양한 리소스를 격리합니다.

5. cgroup

cgroup은 프로세스에 할당된 리소스를 제한하는 메커니즘입니다. CPU, 메모리, I/O 등의 자원을 제어하여 컨테이너가 사용할 수 있는 자원을 관리합니다.

6. Union File System

Union File System은 Docker 이미지 관리에 사용되는 기술로, 레이어링Copy-on-Write 방식을 활용합니다.

  • 레이어링: 여러 읽기 전용 레이어와 읽기-쓰기 가능한 상위 레이어로 구성됩니다. 변경 사항은 상위 레이어에 저장됩니다.

  • Copy-on-Write: 파일을 수정할 때, 원본 파일은 그대로 유지하고 변경 사항만 새로운 레이어에 복사하여 저장합니다.

  • 마운트된 디렉터리 병합: 여러 소스 디렉터리를 단일 디렉터리로 병합하여 사용자에게 제공합니다.

7. Docker 이미지 수정 및 업데이트

Docker 이미지는 여러 레이어로 구성되며, 각 레이어는 독립적으로 관리됩니다. 이미지를 수정하거나 업데이트할 때, 변경 사항은 새로운 레이어에 저장되므로 기존 이미지는 불변성을 유지합니다.

이는 이미지 재사용성을 높이고 빌드 시간을 단축하는 데 유리합니다.

8. Docker Networking

Docker 컨테이너는 각자 가상 NIC를 할당받아 독립적인 네트워크 설정을 가집니다. 동일 호스트 내의 컨테이너 간 통신은 bridge 네트워크를 통해 이루어지며, NAPT(Network Address and Port Translation)를 사용하여 포트를 지정하여 연결할 수 있습니다.

9. 볼륨 마운트

컨테이너와 호스트 시스템 간에 파일 시스템을 공유하기 위해 볼륨 마운트를 사용합니다. 이는 컨테이너가 종료되더라도 데이터를 유지할 수 있는 방법입니다. 볼륨 마운트는 컨테이너 내부의 특정 디렉토리를 호스트의 디렉토리와 연결하여 데이터를 공유합니다.

10. Docker inspect

docker inspect 명령어는 컨테이너나 이미지의 상세 정보를 출력합니다. 이를 통해 컨테이너의 네트워크 설정, 볼륨 마운트 정보 등을 확인할 수 있습니다. 예를 들어, 컨테이너의 IP 주소나 네트워크 설정을 확인할 때 유용합니다.


결론

컨테이너 기술은 가상 머신과 달리 효율적이고 빠른 애플리케이션 배포를 가능하게 합니다. Docker와 같은 플랫폼을 통해 쉽게 컨테이너 이미지를 생성하고, Kubernetes와 같은 오케스트레이션 도구를 사용하여 대규모 시스템을 관리할 수 있습니다. 이러한 기술은 현대의 클라우드 네이티브 애플리케이션 개발에서 필수적입니다.

1개의 댓글

comment-user-thumbnail
2025년 6월 16일

DB 뿐만 아니라 이제는 도커도 하시나요? 진짜 IT 최적화 인재 ㅜㅜ

답글 달기