All the Things about IT & US stocks
도커

도커(Docker) <1>

1.1. 도커(Docker)란?

도커는 프로그램을 생성, 배포, 실행하기 위한 오픈 소스 프로젝트이다.
도커는 커맨드-라인을 사용하며, 백그라운드 프로세스이다.
도커는 일반적인 소프트웨어 문제를 해결하기 위해 논리적인 접근 방식을 사용하는 원격 서비스 집합이며 소프트웨어 설치, 운영, 배포, 제거를 단순화 한다.
도커는 컨테이너(containers)라는 운영체제에 포함된 기술을 사용하여 동작한다.

1.1.1 “Hello, World”

항상 그래왔듯이, “Hello, World” 예시를 사용할 것이다.
해당 실습을 하기 위해서는 도커를 다운로드 하고 설치 해야 한다. 자세한 방법은 여기를 참조하면 된다(https://docs.docker.com/get-docker/).
도커를 설치한 후 아래의 명령어를 입력한다.

docker run hello-world

해당 명령어를 실행하면 관련 컴포넌트들을 다운로드 한 후 “hello world”를 출력한다. 다시 한 번 같은 명령어를 수행하면 “hello world”만 출력한다.
해당 명령어를 수행하는 동안 몇 가지 일들이 수행된다.
먼저, docker run 명령어는 도커에게 컨테이너 내부에 프로그램을 설치하고 실행할 것을 요청한다.

그 다음 부분, hello-world 는 도커에게 해당 프로그램을 컨테이너에서 수행할 것을 명시한다. hello-world 는 이미지(또는 repository) 이름이다.
즉, 이미지 이름은 실행하거나 설치할 프로그램 이름이라고 보면 된다.

이미지는 자체로 파일 및 메타데이터의 모음이다. 해당 메타데이터는 실행할 특정 프로그램 및 관련 설정 내용을 포함한다.

docker run hello-world 명령어를 처음 실행 하면, 먼저 사용자 시스템에 해당 이미지가 이미 설치되어 있는지를 확인한다. 해당 명령어를 처음 실행 하면, 당연히
해당 이미지가 설치되어 있지 않기 때문에 Docker Hub에서 해당 이미지를 검색한다. Docker Hub는 도커에서 제공하는 공식 저장소이다. Docker Hub에 해당 이미지가 존재하면 해당 이미지를 다운로드 한다.

이미지가 설치되면, 도커는 신규 컨테이너를 생상하고 아래와 같은 명령어를 실행한다.

echo “hello world”

echo 명령어가 “hello world”를 터미널에 출력하고 난 후, 프로그램은 중단되고 컨테이너는 중지(stopped)로 표시된다. 컨테이너의 실행 상태는 컨테이너 내부의 단일 실행 프로그램 상태와 연관 되어 있다. 즉, 프로그램이 중단되면, 컨테이너도 중단되고 프로그램이 실행되면, 컨테이너도 실행된다.

Docker run 실행 후 프로세스

Docker run 실행 후 프로세스

docker run hello-world를 다시 실행하면, 도커는 hello-world 가 설치되어 있는지 다시 확인 한다. 이미 위에서 설치를 했기 때문에 이번에는 Docker Hub에서 다운로드 하지 않고 다른 컨테이너를 생성하고 바로 실행한다.

docker run 명령어를 다시 실행하면, 동일한 저장소를 다시 검색하여 신규 컨테이너를 생성한다.

1.1.2 컨테이너

전통적으로, 유닉스 유형의 운영 체제에서는 jail이라는 용어를 사용하여 해당 프로그램이 접근 할 수 있는 자원 범위를 제한하는 수정된 런타임 환경을 사용했다.
jail 기능은 1979년 이후로 지속적으로 발전해왔다. 2005년에는, Sun의 Solaris 10 및 Solaris Containers가 출시 되었고, 컨테이너는 해당 런타임 환경에서 사용하게 되었다.
컨테이너의 역할은 파일 시스템 범위를 제한하는 것에서 명시적으로 허용되는 경우를 제외한 모든 리소스에서 프로세스를 격리하는 것으로 확장되었다.

컨테이너를 사용하는 것이 권장되긴 했지만 컨테이너 생성을 수동으로 하는 것은 여러 가지 문제를 발생시켰다. 도커는 이러한 문제를 해결하기 위해 등장했다.
도커는 일관적이고 안정적인 컨테이너를 제공하기 위해 기존 컨테이너 엔진을 사용한다.

도커를 통해 사용자들은 훨씬 낮은 비용으로 컨테이너를 사용할 수 있다. “hello world”를 실행하기 위해서 특별한 지식이 필요하지도 않다.
도커는 컨테이너 엔진을 지속적으로 개선하고 사용자들은 최신 기능을 사용할 수 있다.

1.1.3 컨테이너와 가상화의 차이

클라우드 네이티브 시대에, 사람들은 가상 머신을 배포 단위로 생각하게 되었다. 단일 프로세스를 배포한다는 것은 하나의 네트워크로 구성된 가상 머신을 의미한다.
가상 머신은 가상 하드웨어를 제공한다. 가상 머신을 생성하기 위해서는 시간이 오래 걸리고 상당한 자원을 필요로 한다. 왜냐하면 가상 머신은 사용자가 원하는 소프트웨어를 사용하기 위해
운영 체제 전체를 실행하기 때문이다. 가상 머신이 구동된 후에는 최적화를 수행할 수 있지만 해당 지연 시간은 특정 상황(실시간이 요구되는)에서 가상 머신의 활용도를 낮추게 된다.

가상 머신과는 다르게, 도커 컨테이너는 하드웨어 가상화를 사용하지 않는다. 도커 컨테이너 내부에서 실행되는 프로그램은 호스트의 리눅스 커널에 직접 접근한다.
대부분의 프로그램이 별도의 운영 체제를 실행할 필요가 없고 전체 부팅 시퀀스의 지연 없이 격리된 상태로 실행될 수 있다. 이것은 중요한 차이점이다.
도커는 하드웨어 가상화 기술이 아니다. 대신, 도커는 이미 운영체제 커널에 포함된 컨테이너 기술을 사용한다.

가상 머신은 하드웨어 추상화를 제공하며 사용자는 운영체제를 실행할 수 있다. 컨테이너는 운영체제의 기능이다. 따라서 사용자는 가상 머신에서 도커를 사용할 수 있다.
컨테이너 기술은 상호보완적인(complementary) 기술이다.

1.1.4 컨테이너에서 소프트웨어 실행하기

컨테이너와 격리 기능은 이미 오래 전부터 사용되어 왔다. 도커는 리눅스 네임스페이스(Linux namespaces)와 cgoups를 사용한다. 해당 기능은 2007년부터 리눅스 기능에 포함되었다.
도커는 컨테이너 기술을 제공하지 않지만 해당 기술을 사용하기 쉽게 한다.

커맨드 라인(CLI)은 다른 프로그램들과 마찬가지로 사용자 공간 메모리(user space memory)에서 실행된다. 사용자 공간에서 실행되는 프로그램은 커널 공간 메모리에 접근할 수 없다.

아래 그림에서는 사용자 공간에서 실행되는 2개의 프로그램이 존재한다. 하나는 도커 엔진(Docker daemon)이고 다른 하나는 도커 CLI(Docker CLI) 이다.
해당 프로그램들은 도커와 사용자들 간의 인터페이스이다.

또한 그림에는 3개의 실행 중인 컨테이너가 있다. 각각의 컨테이너들은 도커 엔진의 차일드 프로세스로 실행되며, delegate 프로세스는 자체 사용자 공간의 하위 공간에서 실행된다.
컨테이너 내부에서 실행되는 프로그램들은 컨테이너 내부의 메모리와 리소스에만 접근할 수 있다.

1.1.5 컨테이너 배포

우리는 도커 컨테이너를 실제 물리적인 선박 컨테이너로 생각할 수 있다. 컨테이너는 애플리케이션(및 관련 라이브러리)을 저장 및 실행하는 박스(box) 이다.
크레인, 트럭, 기차 및 선박이 컨테이너와 쉽게 작업 할 수있는 것처럼 도커는 컨테이너를 손쉽게 실행, 복사 및 배포 할 수 있다. 컨테이너에 포함된 컴포넌트를 이미지(image)라고 부른다.

위의 예시에서 사용한 hello-world 가 이미지 네임이다. 일반적으로, 도커 이미지는 컨테이너 내부에서 실행되는 프로그램에서 사용되는 모든 파일들을 모아놓은 스냅샷이다.
사용자는 해당 이미지를 통해 원하는 만큼의 컨테이너를 생성할 수 있다. 하지만, 이렇게 생성된 컨테이너는 파일 시스템을 공유하지 않으며 각 컨테이너의 변경사항 또한 다른 컨테이너에 반영되지 않는다.

사용자들은 도커를 통해 소프트웨어를 배포하고, 해당 소프트웨어는 이미지 형태로 배포 된다. 해당 이미지를 사용하는 사용자들은 해당 이미지를 통해 컨테이너를 생성한다.

도커는 도커 이미지 배포를 용이하게 하는 인프라스트럭처 컴포넌트 집합을 제공한다. 해당 컴포넌트들은 레지스트리와 인덱스이다. 사용자들은 Docker Inc., 제공하는 공식 인프라스트럭처를 사용할 수 있으며 다른 호스팅 기업 또는 사용자가 직접 생성한 레지스트리 및 인덱스를 사용할 수 있다.

참조: Docker in Action 2nd Edition

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

back to top