본문 바로가기

Container/Docker

03. Docker 시스템

Docker Engine
 
 
도커 엔진을 설치하면 Docker CLI, 도커 데몬,  REST API 서버 를 백그라운드 서비스로 실행한다.
 
도커 데몬은 이미지 컨테이너 볼륨 및 네트워크와 같은 Docker 객체를 관리한다.
 
Docker REST API 서버는 프로그램이 도커 데몬과 통신을 위해 사용할 수 있는 API 인터페이스이다.
 
이 REST API 를 활용해서 자신의 도구를 만들수 있다.
 
CLI 는 앞으로 다뤄볼 docker run 등의 명령어 셋을 제공하며 명령어 셋을 사용하더라도 
 
내부적으로는 REST API 를 사용해서 도커 데몬과 통신한다.
 
 
도커 CLI 가 반드시 동일한 호스트에 있을 필요는 없고 랩톱과 같은 다른 시스템에 있을 수 있는데
 
이 경우 docker -H 옵션을 통해 도커 엔진  주소와 포트 정보를 제공하여 도커 엔진이 설치된 도커 호스트에 
 
명령을 보낼수 있게 된다.
 
 
예를 들어 다음과 같이 도커 엔진에 컨테이너를 생성하도록 명령을 줄 수 있다.
 
 
 
Namespace
 
VM 에서는 게스트 머신별로 독립적인 공간을 제공하고 서로가 충돌하지 않도록 하는 기능을 갖고 있다.
 
리눅스에서는 이와 동일한 역할을 하는 네임 스페이스 기능을 커널에 내장하고 있고
 
  • mnt (파일시스템 마운트): 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템을 마운트하거나 언마운트 가능
  • pid (프로세스): 독립적인 프로세스 공간을 할당
  • net (네트워크): namespace간에 network 충돌 방지 (중복 포트 바인딩 등)
  • ipc (SystemV IPC): 프로세스간의 독립적인 통신통로 할당
  • uts (hostname): 독립적인 hostname 할당
  • user (UID): 독립적인 사용자 할당
 
Docker 에서는 이 네임 스페이스 기능을 사용한다.
 
즉 Docker 는 네임 스페이스를 사용하여 작업 공간 프로세스 ID 네트워크 등의 컨테이너 리소스를 분리한다.
 
 
예를 들어 프로세스를 네임스페이스로 어떻게 격리하는지 살펴보자.
 
리눅스 시스템이 부팅될 때마다 하나의 프로세스만으로 프로세스를 시작한다. ( PID : 1 )
 
이것은 루트 프로세스이며 시스템 시간에 따라 시스템의 모든 다른 프로세스를 차일드 프로세스로 시작한다.
 
이 프로세스 ID 는 유니크하여 동일한 프로세스 ID 를 가질 수 없다.
 
 
이제 컨테이너를 시작하였다고 생각해보자.
 
이는 기본적으로 현재 시스템 내에서 시작한 자식 시스템이 된다.
 
이 자식 시스템은 독립적인 시스템으로 루트 프로세스에서 시작된 고유한 프로세스 셋을 가진다.
 
 
하지만 실상 기존 시스템에 실행된 프로세스에도 해당 프로세스가 잡히지만 네임 스페이스 공간에서
 
조회시와 도커 호스트에서 조회시 PID 가 서로 다르게 나오게 된다.
 
 
어쨌던 도커는 이 네임 스페이스 기능을 사용하여 분리된 환경을 컨트롤 하고 자신의 리소스만 확인 가능하게 된다.
 
 
cgroups
 
cgroup 은 cpu, memory 등의 자원에 대한 제어를 가능하게 해주는 리눅스 커널의 기능이다.
 
  • 메모리
  • CPU
  • I/O
  • 네트워크
  • device 노드(/dev/)
 
도커에서도 이 기능을 사용해 도커 호스트의 자원을 컨테이너 별로 할당할 수 있다.
 
 
 
Docker 라이프 사이클
 
1.  Build  => 특정 사용자가 Dockerfile 을 빌드해서 Docker Image 를 만든다.
 
2.  Push => Docker Registry 에 이미지를 저장한다.
 
3.  Search, Pull, Run =>  이후 다른 사용자가 Docker Registry 에서 해당 이미지 를 검색 (Search) 및 다운 (Pull) 하여 실행 (Run) 한다.
 
4. Commit => 실행중인 이미지 (컨테이너) 에서 변경 사항이 발생해서 이를 로컬 이미지에 저장한다.
 
5. Push => 현재 수정된 이미지를 다시 저장한다.
 
 
 
 
Docker Hub
 
위에 Docker Registry 라는 이름으로 이미 그려넣었는데  Docker Hub 라는 공식 도커 이미지 Registry 사이트가 이미 있다. 
 
즉 Docker 는 Docker Hub 를 통해 이미지를 공유하는 생태계가 구축되어 있다.
 
유명 리눅스 배포판과 오픈 소스 프로젝트 ( Nginx 등 ) 의 Docker 이미지는 모두 Docker Hub 에서 구할 수 있다.
 
hub.docker.com 에서 검색하거나 docker search [검색어] 명령으로 사용 가능한 이미지를 검색할 수 있고 결과는 동일하다. 
 
 
보통 ubuntu, centos, redis 등 OS 나 프로그램 이름을 가진 이미지가 공식 이미지이고 
 
나머지는 사용자들이 만들어 공개한 이미지이다.
 
태그의 목록은 해당 이미지를 클릭하고 들어가면 볼 수 있다.
 
 
도커 이미지를 받는 방법도 바로 확인할 수 있다.
 
   
hub.docker.com 에서 도커 이미지를 검색하고 
 
관리자 권한에서 docker pull 을 실행하면 해당 컨테이너를 관리자 권한으로 얻어오면 된다.
 
 

'Container > Docker' 카테고리의 다른 글

07. Docker Image  (0) 2020.01.14
06. Docker Run  (0) 2020.01.14
04. Docker CE 설치하기  (0) 2020.01.14
02. 가상 머신과 Docker  (0) 2020.01.14
01. Docker 소개  (1) 2020.01.14