개발자/인공지능과 인간

도커 Docker 기본적인 이해

지구빵집 2020. 8. 7. 09:03
반응형

 

도커는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. Docker의 로고를 보면 고래 등에 컨테이어가 잔뜩 실려있습니다. 컨테이너 안에 다양한 제품을 싣고 규격화되어 다양한 운송 수단을 이용해 쉽게 옮길 수 있습니다.  

도커 공식 홈페이지에서 도커의 개요를 보면 도커란 "Docker는 컨테이너 이동을 주도하는 회사이며 하이브리드 클라우드의 모든 애플리케이션을 처리할 수 있는 유일한 컨테이너 플랫폼 제공 업체입니다 “라고 쓰여있습니다. 여기서 컨테이너란 무엇일까요? 컨테이너란 "다양한 OS에 여러 application이 올려져 있는 것"을 의미하는 거고 그런 컨테이너를 도커 위에 올리는 방식입니다.

도커에서 가장 중요한 용어 두 개가 바로 컨테이너와 이미지 입니다. 두 가지를 확실히 이해한다면 도커를 반 이상은 이해한 것입니다.

 

docker logo

 

컨테이너(Container) 

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술입니다. 가상화 기술의 하나지만 기존 방식과는 차이가 있습니다. 기존의 가상화 방식은 주로 OS를 가상화하였습니다. 우리에게 익숙한 VMware나 VirtualBox 같은 가상 머신은 호스트 OS위에 게스트 OS 전체를 가상화하여 사용하는 방식입니다. 이 방식은 여러 가지 OS를 가상화(리눅스에서 윈도를 돌린다던가) 할 수 있고 비교적 사용법이 간단하지만 무겁고 느려서 운영환경에선 사용할 수 없었습니다.

이러한 상황을 개선하기 위해 CPU의 가상화 기술(HVM)을 이용한 KVM, Kernel-based Virtual Machine과 반가상화 Paravirtualization방식의 Xen이 등장합니다. 이러한 방식은 게스트 OS가 필요하긴 하지만 전체 OS를 가상화하는 방식이 아니었기 때문에 호스트형 가상화 방식에 비해 성능이 향상되었습니다. 이러한 기술들은 OpenStack이나 AWS, Rackspace 같은 클라우드 서비스에서 가상 컴퓨팅 기술의 기반이 되었습니다. 

가상머신과 Docker

하나의 서버에 여러개의 컨테이너를 실행하면 서로 영향을 미치지 않고 독립적으로 실행되어 마치 가벼운 VM, Virtual Machine을 사용하는 느낌을 줍니다. 실행 중인 컨테이너에 접속하여 명령어를 입력할 수 있고 apt-get이나 yum으로 패키지를 설치할 수 있으며 사용자도 추가하고 여러 개의 프로세스를 백그라운드로 실행할 수도 있습니다. CPU나 메모리 사용량을 제한할 수 있고 호스트의 특정 포트와 연결하거나 호스트의 특정 디렉터리를 내부 디렉터리인 것처럼 사용할 수도 있습니다. 

 

이미지(Image) 

도커에서 가장 중요한 개념은 컨테이너와 함께 이미지라는 개념입니다.

이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미 이러한 이미지를 실행한 상태라고 볼 수 있으며, 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다. 여기서 사용자의 데이터가 남아있어야 하는 상황이 발생합니다. 이 문제는 컨테이너의 데이터를 다른 외부 메모리에 저장하는 방식으로 해결합니다.

 

Docker image

 

ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고 MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있습니다. 좀 더 복잡한 예로 Gitlab 이미지는 centos를 기반으로 ruby, go, database, redis, gitlab source, nginx 등을 가지고 있습니다.

말 그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없습니다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운로드하고 컨테이너를 생성만 하면 됩니다. 한 서버에 여러 개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천 대의 서버도 문제없습니다. 

간단히 도커와 가장 중요한 컨테이너 이미지에 대해 설명했습니다. 자세한 내용은 아래 참고문서를 이용해주시기 바랍니다. 이미지는 참고문서와 미루웨어 강의자료에서 발췌했습니다.

참고이미지로 도커 아키텍처 이미지를 참고하십시요. 아래 상단 이미지는 단순화 시킨 이미지이고, 하단 이미지는 도커 홈페이지에서 가져온 이미지입니다.

docker architecture

 

https://docs.docker.com/get-started/overview/

 

도커 아키텍처에 대한 문서인데 이해하기 쉬워서 첨부합니다.

Docker는 클라이언트-서버 아키텍처를 사용합니다. Docker 클라이언트는 Docker 데몬과 대화합니다. Docker 데몬은 Docker 컨테이너를 빌드, 실행 및 배포하는 작업을 많이 수행합니다. Docker 클라이언트와 데몬은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있습니다. Docker 클라이언트와 데몬은 REST 소켓, UNIX 소켓 또는 네트워크 인터페이스를 통해 통신합니다.

Docker 데몬


Docker 데몬 (dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다. 데몬은 다른 데몬과 통신하여 Docker 서비스를 관리 할 수도 있습니다.

Docker 클라이언트


Docker 클라이언트 (docker)는 많은 Docker 사용자가 Docker와 상호 작용하는 기본 방법입니다. docker run과 같은 명령을 사용하면 클라이언트는 이러한 명령을 dockerd로 보내어이를 실행합니다. docker 명령은 Docker API를 사용합니다. Docker 클라이언트는 둘 이상의 데몬과 통신 할 수 있습니다.

도커 레지스트리


Docker 레지스트리는 Docker 이미지를 저장합니다. Docker Hub는 누구나 사용할 수있는 공개 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성되어 있습니다. 자신의 개인 레지스트리를 실행할 수도 있습니다. docker pull 또는 docker run 명령을 사용하면 필요한 이미지가 구성된 레지스트리에서 가져옵니다. docker push 명령을 사용하면 이미지가 구성된 레지스트리로 푸시됩니다.

도커 객체


Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체를 생성 및 사용하게됩니다. 이 섹션은 이러한 개체 중 일부에 대한 간략한 개요입니다.

이미지

이미지는 Docker 컨테이너를 만드는 지침이 포함 된 읽기 전용 템플릿입니다. 종종 이미지는 다른 이미지를 기반으로하며 추가 사용자 정의가 있습니다. 예를 들어, 우분투 이미지를 기반으로하는 이미지를 만들 수 있지만 Apache 웹 서버와 응용 프로그램 및 응용 프로그램을 실행하는 데 필요한 구성 세부 정보를 설치합니다.

자신의 이미지를 만들거나 다른 사람이 만들고 레지스트리에 게시 한 이미지 만 사용할 수 있습니다. 자신의 이미지를 작성하려면 이미지를 작성하고 실행하는 데 필요한 단계를 정의하기위한 간단한 구문으로 Dockerfile을 작성하십시오. Dockerfile의 각 명령어는 이미지에 레이어를 만듭니다. Dockerfile을 변경하고 이미지를 다시 작성하면 변경된 레이어 만 다시 작성됩니다. 이것은 다른 가상화 기술과 비교할 때 이미지를 매우 작고 빠르게 만드는 이유 중 하나입니다.

컨테이너

컨테이너는 실행 가능한 이미지 인스턴스입니다. Docker API 또는 CLI를 사용하여 컨테이너를 작성, 시작, 중지, 이동 또는 삭제할 수 있습니다. 컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태에 따라 새 이미지를 만들 수도 있습니다.

기본적으로 컨테이너는 다른 컨테이너 및 해당 호스트 시스템과 비교적 잘 격리되어 있습니다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너 또는 호스트 시스템과 분리되는 방식을 제어 할 수 있습니다.

컨테이너는 이미지를 만들거나 시작할 때 제공하는 구성 옵션뿐만 아니라 이미지로 정의됩니다. 컨테이너를 제거하면 영구 저장소에 저장되지 않은 상태 변경이 사라집니다. 

 

참고 

도커(Docker)에 관련된 자료를 정리한 메타문서 깃허브

초보자 도커 안내서 

도커 설치하고 컨테이너 실행하기

도커 이미지 만들고 배포하기

도커 기초 확실히 다지기

도커 Overview

 

 

반응형