도커 (소프트웨어)
도커(Docker)란 리눅스 운영체제에서 소프트웨어 컨테이너 기술을 기반으로 한 가상화 플랫폼 서비스이다.
개요
도커는 2013년에 등장한 오픈소스 컨테이너 기반 가상화 도구이다. 도커는 항만(부두) 노동자라는 의미를 가지고 있다. 프로그래밍 컨퍼런스 파이콘 US 2013 에서 솔로몬 하이크(Solomon Hykes)가 리눅스의 컨테이너 기술을 사용한 도커를 처음 발표했다. 현재 도커는 고(GO) 언어로 개발되고 있으며, 2014년에 1.0 버전을 발표한 이후, 2020년 현재 최신 버전은 19.03.8 이다. 도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 계층화된 파일 시스템에 기반해 효율적으로 이미지 프로세스 실행 환경을 구축할 수 있도록 해준다. 도커를 사용하면 이미지를 기반으로 컨테이너를 실행할 수 있으며, 다시 특정 컨테이너의 상태를 변경해 이미지로 만들수 있다. 이렇게 만들어진 이미지는 파일로 보관하거나 원격 저장소를 사용해 쉽게 공유할 수 있으며, 도커만 설치되어 있다면 필요할 때 언제 어디서나 컨테이너로 실행하는 것이 가능하다.[1] 도커는 복잡한 리눅스 응용 프로그램들을 하나의 컨테이너로 묶어서 실행할 수 있다. 그 이유는 개발 테스트 및 서비스 환경을 하나로 통일하여 효율적으로 관리할 수 있기 때문이다. 이로 인해 많은 사람들에게 주목을 받기 시작했다. 파일을 이미지파일로 변환하여 공유하고 리눅스 커널에서 제공하는 컨테이너 기술을 활용하여 전세계 사람들과 공유도 가능하다. Github와 비슷한 방식의 도커허브(Hub)를 제공한다.
기능
구성요소
- 소프트웨어 : 부두 노동자의 데몬 이라고는 dockerd는 도커 컨테이너 및 핸들 컨테이너 객체를 관리하는 지속적인 과정이다. 데몬은 도커엔진 API를 통해 전송 된 명령을 받는다. 도커 클라이언트 프로그램 은 사용자가 도커 데몬과 상호 작용할 수있는 명령 인터페이스 를 제공한다.
- 도커 객체는 도커에서 애플리케이션을 모으은 데 사용되는 방식이다. 도커 객체의 주요 클래스는 이미지, 컨테이너 및 서비스를 제공한다. 컨테이너는 응용 프로그램을 실행하는 표준화 된 캡슐화 된 환경이다. 컨테이너는 부두 노동자의 CLI 또는 API를 사용하여 관리된다. 도커 이미지는 컨테이너를 빌드하는 데 사용되는 읽기 전용 템플릿이다.. 이미지는 응용 프로그램을 저장하고 배송하는 데 사용된다. 도커 서비스를 사용하면 컨테이너를 여러 도커 데몬으로 확장 할 수 있고 그 결과 도커API를 통해 통신하는 협력 데몬세트를 (스왐)swarm 이라고 한다.
- 레지스트리(Registry) : 도커 레지스트리는 도커의 이미지 저장소이다. 도커 클라이언트는 레지스트리에 연결하여 사용하기 위해 이미지를 다운로드(Pull)하거나 빌드 한 이미지를 업로드(Push)한다. 레지스트리는 공개계정과 비공개계정으로 나뉜다. 주요 공용 레지스트리는 도커 허브와 와 도커 클라우드가 있다. 도커허브는 도커가 이미지를 찾는 기본 레지스트리이다.
기능
- 빌드(Build): 이미지 생성
- 도커는 응용 프로그램과 실행에 필요한 라이브러리, 미들웨어, 운영체제, 네트워크 설정 등 필요한 모든 파일을 모아서 도커 이미지 파일로 만든다. 도커 이미지는 명령어를 이용해 수동으로 만들 수도 있지만 자동으로 이미지를 빌드하여 배포를 하는 지속적 배포 결합 환경에서는 도커 설정 파일을 이용해 자동으로 만들수 있다.보통 이미지에는 하나의 응용 프로그램만 넣고 여러 컨테이너를 조합해서 서비스를 구축하는 방법을 사용한다. 또한 이미지 여러 개를 같이 사용할 수 있다. 예를 들면 CentOS 리눅스 이미지와 Nginx 웹 서버 이미지를 겹쳐서 새로운 이미지를 만들 수 있다.
- 쉽(Ship): 이미지 공유
- 도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리(Docker Registry)라고 한다. 대표적으로는 도커의 공식 레지스트리인 도커허브(Docker Hub) 가 있다. 도커 허브에서는 업체에서 제공하는 공식 이미지를 받을 수 있다.[2] 우분투나 센트OS 같은 운영체제 이미지, 마이에스큐엘, 레디스, Nginx 와 같은 미들웨어와 플랫폼 이미지도 제공한다.이런 베이스 이미지를 활용하면 환경을 빠르고 안전하게, 그리고 자동으로 구축할 수 있다. 내가 만든 응용 프로그램을 이미지로 만들어서 업로드하고 공유할 수 있습니다. 깃허브 와 같은 형상관리도구와 연동해서 도커파일 을 관리하고 도커 이미지를 자동으로 빌드해서 도커 허브로 배포도 가능하다.퍼블릭 클라우드에서는 비공개 레지스트리와 지속적 배포를 쉽게 구성할 수 있는 기술을 제공합니다. 아마존 컨테이너나 구글의 클라우드 플랫폼이 포함된다. 사실 도커 이미지는 보안에 취약하다. 이미지 공유 기술을 악용하여 보안상 위협이 되는 프로그램을 심기도한다. 이를 방지하기 위해서 컨테이너를 스캔하고 정책에 위배되는 이미지는 배포를 허용하지 않는다.
- 런(Run) - 컨테이너 동작
- 도커는 도커 이미지를 가지고 컨테이너를 생성하여 동작한다. 하나의 이미지를 가지고 다수의 컨테이너를 만들기도 한다. 이렇게 만든 컨테이너들을 관리하기 위한 여러 명령을 사용한다. 실제 업무에서는 보통 한 대의 호스트에 모든 컨테이너를 동작시키는 것이 아니라 여러 호스트로 된 분산 환경으로 작동된다. 분산 환경에서 여러 노드의 컨테이너를 관리하기 위해 쿠버네티스(Kubernetes, k8s)와 같은 컨테이너 오케스트레이션 툴(Container Orchestration Tool)을 주로 사용한다. 오케스트레이션이란 컨테이너 배포, 장애 복구, 로드 밸런싱 등 여러 기능을 자동으로 처리해주는 것을 말한다. 음악회의 오케스트라를 보면 지휘자의 신호에 맞게 음악을 연주한다. 이와같이 컨테이너 동작시에 자동화 프로그램을 이용하여 컨테이너의 데이터를 관리한다.[2]
리눅스 컨테이너
- 도커는 리눅스의 컨테이너 방식을 사용하여 프로그램이 작동한다. 컨테이너 방식은 가상머신의 발달도 등장하게 되었다. 컴퓨터 첫 등장 이후 컴퓨터 성능이 급격히 발전하면서 일반 PC에서도 흔히 사용하게 되었다. 이러한 기술의 발달로 서버의 성능이 향상하게 되었다. 하지만 그만큼 서버에 남아있는 공간도 많고 서버가 일을 하지않으니 문제가 되고 IT 기술이 보편화 되면서 서버도 많아졌다. 그렇기 때문에 컴퓨터에 컴퓨터를 만들어 작동하기 위한 가상머신이 나오게 되었고 서버 자체를 가상머신을 통해서 작동하는 기술이 발달했다. 이는 서버의 빈공간을 가상머신으로 이용하여 서버의 효율을 극대화 시킬 수 있다. 가상머신에 각종 서버 프로그램, 데이터베이스를 설치하여 소프트웨어 응용 프로그램이나 웹사이트를 실행하고, 미리 구축한 가상머신 이미지를 여러 서버에 복사하여 실행하면 이미지 하나로 서버를 계속 만들수 있다. 하지만 가상머신은 이미지 안에 OS가 포함되기 때문에 이미지 용량이 커지게 되어 문제가 발생한다. 컴퓨터자체를 전부 사용하다보니 각종 성능에 손실이 발생하게 되었다. 호스트와 커널을 공유하는 반가상화 기술이 등장 했지만 배포하고 관리하는데 기능이 부족했다. 이를 개선하기 위해 리눅스 컨테이너가 나오게 되었다.[3] 컨테이너 박스는 흔히 선박을 통하여 물건을 수출할때 많이 사용한다. 도커의 로고를 보면 알 수있듯이, 컨테이너는 이동하는 물건을 하나의 공간에 담고 목적지까지 안전하게 보낼수 있다. 컨테이너 없이 물건을 하나하나 쌓아서 보관한다면 없어질 경우도 생기고 물건이 충격을 받는다면 부러지거나 변형이 생길수도있다. 이와같이 리눅스에서도 파일 전송 및 변경시 파일안에 있는 데이터가 아무런 보호없이 간다면 충분히 변조 및 데이터패킷이 변형 될 수있다. 그렇기에 가상의 컨테이너 만들어 사용하면 보관하기에도 편하고 같은 목적지를 가는물건일 경우 더욱 안전하게 갈수 있다. 다운받은 프로그램이 같다 해도 서로다른 환경의 응용체제에서 사용하면 조금은 다르게 작동된다. 이는 서버마다 운영기롣이 다르기 때문인데 어디에서도 프로그램을 실행하더라도 100프로 실행할 수있는 기법이 필요하다. 이를위해 복잡한 IT 환경을 통합하여 포장하는 기술이 컨테이너 기술이다. 언제 어디서든 프로그램을 실행핳때 본래의 의도와 맞게 변형이나 문제없이 프로그램이 실행된다.[4] 리눅스 컨테이너에서는 대표적인 2가지 명령어 네임스페이스(NameSpace)와 cgroups(씨그룹스)가 있다.컨테이너는 가상의 독립된 환경을 만들기 위해 리눅스 커널의 네임스페이스 기능을 사용한다. 쉽게 얘기하면 리눅스 객체에 이름표를 붙여 같은 이름표가 붙여진 것들만 묶어 관리한다. 이를 다른말로 격리(isolated)시킨다 라는 의미를 가지는데 이는 다른 네임스페이스에서는 접근이 불가능하다는 걸 의미한다.
- 네임스페이스
- PID: 각 프로세스에 할당된 고유한 ID 인 PID 를 기준으로 다른 프로세스를 격리한다. 네임스페이스가 다르면 접근할 수없다.
- 네트워크(network): 네트워크 자원(IP 주소, 포트 번호, 라우팅 테이블 등)을 네임스페이스 마다 독립적으로 가져간다.
- UID: 사용자(User ID)와 그룹(Group ID)를 네임스페이스 별로 구분한다. 따라서 컨테이너에서는 루트 권한을 가지고 있더라도 호스트의 관리 권한을 가질 수 없도록 격리가 가능하다.
- 마운트(mount): 리눅스에서 파일을 인식하기 위해 마운트가 필요하다. 파일 시스템 등 마운트된 파일을 네임스페이스별로 격리한다.
- UTS: 호스트명이나 도메인명을 네임스페이스별로 독자적으로 설정이 가능하다.
- IPC: 프로세스 간 통신에 필요한공유 메모리, 세마포어(Semaphore), 메시지 큐(Message Queue) 등을 독자적으로 사용한다.
리눅스에서 프로그램은 프로세스로 실행되고, 프로세스는 하나 이상의 쓰레드로(Tread) 이루어져 있다. cgroups(Control Groups) 는 프로세스와 쓰레드를 그룹화해서 관리하는 기술이다. 호스트 OS의 자원을 그룹별로 할당하거나 제한을 둘 수 있습니다. 즉 컨테이너에서 사용하는 리소스를 제한함으로써 하나의 컨테이너가 자원을 모두 사용해 다른 컨테이너가 영향을 받지 않게된다. 또한 그룹에 계층 구조를 적용할 수 있어 체계적진 자원관리가 가능하다.
- cgroups
- cpu: CPU 사용량 제한.
- cpuacct: CPU 사용량 통계 정보 제공
- cpuset: CPU 나 메모리 배치 제어
- 메모리(memory): 메모리나 스왑(Swap) 사용량 제한
- 디바이스(devices): 디바이스에 대한 접근 제어
- freezer: 그룹 내 프로세스 정지 및 재개
- net_cls: 네트워크 제어.
- blkio: 블록 디바이스 입출력량 제어[2]
도커 파일
- 도커에서 사용하는 도커파일(Dockerfil)은 서버 운영 기록을 코드화한 것이다. 도커 파일로 도커 이미지를 만들 수 있다. 도커 파일이 서버 운영 기록이라면, 도커 이미지는 운영 기록을 실행한 시점이라고 한다. 이미지와 컨테이너는 도커를 이해하는 데 있어 가장 중요한 개념이다. 이미지는 가상머신에서 사용하는 이미지와 비슷한 역할을 한다. 한 마디로 정의해보자면 이미지는 어떤 응용 프로그램을 실행하기 위한 환경이라고 할 수 있다. 그리고 이 환경은 파일들의 집합이다. 도커에서는 응용 프로그램을 실행하기 위한 파일들을 모아놓고, 다수의 프로그램과 함께 이미지로 만들 수 있다. 그리고 이 이미지를 기반으로 해당소스를 바로 배포할 수 있다. 또한 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않는다. 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있게 된다.예를 들어 사용자가 1년 전 서버에 서버 A를 구성했고, 오늘 서버 B를 구성한다면, 두 서버에 대해 이미지는 설치된 시점으로부터 1년의 차이가 발생하게 된다. 하지만 도커에서는 도커 파일로 이미지를 만들어 두면, 서버가 구성되는 시점으로부터 이미지를 만든 시점으로 고정된다. 이 이미지를 사용해 1년 전 A 서버에 컨테이너를 배포하고, 오늘 B 서버에 컨테이너를 배포한다고 해도, 두 컨테이너 모두 이미지가 설치된 시점은 같다.도커는 특히 분산 환경을 쉽게 구축할 수 있는 클라우드 서비스와 호환성이 좋다. 그래서 주요 클라우드 사업자들은 모두 컨테이너 실행 환경을 쉽게 관리할 수 있는 서비스를 제공한다.[5]도커 이미지는 해당 프로그램을 실행하는데 모든 정보를 담고있다. 예를들어 우분투 이미지는 우분투를 실행하기 위한 모든 파일을 가지고 있고 마이에스큐엘이미지는 debian을 기반으로 마이에스큐엘을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있다. 말그대로 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 확인 하지 않고 다른 파일을 설치할 필요가 없다. 만약 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다. 한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제가 없다. 도커 이미지는 도커 허브에 등록하거나 도커 리지스트리 저장소를 직접 만들어 관리할 수있다. 현재 공개된 도커 이미지는 50만개가 넘고 도커 허브의 이미지 다운로드 수는 수십억회에 이른다. [6]
- 가상머신과 차이점
- 도커는 가상머신에 비해 매우가볍고 빠르다. 그 이유는 리눅스의 커널을 이용하기때문이고 하나의 서버나 가상머신이 여러 컨테이너들을 동시에 조작할 수 있다. 대신에 도커는 파일의 상태를 정밀하게 알기는 어렵고 자유롭게 사용하기에는 제약이 많다. 하지만 실제 사용시사용해보면 도커의 장점이 훨씬 부각 된다. 그 이유는 가볍고 빠른것도 있지만 어느 환경이나 동일하게 작용하기 때문이다. 여기서 동일하게 동작한다는건 완전 밑단까지 같이 동작한다는 이야기가 아니라 사용하는 입장에서 동등하게 사용할 수 있다는 뜻이다. 옆의 그림에서도 나오듯이, 기존의 가상머신의 경우에는 호스트 운영체제위에 새로운 게스트 운영체제를 설치를 했다.그러다보니 운영체제 위에 운영체제가 있는 모양이고 이는 필연적으로 속도 저하로 이어진다. 하지만 도커는 운영체제 위에 운영체제를 설치하는게 아니라 현재 운영체제에 없는 것만 추가적으로 받아온다. 가령 현재 호스트 운영체제가 A인데 게스트 운영체제를 B로 사용한다고 가정한다.가상머신은 A위에 B를 설치하게된다. 근데 도커는 A에 없는 부분만, 즉 B와 A가 공유하는 부분은 뻬거 나머지만 재 설치한다. 이게 가능한 이유는 맥과 리눅스는 모두 유닉스와 같은 운영체제이기 때문이다. 그래서 윈도우에서 사용하는 도커는 리눅스 자체를 가상머신 마냥 올리기 때문에 성능이 좋지안다. 그렇다고 윈도우에서 의미가 없는건 아니고 윈도우에서도 리눅스와 똑같은 환경으로 사용할 수 있다는 장점이 있다.그래서 오히려 윈도우에서 코딩할 수록 도커를 사용하는것이 좋다. 하지만 도커를 사용한다는 의미는 단순히 테스팅을 한다는 의미가 아니다.오히려 테스팅을 할거면 가상머신이 훨씬 낫다.도커는 배포를 위해서 사용하는 것이므로 테스트를 하기에 적합하지는 않다.[7]
활용
도커의 운영체제는 다음을 포함한 다양한 인프라구조 도구들에 통합되어 어디서든지 사용할 수 있다. 오라클 컨테이너 클라우드, 아마존 웹 서비스, 구글 클라우드 플랫폼, 우분투, 센트OS, 맥, IBM 블루믹스, 페도라, 쿠버네티스, VMware vSphere
문제점
각주
- ↑ Daegwon Nacyot Kim, 〈[https://www.44bits.io/ko/post/easy-deploy-with-docker 도커(Docker) 입문편 컨테이너 기초부터 서버 배포까지]〉, 《44비츠》, 2020-03-22
- ↑ 2.0 2.1 에릭 한, 〈도커 Docker 기초 확실히 다지기〉, 《GitHub》, 2018-11-16
- ↑ pyrasis, 〈도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!〉, 《슬라이드쉐어》, 2015-02-14
- ↑ 김지성,〈(컨테이너 기술) IT에서 컨테이너란 어떤기술인가요? #클라우드 #맥도날드〉, 2020-07-14
- ↑ raccoony, 〈왜 굳이 도커(컨테이너)를 써야 하나요?눈송이 서버의 한계를 넘어 컨테이너를 사용해야 하는 이유〉, 《44비츠》, 2019-01-14
- ↑ subicura, 〈초보를 위한 도커 안내서 - 도커란 무엇인가?〉, 《서비큐라 블로그》, 2017-01-19
- ↑ 카망, 〈(Docker)Docker는 무엇인가? 도커의 기초와 이미지 설치하고 사용(1)〉, 《티스토리》, 2019-04-14
참고자료
- pyrasis, 〈도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!〉, 《슬라이드쉐어》, 2015-02-14
- subicura, 〈초보를 위한 도커 안내서 - 도커란 무엇인가?〉, 《서비큐라 블로그》, 2017-01-19
- 에릭 한, 〈도커 Docker 기초 확실히 다지기〉, 《GitHub》, 2018-11-16
- Daegwon Nacyot Kim, 〈도커(Docker) 입문편 컨테이너 기초부터 서버 배포까지〉, 《44비츠》, 2020-03-22
- raccoony, 〈왜 굳이 도커(컨테이너)를 써야 하나요?눈송이 서버의 한계를 넘어 컨테이너를 사용해야 하는 이유〉, 《44비츠》, 2019-01-14
- 카망, 〈(Docker)Docker는 무엇인가? 도커의 기초와 이미지 설치하고 사용(1)〉, 《티스토리》, 2019-04-14</ref>
- 김지성 〈(컨테이너 기술) IT에서 컨테이너란 어떤기술인가요? #클라우드 #맥도날드〉, 《네이버 블로그》, 2020-07-14
같이 보기