반응형
  • 컨테이너
  • 컨테이너 이미지
  • 컨테이너 동작 방식

컨테이너와 컨테이너 이미지의 구조

컨테이너는 하나의 Application 프로세스 (컨테이너 1개 = Application 1개)

컨테이너

각 컨테이너는 완전히 독립되어 운영된다.(Isolate)
그리고, cpu, memory, network, disk등의 하드웨어 리소스, user id등을 각각 따로따로 가지고 있다. 완전히 독립되어 있다.(1개의 커널로 동작하기 때문에, 하나의 리소스가 분배되어 각 리소스가 할당되어 실행된다.)

컨테이너는 어떻게 동작 하는가?

docker host는 리눅스 커널을 가지고 있는 OS 시스템 위에 도커를 설치해서 docker demon을(도커 데몬) 실행하는 형태이다.

도커 데몬이 동작되고 있는 리눅스 커널이 있는 시스템을 docker host라고 부른다. 
즉, "docker가 컨테이너를 실행 할 수 있는 플랫폼을 만들어 놓았다. " 라는 의미이다. 

docker host/도커 호스트

앞서 살펴보았던 여러가지 도커 컨테이너를 도커 데몬하에  동작 시킬 수 있다. 
도커 데몬이 없으면 컨테이너가 동작할 수 없다.

각 컨테이너는 완벽히 독립적이다. 하지만 커널은 1개이다.

각 컨테이너의 하드웨어는, 커널에 있는 하드웨어가 분할 할당되어 각 컨테이너에서 독립적으로 쓰인다. 

호스트 입장에서 컨테이너는, 단순히 동작되는 프로세스이다.
하지만, 우리는 컨테이너가 완전히 독립적인 상태로 운영되고 있는 Application으로 관리하는 것이다.

 

컨테이너를 내부적으로 살펴보기

컨테이너 내부

예를들어, 프론트딴에서 실행하고있는 nodejs의 어플리케이션 하나를 실행 한다고 가정해보자.

application 컨테이너의 목적은 "app.js를 잘 실행하는 것" 이다. 
그런데, app.js를 실행하려면 node.js가 필요하다.

①그래서 nodejs 설비를 만들어 주는 것이다. (ex 참치를 옮기기 위한 냉동고)
②그리고나서 app.js를 넣는다 (물건을 넣는다.)
③그리고나서 이 컨테이너가 실행될 때, app.js가 동작해서 웹서비스가 실행되도록 하는 것이다.

이 과정을 좀더 살펴보자.

node app.js 컨테이너

  1. 가장 아래있는 nodejs를 "base image Layer"(설비)라고 한다.
  2. 그리고나서 두번째 레이어에는 app.js 를 집어넣는다. 이것이 바로 "source image layer"이다. 
  3. 세번째 레이어에서는 이것을 동작시키는 방법을 나열해 놓았다.

이렇게 3개의 레이어를 가지고 만들어진 컨테이너이다.

 

이번에는 시스템 관점으로 살펴보자.

base image layer의 경우 우리는 nodejs라고 했지만, 시스템은 이것을 저장 할 때, "UUID"로 저장해준다.

※UUID란? - UUID란 네트워크 상에서 고유성이 보장되는 id를 만들기 위한 표준 규약이다.UUID는 Universally Unique IDentifier의 약어이고 범용 고유 식별자라고 한다. ... UUID는 128비트의 숫자이며, 32자리의 16진수로 표현된다.

그리고 해당 layer의 사이즈도 함께 저장한다.

base image layer를 통해서 설명했지만 다른 layer도 마찬가지이다.

컨테이너 이미지/container image

컨테이너 이미지란?(container image)

1개의 컨테이너 이미지는 여러레이어(1개 이상)으로 구성해서 하나의 Application이 잘 실행될 수 있도록 모아져 있는 image들의 조합이다.

해당 구조를 알고 있으면, 나중에 컨테이너를 빌드하는데에 유용하다. 

 

컨테이너 VS 컨테이너 이미지 (컨테이너와 컨테이너 이미지 차이)

컨테이너와 컨테이너 이미지

  • Container Image
  • Container

Docker Host가 있다고 가정해보자. 당연히 그 위에는 Docker Demon이(dockerd)가 동작 중일 것이다.
그리고 3개 layer짜리의 컨테이너 이미지가 여러개 저장되어 있다고 가정해보자. 이때 컨테이너 이미지들은 하드디스크에 file형태로 저장이 되어있다. 각각의 layer별로 폴더별로 파일이 따로따로 존재한다. ex 3layer면 3개의 폴더로 파일이 저장.

이렇게 "파일로 저장되어있는 저장된 상태" 컨테이너 이미지 라고 부른다.
컨테이너 이미지는 Read Only로 읽기만 가능하다.

근데, 컨테이너 이미지를 실행을 하면, 메모리에 컨테이너로 하나의 Application Process로 running중인 것이다. 
이때 실행중인 컨테이너이미지 Application Process"컨테이너"라고 부른다.
컨테이너 이미지가 컨테이너화 되면, 그제서야 Read Write가 가능하게 된다.

 

컨테이너 동작방식

도커 컨테이너 동작방식

도커 호스트가 있다. 그리고 hub가 있다. (hub.docker.com)은 도커 닷컴에서 운영하고 있는 컨테이너 이미지를 저장해 놓은 창고이다. 수많은 컨테이너가 저장되어 있다. 

도커 호스트위에는 도커데몬이 동작중이다. 그러면, 도커 클라이언트 명령을 실행할 수 있다.  

도커데몬에게 명령을 요청하는

[도커 서치커맨드] 를 데몬에게 요청한다. 

$ docker search nginx # 도커 허브에 엔진엑스가 있는지 찾아봐줘

 

그러면, 도커데몬은 도커허브에 검색을 해서 nginx가 있는지 확인을 해서 nginx가 있으면 list를 우리에게 출력 해준다. 

허브에 "해당 컨테이너가 있구나" 라고 찾았으면, 해당 컨테이너 이미지를 가져올 수 있다. 

[도커 이미지를 가져오는 명령어]

$ docker pull nginx:latest

허브에 있는 도커 컨테이너 이미지를 나의 하드디스크로 가져오게 된다. 

만약, layer가 여러개(5개) 있는 도커 이미지 1개라면, 5개의 폴더를 가지고 파일이 저장된다.  
즉, 다운받은 이미지는 1개지만, 그안에 layer별로 파일이 따로따로 저장된다.

[도커 컨테이너를 동작하는 명령어]

$ docker run -d --name web -p 80:80 nginx:latest

그러면, 도커 컨테이너 이미지가 도커데몬 위에서 컨테이너화 되어 현재 실행중인 Application이 되는 것이다. 

컨테이너 고객

이때 고객은, 80번 포트에(local host, ip or host name) 연결하면, nginx가 web페이지를 고객에게 보내게 된다. 

최종적으로 고객이 접속할 수 있는 서버를 컨테이너 기반으로 만든 것이다. 

 

용어 정리

도커 용어

  • Docker Host(Linux Kernel) - 도커데몬이 동작되고 있는 시스템
  • Docker Demon - 설치한 도커, systemctl start docker 명령가지고 실행한 도커
  • Docker Clinet Command : docker demon에게 작업을 요청
  • Docker Hub - docker.com에서 제공해주는 컨테이너 이미지를 모아놓은 hub
  • Container Images - image layer별로 폴더에 파일이 저장
  • Container - 컨테이너 이미지를 실행해서 하나의 프로세스 상태로 동작
반응형