도커

mingg·2023년 10월 15일
0

클라우드

목록 보기
3/4

도커를 쓰는 이유는 뭘까

도커 없이 프로그램을 받을 때 과정

도커 없이 프로그램을 설치하려고 하면 운영체제, 서버, 라이브러리 등등을 신경써야한다.

만약 도커를 사용한다면 설치하는 과정이 매우 간단해진다.

그렇다면 도커는 무엇인가?

도커란

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

컨테이너

컨테이너는 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위다.
컨테이너로 프로그램과 실행환경을 추상화하도 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순화게 해준다.

컨테이너 이미지
코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는 데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지
런타임에 컨테이너가 되고 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다.
컨테이너는 소프트웨어를 환경으로부터 격리시킨다.

도커 CLI에 커멘드를 입력하면 도커 서버가 그 커멘드를 받아 작업을 진행한다.
ex) run 커멘드 실행 -> 이미지가 로컬에 cache가 되어 있는지 확인 -> Docker Hub에 이미지 저장 + 로컬에 cache로 보관 -> 이미지 컨테이너 생성

가상화

  • hypervisor 가상화

물리적인 서버에서 하나이상의 독립적인 운영체제가 돌아가는 구조로 host os위에 여러 다른 독립적인 os가 가상적으로 돌아가는 것

물리적 서버의 리소스를 더 효율적으로 사용이 가능하다는 장점이 있음.

이런게 내가 하고 싶은 내 윈도우 pc에서 ubuntu os를 설치하는 것과 같은 구조

하나의 서버에 여러 OS를 실행시키면 CPU를 idle 상태로 두지않고 필요한 OS나 서비스에 할당하여 리소스를 훨씬 효율적으로 사용할 수 있다.


  • CPU의 idle상태 = 유휴상태 모든 task는 cpu에서 특정한 양의 처리시간을 차지하는데, 이 task를 끝내면 유휴상태가 된다. 가상화를 하지 않으면 기존 os만 운영하는 경우 서버의 모든 리소스를 항상 모두 사용하기 어렵기때문에 서버 리소스들이 idle상태로 낭비되는 경우가 있는데 가상화를 하면 cpu를 idle상태로 놔두지 않고 필요한 os 에 할당하여 리소스를 더 효율적으로 운영할 수 있게 된다.

  • container 가상화

컨테이너란?

컨테이너는 host os상에서 리소스를 논리적으로 구분(물리적으로 구분 x)하여 마치 별도의 서버인것 처럼 사용할 수 있게 해주는 기술.

이미지의 목적에 따라 생성되는 프로세스 단위의 격리 환경.

컨테이너 가상화는 os커널 위의 유저 공간에서 실행된다.

운영체제를 독립적으로 운영하는것이 아니라 독립적인 user space를 가상화하는 것

host OS위에 어플리케이션의 실행패키지인 이미지를 배포하는 것

도커는 하이퍼바이저와 guest os가 필요하지 않아 더 가벼움! → 기존 가상화보다 빠르고 쉽게 독립적인 가상환경 실행가능

하지만

완전히 독립적인 운영체제 가상화가 아니라서 하이퍼바이저 가상화보다 보안이 취약

또한 user space의 가상화를 하다보니 완전히 다른 운영체제를 가진 호스트에서는 실행을 시킬수가 없다.

컨테이너와 가상화의 가장 큰 차이점은 게스트 os의 유무이다.

컨테이너는 게스트 os를 설치하지 않아 가상머신보다 자원을 효율적으로 사용할 수 있다. → 가상머신은 하나씩 늘때마다 os를 위한 자원을 할당해줘야하지만 도커는 어플리케이션을 구동하는데 필요한 모든 패키지만 있으면 컨테이너를 구동시킬 수 있다.

⇒ 가상머신은 게스트os를 사용하기 위한 라이브러리, 커널등을 전부 포함하기 때문에 가상머신을 배포하기 위한 이미지로 만들었을때 크기가 큼

컨테이너는 필요한 커널을 호스트os의 커널을 공유하여 사용하소, 컨테이너 안에는 어플리케이션을 구동하는데 필요한 라이브러리 및 실행파일만 존재

가상화보다 이미지로 만들었을때 용량이 줄어듬 → 배포하는 시간이 빨라짐

도커는 어떻게 동작하는가?

도커의 컨테이너는 호스트 os의 커널을 공유한다.


  • 커널이란? 커널이란 하드웨어 자원을 관리하고 하드웨어와 프로세스 사이의 인터페이스 역할을 수행하는 os의 핵심 구성 요소 중 하나이다. 커널의 주요 기능은 컴퓨터에 속한 자원들에 대한 접근을 중재하는 것 소프트웨어가 컴퓨터시스템에서 수행되기 위해서는 메모리에 그 프로그램이 올라가 있어야한다. 운영체제 역시도 소프트웨어로서 컴퓨터 전원이 켜지면 메모리에 올라갸야한다. 하지만 운영체제처럼 너무 큰 프로그램이 모두 메모리에 올라가면 한정된 메모리 공간의 낭비가 심할것이다. 따라서 운영체제 중 항상 필요한 부분만 메모리에 올려놓고 나머지는 필요할 때만 메모리에 올려 사용하게 된다. 이때 메모리에 상주하는 운영체제의 부분을 커널이고 하고 운영체제에서 가장 핵심적인 부분을 뜻한다.

호스트os와 하나의 커널을 공유하고 있기때문에 호스트 시스템에서도 컨테이너 내부의 프로세스를 볼 수 있다. (MySQL을 도커 컨테이너에서 시작해도 호스트의 쉘에서 프로세스를 검색하면 MySQL 프로세스를 찾을 수 있다)

그런데 어떻게 도커는 독립된 공간을 만들어 낼 수 있을까?

이는 리눅스 커널의 Cgroup(control groups)과 네임스페이스 기능을 이용해서 구현되어 있다. 이 기능을 이용해서 다른 프로세스 사이에 벽을 만든다.

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

  • C Group: CPU, 메모리, Network, HD I/O 등 프로세스 그룹의 시스템 리소스 사용량을 관리
    • 어떤 애플리케이션 사용량이 너무 많다면 그 어플리케이션 같은 것을 C Group에 집어 넣어서 CPU와 메모리 사용 제한 가능 (필요한 만큼만 할당해줌)
  • 네임스페이스: 하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술(별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술)

도커 엔진은 또다른 하나의 가상머신으로 게스트os를 가지고 있다. 도커의 게스트 os가 리눅스가 되고 이 위에 쌓이는 컨테이너들은 더이상 게스트 os가 깔리지 않게 되고 리눅스 커널의 기능으로 각 컨테이너들은 격리된다.

도커 그 자체로는 가상머신이기 때문에 하이퍼 바이저를 포함하고 있고 실제 PC와 가상 환경인 도커의 관계에서는 게스트os이고 도커와 컨테이너관계에서는 호스트os인 리눅스가 설치되어 있다.

그리고 도커 위 컨테이너에는 VM과 달리 OS가 설치되지 않는다.


이미지로 컨테이너 생성 순서

이미지는 응용프로그램을 실행하는데 필요한 모든것을 포함하고 있다.
여기서 필요한것은?
1. 컨테이너가 시작될 때 실행되는 명령어 ex) run kakaotalk
2. 파일 스냅샷 ex) 카카오톡을 실행하는데 필요한 파일을 카피한것

이미지로 컨테이너 만드는 순서
1. Docker 클라이언트에 docker run <이미지> 입력
2. 도커 이미지에 있는 파일 스냅 샷을 하드 디스크에 옮긴다.

3. 이미지에 가지고 있는 명령어를 이용해서 실행할 프로그램 실행

profile
혼자 이것저것 해보는걸 즐깁니다..!

0개의 댓글