[Docker] 도커 기본

밀크야살빼자·2023년 10월 22일
0
post-thumbnail

도커를 쓰는 이유

어떤 프로그램을 다운 받는 과정을 굉장히 간단하게 만들기 위해서이다.

도커 없이 프로그램 받을때 원래 프로그램을 다운받고 실행하는 순서

Installer 다운 -> Installer 실행 -> 프로그램 설치완료

하지만 가끔 에러가 발생한다..

Installer 다운 -> Installer 실행 -> 에러

갖고 있는 서버, 패키지 버전, 운영체제 등등에 따라 프로그램을 설치하는 과정중에 많은 에러들이 발생하는것 뿐만아니라 설치 과정 또한 복잡하다.

프로그램 다운 받는 것을 도커 없이 원래 방식으로 다운 받을때도커를 이용해서 받을때의 차이점

도커 없이 Redis 받는 과정

Redis 홈페이지 -> redis.io

Installration

$ wget http://download.redis.io/releases/redis-6.0.4.tar.gz
$ tar xzf redis-6.0.4.tar.gz
$ cd redis-6.0.4
$ make

도커로 Redis 받는 과정

docker run -it redis -> 다운로드 끝

도커를 이용하여 프로그램 설치하면 예상치 못한 에러도 덜 발생하며, 설치하는 과정도 훨씬 간단해 진다.

도커란 무엇인가?

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

  • 컨테이너 : 컨테이너 안에 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다
    예를 들어, 일반 컨테이너의 개념에서 물건을 손쉽게 운송 해주는 것처럼 프로그램을 손쉽게 이동 배포 관리를 할 수 있게 해준다.

도커 이미지와 도커 컨테이너 정의

  • 컨테이너
    : 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위이다. -> 간단하고 편리하게 프로그램을 실행 시켜주는 것으로 정의를 내리고 있다.

  • 컨테이너 이미지
    : 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지이다.
    또한 런타임에 컨테이너가 되고 도커 컨테이너의 경우 도커 엔진에서 실행될 때 이미지가 컨테이너가 된다.
    리눅스와 윈도우 기반 애플리케이션 모두에서 사용할 수 있는 컨테이너화된 소프트웨어는 인프라에 관계없이 항상 동일하게 실행된다.
    컨테이너는 소프트웨어를 환경으로부터 격리시키고 개발과 스테이징의 차이에도 불구하고 균일하게 작동하도록 보장한다.

도커 이미지는 프로그램을 실행하는데 필요한 설정이나 종속성을 가지고 있으며, 도커 이미지를 이용해서 컨테이너를 생성하고, 도커 컨테이너를 이용해서 프로그램을 실행한다.

도커를 사용할 때의 흐름

항상 도커를 사용할때는

1. 먼저 도커 CLI에 커맨드를 입력한다. 2. 그러면 도커 서버(도커 Daemon)이 그 커맨드를 받아서 그것에 따라 이미지를 생성하든 컨테이너를 실행하든 모든 작업을 하게 된다.

도커 Client(CLI) -> 도커 Server(Daemon)

실제로 CLI에서 커맨드를 입력해보기

1. docker run hello-world

 - Unable to find image 'hello-world:latest' locally : 이것은 이 이미지를 한번도 받은 적이 없어서 로컬에 없다는 뜻이다.
- latest : Pulling from library/hello-world : 어딘가에서 hello-world라는 이미지를 가져온다.

  1. 도커 클라이언트에 커맨드를 입력하면 클라이언트에서 도커 서버로 요청을 보낸다.
  2. 서버에서 hello-world라는 이미지가 이미 로컬에 cache가 되어 있는지 확인한다.
  3. 없으면 Unable to find image라는 문구가 표시된다.
  4. Docker Hub이라는 이미지가 저장되어 있는 곳에 가서 그 이미지를 가져오고 로컬에 Cache로 보관한다.
  5. 그 후 이미지가 있으니 그 이미지를 이용해서 컨테이너를 생성한다.
  6. 이미지로 생성된 컨테이너는 이미지에서 받은 설정이나 조건에 따라 프로그램을 실행한다.
  1. 도커 클라이언트에 명령어 입력 후 도커 서버로 보낸다.
  2. 도커 서버에서 컨테이너를 위한 이미지가 이미 캐쉬가 되어 있는지 확인한다.
  3. 없으면 도커 허브에서 다운 받아오고, 있다면 이미 가지고 있는 이미지로 컨테이너 생성한다.

hello-world가 캐쉬가 된 후에 다시 docker run hello-world를 하면

1. Unable to find image 라는 문구가 없이 프로그램이 실행된다. 2. 캐쉬된 이미지를 사용해서 컨테이너를 만든 후 프로그램을 실행한다.

도커와 기존의 가상화 기술과의 차이를 통한 컨테이너 이해

가상화 기술이 나오기 전

  • 한대의 서버를 하나의 용도로만 사용
  • 남은 서버 공간은 그대로 방치
  • 하나의 서버에 하나의 운영체제, 하나의 프로그램만을 운영
  • 안정적이지만 비효율적이다.

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

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

하이퍼 바이저

  • 네이티브 하이퍼 바이저
    하이퍼바이저가 하드웨어를 직접 제어하기에 자원 효율적으로 사용 가능 하며, 별도의 호스트 OS가 없으므로 오버헤드가 적다. 하지만 여러 하드웨어 드라이버를 세팅해야 하므로 설치가 어렵다.

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

    Core1, Core2가 있는데 각각 독립된 자원을 게스트 OS가 하나씩 받는다.
    하이퍼바이저에 의해 구동되는 VM은 각 VM마다 독립된 가상 하드웨어 자원을 할당받습니다. 논리적으로 분리되어 있어서 한 VM에 오류가 발생해도 다른 VM으로 퍼지지 않는다는 장점이 있다.


VM과 비교했을 때 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않으므로 더 가볍다.
어플리케이션을 실행할 때는 컨테이너 방식에서는 호스트 OS위에 어플리케이션의 실행 패키지인 이미지를 배포하기만 하면 되는데 VM은 어플리케이션을 실행 하기 위해서 VM을 띄우고 자원을 할당한 다음, 게스트 OS를 부팅하여 어플리케이션을 실행 해야 해서 훨씬 복잡하고 무겁게 실행을 해야한다.

공통점

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

차이점

격리된 환경을 얼마나 격리를 시키는지의 차이

도커 컨테이너에서는 컨테이너가 제공하는 격리 기능 내부에 샌드박스가 있지만, 여전히 같은 호스트의 다른 컨테이너와 동일한 커널을 공유한다. -> 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템(모든 프로세스를 나열할 수 있는 충분한 권함 있음)에서 볼 수 있다.
예를 들어서 도커와 함께 몽고DB 컨테이너를 시작하면 호스트(도커x)의 일반 쉘에 ps-e grep 몽고를 실행하면 프로세스가 표시된다. 또한, 컨테이너가 전체 OS를 내장할 필요가 없는 결과, 그것들을 매우 가볍고, 일반적으로 약 5-100MB이다.

가상 머신과 함께 VM 내부에서 실행되는 모든 것은 호스트 운영체제 또는 하이퍼바이저와 독립되어 있다. 가상 머신 플랫폼은 특정 VM에 대한 가상화 프로세스를 관리하기 위해 프로세스를 시작하고, 호스트 시스템은 그것의 하드웨어 자원의 일부를 VM에 할당한다. 그러나 VM과 근본적으로 다른 것은 시작 시간에 이 VM 환경을 위해 새롭고 이 특정 VM만을 위한 커널 부팅하고 운영체제 프로세스 세트를 시작한다는 것이다.
예를 들어, 맥에서 윈도우를 깐다는 것

도커 컨테이너 격리 시키는 방법

리눅스에서 쓰이는 Cgroup(Control groups)과 네임스페이스(namespaces)는 컨테이너와 호스트에서 실행되는 다른 프로세스 사이에 벽을 만드는 리눅스 커널 기능들이다.

  • C Group
    CPU, 메모리, Network Bandwith, HD i/o 등 프로세스 그룹의 시스템 리소스 사용량을 관리한다. => 어떤 어플이 사용량이 너무 많다면 그 어플리케이션 같은 것을 C group에 집어 넣어서 CPU와 메모리 사용 제한 기능이다. (필요한 만큼만 할당)

  • 네임스페이스
    하나의 시스템에서 프로세스를 격리시킬 수 있는 가상화 기술이다.
    별개의 독립된 공간을 사용하는 것처럼 격리된 환경을 제공하는 경량 프로세스 가상화 기술이다.

이미지로 컨테이너 만들기

💡 이미지는 응용 프로그램을 실행하는데 필요한 모든 것을 포함하고 있다.

필요한 모든 것

  • 컨테이너가 시작 될 때 실행되는 명령어 ex) run kakao talk
  • 파일 스냅샷(디렉토리나 파일을 카피 한것) ex) 컨테이너에서 카카오톡을 실행하고 싶다면, 카카오톡 파일 스냅샷

이미지로 컨테이너 만드는 순서

  1. docker 클라이언트에 docker run <이미지> 입력한다.
  2. 도커 이미지에 있는 파일 스냅샷을 컨테이너 하드 디스크에 옮겨 준다.
  3. 이미지에서 가지고 있는 명령어(컨테이너가 실행될때 사용될 명령어)를 이용해서 카카오톡을 실행시켜준다.

Cgroup, 네임스페이스를 쓸수 있는 이유

컨테이너를 격리 시킬 수 있는 이유는 Cgroup과 네임스페이스를 이용해서이다.

사용자 컴퓨터는 MacOS와 Windows이지만 도커는 리눅스 환경에서 돌아가고 있다. 또한 리눅스 커널을 사용하고 있어서 CGroup과 네임스페이스도 사용할 수 있다.

📜출처

profile
기록기록기록기록기록

0개의 댓글