1. 도커(Docker)?
- 리눅스 컨테이너를 기반으로 하여 특정한 서비스를 패키징하고 배포하는데 유용한 오픈소스 프로그램이다. Docker를 사용하면 인프라에서 애플리케이션을 분리하여 컨테이너로 추상화시켜 소프트웨어를 빠르게 제공 할 수 있다.
도커 아키텍쳐
+) Architecture(아키텍처) : 컴퓨터 시스템의 하드웨어 구조.
이미지 출처
Docker는 클라이언트-서버 구조를 가짐. Docker클라이언트는 Docker컨테이너를 빌드, 실행, 배포에 대한 무거운 작업을 수행하는 Docker데몬과 통신한다. Docker 클라이언트와 데몬은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있다. Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다.
도커 데몬 (Docker daemon)
- Docker 데몬(dockerd)은 API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다.
+) API : API는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체
도커 클라이언트 (Docker client)
- Docker 클라이언트는 많은 Docker 사용자가 Docker와 상호작용 하는 기본방법. 기본적인 도커명령어를 통해서 Docker 데몬과 통신.
도커 레지스트리 (Docker registries)
- Docker registries는 Docker 이미지를 저장합니다. Docker Hub는 누구나 사용할 수 있는 공용 레지스트리가 있고, private한 레지스트리가 있다. Docker는 기본적으로 Docker Hub(공용 레지스트리)에서 이미지를 찾습니다.
도커 이미지 (Docker Image)
- 도커에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image라한다. (= 특정 프로세스를 실행하기 위한(= 컨테이너 생성에 필요한) 모든 파일과 설정값 지님) 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요가 없는 상태의 파일.
- 도커 이미지의 용량은 보통 수백MB ~ 수GB가 넘는다. 그러나 가상머신의 이미지에 비하면 굉장이 적은 용량.
- 이미지는 상태 값을 가지지 않고 변하지 않는다. (Immutable) -> 라이브러리 버전이 의도치 않게 바뀜에 따른 의존성 문제 발생 X
- 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다.
- 도커 이미지들은 github와 유사한 서비스인 DockerHub를 통해 버전 관리 및 배포(push&pull)가 가능하다.
- 다양한 API가 제공되어 원하는 만큼 자동화가 가능
- 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어진다.
도커 레이어 (Docker Layer)
- 레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받는 방법이 아닌 해당 파일을 추가하기 위한 개념. 이미지는 여러 개의 읽기 전용(Read Only) layer로 구성되고, 파일이 추가 되면 새로운 layer가 생성. 그리고 도커는 여러 개의 layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해준다.
그래서, 이미지와 레이어는 같은 의미로도 사용. 추가로 DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능.
도커 컨테이너 (Docker Container)
- 이미지를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화 하여 격리된 공간에서 프로세스를 동작 시키는 기술.
- 컨테이너는 이미지 레이어에 읽기/쓰기 레이어를 추가하는 것으로 생성/실행된다. 따라서 여러개의 컨테이너를 생성해도 최소한의 용량만 사용, 바뀐 부분을 읽기/쓰기 레이어에 적음.
- 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라진다는 것. ex) DB라면 그 동안 쌓였던 데이터가 모두 사라진다는 뜻.
- 한 서버는 여러 개의 컨테이너를 가져도 상관 없고, 컨테이너는 독립적으로 실행된다.
도커 컨테이너에 데이터 저장 (볼륨/바인드 마운트)
- 도커 컨테이너에 쓰여진 데이터는 기본적으로 컨테이너가 삭제될 때 함께 사라짐.
- 도커에서 돌아가는 많은 애플리케이션이 컨테이너의 생명 주기와 관계없이 데이터를 영속적으로 저장해야할 뿐만 아니라 많은 경우 여러 개의 도커 컨테이너가 하나의 저장 공간을 공유해서 데이터를 읽거나 써야한다.
- 도커 컨테이너의 생명 주기와 관계없이 데이터를 영속적으로 저장할 수 있도록 돕는 옵션
+) 마운트(연결)
1. Docker Volume
- 따로 도커 볼륨을 만들어 줘야한다.
- 컨테이너를 만들 때 디폴트 볼륨도 만들어 진다.
docker run -d -v server_mongo_volume:/data/db <이미지이름>
2. Bind Mount
- 볼륨에 비해 기능이 제한되어있다.
- 호스트 시스템의 파일 또는 디렉토리가 컨테이너에 마운트 된다. 파일 또는 디렉토리가 호스트 시스템의 전체 또는 상대 경로로 참조된다.
docker run -d -v $pwd:/data/db <이미지이름>
# 또는
docker run -d -v ./mongodb:/data/db <이미지이름>
볼륨이 바인드 마운트보다 좋은 장점
- 백업하거나 이동시키기 쉽다.
- docker CLI 명령어로 볼륨을 관리할 수 있다.
- 리눅스, 윈도우 컨테이너에서 모두 동작한다.
- 컨테이너간에 볼륨을 안전하게 공유할 수 있다.
- 볼륨드라이버를 사용하면 볼륨의 내용을 암호화하거나 다른 기능을 추가 할 수 있다.
- 새로운 볼륨은 컨테이너로 내용을 미리 채울 수 있다.
Dockerfile
- Docker는 Dockerfile을 읽어서 이미지를 자동으로 빌드 할 수 있습니다.
Dockerfile은 사용자가 이미지를 생성하기 위해 명령 줄에서 호출할 수 있는 모든 명령이 포함된 텍스트 문서입니다.
이미지 출처
정의
-
컨테이너는 소프트웨어 서비스를 실행하는 데 필요한 특정 버전의 프로그래밍 언어 런타임 및 라이브러리와 같은 종속 항목과 애플리케이션 코드를 함께 포함하는 경량 패키지입니다.
-
컨테이너는 어떤 환경이나 실행하기 위해 필요한 모든 요소를 포함하는 소프트웨어 패키지.
-
운영체제를 가상화하며 프라이빗 데이터 센터에서 퍼블릭 클라우드 또는 개발자의 개인 노트북에 이르기까지 어디서나 실행.
소프트웨어는 OS와 라이브러리에 의존성을 가진다. 성격이 다른(OS,라이브러리 버전이 다른) 소프트웨어를 한번에 실행할 때 어려움을 가질 수 있고 관련된 구성을 관리하기가 어렵다.
컨테이너는 개별 소프트웨어의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술.
컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화할 수 있는 논리 패키징 메커니즘을 제공한다.
- 컨테이너는 독립된 실행 환경을 제공하지 않는다. 즉, OS끼리 자원을 공유하게 된다. 덕분에 가상 머신보다 속도도 빠르고 가볍다.
=> 확장성이 좋고 빠르다.
컨테이너의 장점
- 애플리케이션 레벨 고립
- VM보다 빠른 셋업
- VM보다 메모리 덜 소모
- 마이그레이션, 백업, 전송이 쉬움. VM과 비교해 크기가 작기 때문이다.
- 하드웨어와의 빠른 커뮤니케이션은 따라, 성능에 효과적일 수 있다.
- 애플리케이션 배치와 유지보수를 향상시킨다.
- 애플리케이션 전달 시간 감소
3. 가상머신(Virtual Machine, VM)
컴퓨팅 환경을 소프트웨어로 구현한 것, 즉 컴퓨터 시스템을 에뮬레이션(가상현실화)하는 소프트웨어. 가상머신 상에서 운영 체제나 응용프로그램을 설치 실행할 수 있다.
가상 머신은 실제 컴퓨터와 어느 정도의 통신과 사용을 기반으로 두 가지로 나뉜다.
- 시스템 가상 머신 : 완전한 시스템 플랫폼을 제공 (= 완전한 운영 체제(OS)의 실행을 지원.)
- 프로세스 가상 머신 : 하나의 단일 프로그램을 실행하기 위해 만들어짐. (= 단일 프로세스 지원)
중요한 특징, 돌아가는 소프트웨어가 가상 머신이 제공하는 환경과 자원에 제한을 받으며 가상 세계를 벗어날 수 없다.
- 기본적으로 하이퍼 바이저(Hypervisor)가 여러개의 VM을 띄운다.(= 컴퓨터가 가지고 잇는 인프라 리소스들에 대해 VM별로 배분하는 역할을 한다.) 각 VM마다 독립적인 실행 환경을 제공한다. 즉, VM1과 VM2가 같은 OS를 사용하더라도 자원을 공유하지 않는다. (각 VM마다 필요한 메모리 공간이 필요하게 되며 VM이 증가할 수록 공간은 더더욱 많이 필요하게 된다.)
=> 확장성이 떨어진다. 메모리나 자원에 관해 유동적으로 관리 X 처음부터 정해놓고 실행, 비효율적
출처