[docker] 도커 기본

이상훈·2023년 6월 13일
0

CICD

목록 보기
1/10

 도커는 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구이며 컨테이너 기반의 오픈소스 가상화 플랫폼이며 생태계이다.

이미지와 컨테이너

  • 이미지 : 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지.
  • 컨테이너 : 이미지를 이용해서 컨테이너를 생성하며 생성된 컨테이너를 이용하여 프로그램을 실행.

흐름

 항상 도커를 사용할 때는 먼저 도커 CLI에 커맨드를 입력한다. 그러면 도커 서버 (도커 Daemon)가 그 커맨드를 받아서 그것에 따라 이미지를 생성하든 컨테이너를 실행하든 모든 작업을 하게 된다.
예를 들어 도커 CLI에 docker run hello-world를 입력해보자.
뭔지는 잘 모르겠지만 hello-world라는 프로그램이 실행됨을 확인할 수 있다.

플로우는 아래와 같다.
1. docker run hello-world라고 CLI에 입력하면 도커 서버로 요청 보냄.
2. 서버에서 hello-world라는 이미지가 이미 로컬에 cache가 되어 있는지 확인.
3. 현재는 없기에 Unable to find image ~라는 문구가 2번째 줄에 표시.
4. 그러면 Docker Hub라는 이미지가 저장되어 있는 곳에 가서 그 이미지를 가져오고 로컬에 Cache로 보관.
5. 그 후 이제는 이미지가 있으니 그 이미지를 이용해서 컨테이너를 생성.


가상화 기술(VM)

가상화 기술 나오기 전

  • 하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영.
  • 안정적이지만 비효율적

하이퍼 바이저 기반의 가상화 출현

  • 논리적으로 공간을 분할하여 VM이라는 독립적인 가상 환경의 서버 이용 가능
  • 하이퍼 바이저는 호스트 시스템에서 다수의 게스트 OS를 구동할 수 있게 하는 소프트웨어이며 하드웨어를 가상화하면서 하드웨어와 각각의 VM을 모니터링하는 중간 관리자.
  • 네이티브 하이퍼바이저, 호스트형 하이퍼바이저가 있으며 그 중 호스트형 하이퍼바이저가 주로 사용됨.

호스트형 하이퍼바이저

 호스트형 하이퍼바이저는 일반적인 소프트웨어처럼 호스트 OS 위에서 실행되며, 하드웨어 자원을 VM 내부의 게스트 OS에 흉내내는 방식으로 오버헤드가 크다는 단점이 있다. 하지만 게스트 OS 종류에 대한 제약이 없고 구현이 쉬워서 일반적으로 많이 사용한다.

Core 1에 에러가 생겨도 Core 2에 영향이 없다.


도커 vs 가상화 기술(VM)

 도커는 이러한 하이퍼 바이저 기반의 가상화 기술에 영향을 받아 탄생하게 되었다.

공통점

  • 도커 컨테이너와 VM은 기본 하드웨어에서 격리된 환경 내에 애플리케이션을 배치하는 방법이다.

차이점

  • VM과 비교해서 도커는 하이퍼바이저와 게스트 OS가 필요하지 않아 더 가볍다.
  • 애플리케이션을 실행할 때는 도커 컨테이너 방식에서는 이미지를 호스트 OS 위에 배포하기만 하면 되는데 VM방식은 VM을 띄우고 자원을 할당한 다음 게스트 OS를 부팅하여 애플리케이션을 실행해야 해서 훨씬 복잡하고 무겁다.
  • 도커 컨테이너에서 돌아가는 애플리케이션은 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 있지만, 여전히 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다. 하지만 가상 머신(VM) 내부에서 실행되는 모든 것은 호스트 운영체제 또는 하이버바이저와 독립되어있다.

도커를 좀 더 자세히 알아보자

카카오톡, 노션 애플리케이션이 일정량의 하드디스크, CPU, memory와 함께 각각의 컨테이너에 격리되어있다.

그렇다면 어떻게 도커 컨테이너를 격리시킬 수 있을까?

먼저 리눅스에서 쓰이는 Cgroup(control groups)와 namespaces에 대해서 알아야 한다. 이들은 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능들이다.

  • Cgroup : CPU, 메모리, Network Bandwith, HD i/o 등 프로세스 그룹의 시스템 리소스 사용량을 관리.
    • ex : 어떤 애플리케이션이 사용량이 너무 많다면 그 애플리케이션을 Cgroup에 집어 넣어 CPU와 메모리 사용 제한.
  • namespaces : 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술, 별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공.

이미지로 컨테이너 만들기

 이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 가지고 있다. 대표적으로 다음 2가지가 있다.

  • 컨테이너가 시작 될 때 실행되는 명령어
    • ex) run kakaotalk
  • 파일 스냅샷
    • ex) 컨테이너에서 카카오톡을 실행하고 싶다면 카카오톡 파일 스냅샷

다음은 이미지로 컨테이너를 만드는 과정이다.

First : Docker 클라이언트에 docker run<이미지> 입력
Second : 도커 이미지에 있는 파일 스냅샷을 컨테이너 하드디스크에 옮김

Third : 이미지가 가지고 있는 명령어를 이용해서 카카오톡 실행


Cgroup, namespaces를 도커 환경에서 쓸 수 있는 이유

  cgroup과 namespaces는 리눅스 환경에서 사용되는 것인데 어떻게 도커 환경에서도 쓸 수 있을까?

먼저 명령 프롬프트 창에 docker version을 입력해보자.

분명 나의 호스트 pc os는 windows지만 linux라고 나와있다.

호스트 컴퓨터는 window/MacOS일지라도 도커 클라이언트와 도커 서버는 리눅스 VM 환경에서 돌아간다. 따라서 리눅스 커널을 통해 cgroup과 namespace를 쓸 수 있었던 것이었다.

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글

관련 채용 정보