도커 (소프트웨어)
도커(Docker)란 리눅스 운영체제에서 소프트웨어 컨테이너 기술을 기반으로 한 가상화 플랫폼 서비스이다.
개요
도커는 2013년에 등장한 오픈소스 컨테이너 기반 가상화 도구이다. 도커는 항만(부두)노동자라는 의미를 가지고 있다. 프로그래밍 컨퍼런스 파이콘 US 2013 에서 솔로몬 하이크(Solomon Hykes)가 리눅스의 컨테이너 기술을 사용한 도커를 처음 발표했다. 현재 도커는 고(GO) 언어로 개발되고 있으며, 2014년에 1.0 버전을 발표한 이후, 2020년 현재 최신 버전은 19.03.8 이다. 도커는 리눅스 상에서 컨테이너 방식으로 프로세스를 격리해서 실행하고 관리할 수 있도록 도와주며, 계층화된 파일 시스템에 기반해 효율적으로 이미지 프로세스 실행 환경을 구축할 수 있도록 해준다. 도커를 사용하면 이미지를 기반으로 컨테이너를 실행할 수 있으며, 다시 특정 컨테이너의 상태를 변경해 이미지로 만들수 있다. 이렇게 만들어진 이미지는 파일로 보관하거나 원격 저장소를 사용해 쉽게 공유할 수 있으며, 도커만 설치되어 있다면 필요할 때 언제 어디서나 컨테이너로 실행하는 것이 가능하다.[1] 도커는 복잡한 리눅스 응용 프로그램들을 하나의 컨테이너로 묶어서 실행할 수 있다. 그 이유는 개발 테스트 및 서비스 환경을 하나로 통일하여 효율적으로 관리할 수 있기 때문이다. 이로 인해 많은 사람들에게 주목을 받기 시작했다. 파일을 이미지파일로 변환하여 공유하고 리눅스 커널에서 제공하는 컨테이너 기술을 활용하여 전세계 사람들과 공유도 가능하다. Github와 비슷한 방식의 도커허브(Hub)를 제공한다.
기능
도커의 기능 도커는 컨테이너의 리소스, 파일 시스템, 네트워크를 기존 시스템과 격리시키고 도커 이미지를 관리하고 공유하는 기능을 제공합니다. 도커의 대표적인 기능 세 가지(Build, Ship, Run)를 살펴보겠습니다.
Build - 이미지 만들기 도커는 애플리케이션과 실행에 필요한 라이브러리, 미들웨어, OS, 네트워크 설정 등 필요한 모든 파일을 모아서 도커 이미지로 만듭니다. 도커 이미지는 명령어를 이용해 수동으로 만들 수도 있지만 자동으로 빌드와 배포를 하는 CI/CD 환경에서는 도커 설정 파일(Dockerfile)을 이용해 자동으로 만들 수도 있습니다.
보통 이미지에는 하나의 애플리케이션만 넣고 여러 컨테이너를 조합해서 서비스를 구축하는 방법을 사용합니다. 또한 이미지를 여러 개 같이 사용할 수 있습니다. 예를 들면 CentOS 리눅스 이미지와 Nginx 웹 서버 이미지를 겹쳐서 새로운 이미지를 만들 수 있습니다.
Ship - 이미지 공유 도커 이미지를 업로드해서 공유하는 저장소를 도커 레지스트리(Docker Registry)라고 합니다. 대표적으로는 도커의 공식 레지스트리인 Docker Hub 가 있습니다. 도커 허브에서는 업체에서 제공하는 공식 이미지를 받을 수 있습니다.[2] Ubuntu 나 CentOS 같은 OS 이미지, MySQL, Redis, MongoDB, Nginx 와 같은 미들웨어, OpenJDK, Golang, NodeJS 와 같은 플랫폼 이미지도 제공합니다. 이런 베이스 이미지를 활용하면 환경을 빠르고 안전하게, 그리고 자동으로 구축할 수 있습니다. 내가 만든 애플리케이션 또한 이미지로 만들어서 업로드하고 공유할 수 있습니다. Github 와 같은 형상관리툴과 연동해서 Dockerfile 을 관리하고 도커 이미지를 자동으로 빌드해서 도커 허브로 배포도 가능합니다. 퍼블릭 클라우드에서는 비공개 레지스트리와 CI/CD 를 쉽게 구성할 수 있는 아키텍처를 제공합니다. Amazon Elastic Container Registry 나 Google Cloude Platform 의 Container Registry 가 있습니다. 사실 이런 도커 이미지는 보안에 취약합니다. 해당 시스템에 보안 취약점이나 악성 코드가 심어져 있다면 어떨까요? GCP 컨테이너 레지스트리는 보안을 강화하기 위해 컨테이너 이미지가 등록되면 취약점을 스캔하고 정책에 위배되는 이미지는 배포를 막고 잠금 처리하고 있습니다.
Run - 컨테이너 동작
도커는 도커 이미지를 가지고 컨테이너를 생성해서 동작시킵니다. 하나의 이미지를 가지고 여러 개의 컨테이너를 만들어낼 수도 있습니다. 도커는 컨테이너를 생성하고 관리하기 위한 여러 명령을 제공합니다.
실제 업무에서는 보통 한 대의 호스트에 모든 컨테이너를 동작시키는 것이 아니라 여러 호스트로 된 분산 환경인 경우가 많습니다. 이런 분산 환경에서 여러 노드의 컨테이너를 관리하기 위해 쿠버네티스(Kubernetes, k8s)와 같은 컨테이너 오케스트레이션 툴(Container Orchestration Tool)을 주로 사용합니다. 오케스트레이션이란 컨테이너 배포, 장애 복구, 로드 밸런싱 등 여러 기능을 자동으로 처리해주는 것을 말합니다. https://futurecreator.github.io/2018/11/16/docker-container-basics/
- 리눅스 컨테이너(Containeer)
- 도커는 리눅스의 컨테이너 방식을 사용하여 프로그램이 작동한다. 컨테이너 방식은 가상머신의 발달도 등장하게 되었다. 컴퓨터 첫 등장 이후 컴퓨터 성능이 급격히 발전하면서 일반 PC에서도 흔히 사용하게 되었다. 이러한 기술의 발달로 서버의 성능이 향상하게 되었다. 하지만 그만큼 서버에 남아있는 공간도 많고 서버가 일을 하지않으니 문제가 되고 IT 기술이 보편화 되면서 서버도 많아졌다. 그렇기 때문에 컴퓨터에 컴퓨터를 만들어 작동하기 위한 가상머신이 나오게 되었고 서버 자체를 가상머신을 통해서 작동하는 기술이 발달했다. 이는 서버의 빈공간을 가상머신으로 이용하여 서버의 효율을 극대화 시킬 수 있다. 가상머신에 각종 서버 프로그램, 데이터베이스를 설치하여 소프트웨어 응용 프로그램이나 웹사이트를 실행하고, 미리 구축한 가상머신 이미지를 여러 서버에 복사하여 실행하면 이미지 하나로 서버를 계속 만들수
미리 구축한 이미지를 다수의 서버에 복사하여 실행하면 이미지 하나로 서버를 계속 만들어낼 수 있다. 하지만 가상머신은 이미지 안에 OS가 포함되기 때문에 이미지 용량이 커지게 되어 문제가 발생한다. 컴퓨터자체를 전부 사용하다보니 각종 성능에 손실이 발생하게 되었다. 호스트와 커널을 공유하는 반가상화 기술이 등장 했지만 배포하고 관리하는데 기능이 부족했다. 이를 개선하기 위해 리눅스 컨테이너가 나오게 되었다.[2] 컨테이너 박스는 흔히 선박을 통하여 물건을 수출할때 많이 사용한다. 도커의 로고를 보면 알 수있듯이, 컨테이너는 이동하는 물건을 하나의 공간에 담고 목적지까지 안전하게 보낼수 있다. 컨테이너 없이 물건을 하나하나 쌓아서 보관한다면 없어질 경우도 생기고 물건이 충격을 받는다면 부러지거나 변형이 생길수도있다. 이와같이 리눅스에서도 파일 전송 및 변경시 파일안에 있는 데이터가 아무런 보호없이 간다면 충분히 변조 및 데이터패킷이 변형 될 수있다. 그렇기에 가상의 컨테이너 만들어 사용하면 보관하기에도 편하고 같은 목적지를 가는물건일 경우 더욱 안전하게 갈수 있다. 다운받은 프로그램이 같다 해도 서로다른 환경의 응용체제에서 사용하면 조금은 다르게 작동된다. 이는 서버마다 운영기롣이 다르기 때문인데 어디에서도 프로그램을 실행하더라도 100프로 실행할 수있는 기법이 필요하다. 이를위해 복잡한 IT 환경을 통합하여 포장하는 기술이 컨테이너 기술이다. 언제 어디서든 프로그램을 실행핳때 본래의 의도와 맞게 변형이나 문제없이 프로그램이 실행된다.[3] 리눅스 컨테이너에서는 대표적인 2가지 명령어 네임스페이스(NameSpace)와 cgroups(씨그룹스)가 있다.컨테이너는 가상의 독립된 환경을 만들기 위해 리눅스 커널의 네임스페이스 기능을 사용한다. 쉽게 얘기하면 리눅스 객체에 이름표를 붙여 같은 이름표가 붙여진 것들만 묶어 관리한다. 이를 다른말로 격리(isolated)시킨다 라는 의미를 가지는데 이는 다른 네임스페이스에서는 접근이 불가능하다는 걸 의미한다.
- PID: 각 프로세스에 할당된 고유한 ID 인 PID 를 기준으로 다른 프로세스를 격리한다. 네임스페이스가 다르면 접근할 수없다.
- network: 네트워크 자원(IP 주소, 포트 번호, 라우팅 테이블 등)을 네임스페이스 마다 독립적으로 가져간다.
- UID:사용자(User ID)와 그룹(Group ID)를 네임스페이스 별로 구분한다. 따라서 컨테이너에서는 루트 권한을 가지고 있더라도 호스트의 관리 권한을 가질 수 없도록 격리가 가능하다.
- 마운트: 리눅스에서 파일을 인식하기 위해 마운트가 필요하다. 파일 시스템 등 마운트된 파일을 네임스페이스별로 격리한다.
- UTS: 호스트명이나 도메인명을 네임스페이스별로 독자적으로 설정이 가능하다.
- IPC: 프로세스 간 통신에 필요한공유 메모리, 세마포어(Semaphore), 메시지 큐(Message Queue) 등을 독자적으로 사용한다.
리눅스에서 프로그램은 프로세스로 실행되고, 프로세스는 하나 이상의 쓰레드로(Tread) 이루어져 있다. cgroups(Control Groups) 는 프로세스와 쓰레드를 그룹화해서 관리하는 기술이다. 호스트 OS의 자원을 그룹별로 할당하거나 제한을 둘 수 있습니다. 즉 컨테이너에서 사용하는 리소스를 제한함으로써 하나의 컨테이너가 자원을 모두 사용해 다른 컨테이너가 영향을 받지 않게된다. 또한 그룹에 계층 구조를 적용할 수 있어 체계적진 자원관리가 가능하다.
- cpu: CPU 사용량 제한.
- cpuacct: CPU 사용량 통계 정보 제공
- cpuset: CPU 나 메모리 배치 제어
- memory: 메모리나 스왑(Swap) 사용량 제한
- devices: 디바이스에 대한 접근 제어
- freezer: 그룹 내 프로세스 정지 및 재개
- net_cls: 네트워크 제어.
- blkio: 블록 디바이스 입출력량 제어[4]
도커 파일(이미지 파일)
도커 파일 도커에서 사용하는 도커파일(Dockerfil)은 서버 운영 기록을 코드화한 것이다. 도커 파일로 도커 이미지를 만들 수 있다. 도커 파일이 서버 운영 기록이라면, 도커 이미지는 운영 기록을 실행한 시점이라고 한다. 이미지와 컨테이너는 도커를 이해하는 데 있어 가장 중요한 개념이다.이미지는 가상머신에서 사용하는 이미지와 비슷한 역할을 합니다. 한 마디로 정의해보자면 이미지는 어떤 애플리케이션을 실행하기 위한 환경이라고 할 수 있습니다. 그리고 이 환경은 파일들의 집합입니다. 도커에서는 애플리케이션을 실행하기 위한 파일들을 모아놓고, 애플리케이션과 함께 이미지로 만들 수 있습니다. 그리고 이 이미지를 기반으로 애플리케이션을 바로 배포할 수 있습니다.
또한 이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
ubuntu이미지는 ubuntu를 실행하기 위한 모든 파일을 가지고 있고 MySQL이미지는 debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등을 가지고 있습니다. 좀 더 복잡한 예로 Gitlab 이미지는 centos를 기반으로 ruby, go, database, redis, gitlab source, nginx등을 가지고 있습니다.
말그대로 이미지는 컨테이너를 실행하기 위한 모오오오오든 정보를 가지고 있기 때문에 더 이상 의존성 파일을 컴파일하고 이것저것 설치할 필요가 없습니다. 이제 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 됩니다. 한 서버에 여러개의 컨테이너를 실행할 수 있고, 수십, 수백, 수천대의 서버도 문제없습니다.도커 이미지는 Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리할 수 있습니다. 현재 공개된 도커 이미지는 50만개가 넘고 Docker hub의 이미지 다운로드 수는 80억회에 이릅니다. 누구나 쉽게 이미지를 만들고 배포할 수 있습니다.https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html
예를 들어 사용자가 1년 전 서버에 서버 A를 구성했고, 오늘 서버 B를 구성한다면, 두 서버에 대해 이미지는 설치된 시점으로부터 1년의 차이가 발생하게 된다. 하지만 도커에서는 도커 파일로 이미지를 만들어 두면, 서버가 구성되는 시점으로부터 이미지를 만든 시점으로 고정된다. 이 이미지를 사용해 1년 전 A 서버에 컨테이너를 배포하고, 오늘 B 서버에 컨테이너를 배포한다고 해도, 두 컨테이너 모두 이미지가 설치된 시점은 같다.
도커는 특히 분산 환경을 쉽게 구축할 수 있는 클라우드 서비스와 호환성이 좋다. 그래서 주요 클라우드 사업자들은 모두 컨테이너 실행 환경을 쉽게 관리할 수 있는 서비스를 제공한다.[5]
가상머신과의 차이점
가상머신(VM)과 차이
docker는 가볍다. 그리고 빠르다.
즉 docker는 vm에 비해서 가볍고 빠르다는 장점이 있다.
대신에 docker는 상태를 정밀하게 알기는 어렵고 자유롭게 사용하기에는 제약이 많다.
그러나 막상 사용해보면 docker의 장점이 훨씬 부각 된다.
그 이유는 가볍고 빠른것도 있지만 "어느 환경이나 동일하게 작용하기 때문이다"
여기서 동일하게 동작한다는건 완전 밑단까지 같이 동작한다는 이야기가 아니라
사용하는 입장에서 동등하게 사용할 수 있다는 이야기 이다.
도대체 어떻게 이런게 가능하냐면 위의 그림을 보면 알 수 있다. 기존의 vm의 경우에는 Host OS(우리가 사용하는 OS)위에 새로운 Guest OS를 설치를 했다. 그러다보니 OS위에 OS가 있는 모양새이고 이는 필연적으로 속도 저하로 이어진다. 하지만 도커는 OS위에 OS를 설치하는게 아니라 현재 OS에 없는 것만 추가적으로 받아온다. 가령 현재 Host OS가 Redhat인데 Guest OS를 Ubuntu를 사용한다고 가정하자. vm은 redhat위에 ubuntu를 설치하게된다. 근데 도커는 redhat에 없는 부분만, 즉 ubuntu와 redhat이 공유하는 부분은 냅두고 나머지만 재 설치한다. 이게 가능한 이유는 맥과 리눅스는 모두 unix likes운영체제이기 때문이다. 그래서 윈도우에서 사용하는 docker는 리눅스 자체를 vm마냥 올리기 때문에 성능이 안좋다.
그렇다고 윈도우에서 의미가 없는건 아니고 윈도우에서도 리눅스와 똑같은 환경으로 사용할 수 있다는 장점이 있다. 그래서 오히려 윈도우에서 코딩할 수록 docker를 사용하는것이 좋다고 생각한다. 하지만 docker를 사용한다는 의미는 단순히 테스팅을 한다는게 아니다. 오히려 테스팅을 할거면 vm이 훨씬 낫다. 도커는 배포를 위해서 사용하는 것이므로 테스트를 하기에 적합하지는 않다고 생각한다. https://kamang-it.tistory.com/entry/DockerDocker%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80-%EB%8F%84%EC%BB%A4%EC%9D%98-%EA%B8%B0%EC%B4%88%EC%99%80-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%84%A4%EC%B9%98%ED%95%98%EA%B3%A0-%EC%82%AC%EC%9A%A91
사용처
문제점
각주
- ↑ Daegwon Nacyot Kim, 〈[https://www.44bits.io/ko/post/easy-deploy-with-docker 도커(Docker) 입문편 컨테이너 기초부터 서버 배포까지]〉, 《44비츠》, 2020-03-22
- ↑ pyrasis, 〈도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!〉, 《슬라이드쉐어》, 2015-02-14
- ↑ 김지성,〈(컨테이너 기술) IT에서 컨테이너란 어떤기술인가요? #클라우드 #맥도날드〉, 2020-07-14
- ↑ 에릭 한, 〈도커 Docker 기초 확실히 다지기〉, 《GitHub》, 2018-11-16
- ↑ raccoony, 〈왜 굳이 도커(컨테이너)를 써야 하나요?눈송이 서버의 한계를 넘어 컨테이너를 사용해야 하는 이유〉, 《44비츠》, 2019-01-14
참고자료
- Daegwon Nacyot Kim 〈도커(Docker) 입문편 컨테이너 기초부터 서버 배포까지〉, 《44비츠》, 2020-03-22
- pyrasis, 〈도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!〉, 《슬라이드쉐어》, 2015-02-14
- 김지성 〈(컨테이너 기술) IT에서 컨테이너란 어떤기술인가요? #클라우드 #맥도날드〉, 2020-07-14
- 에릭 한〈도커 Docker 기초 확실히 다지기〉, 《GitHub》, 2018-11-16