도커(Docker)
는 Immutable Infrastructure Paradigm
이라는 개념을 기반으로 하기 때문에, 서비스 환경(서비스 인프라)부분을 이미지화(실행파일화)하여 배포한 뒤 가급적 변경하지 않고 사용합니다.
도커에서 서비스 운영에 필요한
서버 프로그램
,소스코드 및 라이브러리
,컴파일된 실행 파일
을 묶는 형태를Docker Image
라한다. 다시 말해, 특정 프로세스를 실행하기 위한(즉, 컨테이너 생성(실행)에 필요한) 모든 파일과 설정값(환경)을 지닌 것으로,더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일
을 의미한다. 예를 들어 Ubuntu이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle 이미지는 Oracle을 실행하는데 필요한 파일과 실행명령어, port 정보 등을 모두 가지고 있다.
1) 따라서 도커 이미지의 용량은 보통 수백MB ~ 수GB가 넘는다. 하지만 가상머신의 이미지에 비하면 굉장히 적은 용량이다.
2) 이미지는 상태 값을 가지지 않고 변하지 않는다. (Immutable)
3) 하나의 이미지는 여러 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아 있음.
4) 도커 이미지들은 github과 유사한 서비스인 DockerHub를 통해 버전 관리 및 배포(push&pull)가 가능하다.
5) 다양한 API가 제공되어 원하는 만큼 자동화가 가능하다.
6) 도커는 Dockerfile이라는 파일로 이미지를 만든다. Dockerfile에는 소스와 함께 의존성 패키지 등 사용했던 설정 파일을 버전 관리하기 쉽도록 명시되어진다.
레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받는 방법이 아닌 해당 파일을 추가하기 위한 개념이다. 이미지는 여러 개의 읽기 전용(read only) layer로 구성되고, 파일이 추가되면 새로운 Layer가 생성됨. 그리고 도커는 여러 개의 Layer를 묶어서 하나의 파일시스템으로 사용할 수 있게 해준다. 그래서 이미지와 레이어는 같은 의미로도 사용된다. 추가적으로 DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능하다.
이미지(Image)를 실행한 상태로, 응용프로그램의 종속성과 함께 응용프로그램 자체를
패키징
or캡슐화
하여 격리된 공간에서프로세스를 동작
시키는 기술이다.
1) 컨테이너는 이미지 Layer에 읽기/쓰기(read-write) Layer를 추가하는 것으로 생성/실행된다. 따라서 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용되며, 바뀐 부분을 읽기/쓰기 Layer에 적는다.
2) 컨테이너는 종료되었다고 해도 메모리에서 삭제되지않고 남아있다. 삭제하려면 명시적으로 삭제해야 함. 즉 종료가 되어도 컨테이너 & 읽기/쓰기 Layer 또한 그대로 존재하기 때문에 다시 시작할 수 있다.
3) 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라진다는 것. 예) DB라면 그동안 쌓였던 데이터가 모두 사라진다는 뜻과 동일.
4) 한 서버는 여러 개의 컨테이너를 가져도 당연히 상관없으며, 컨테이너는 각각 독립적으로 실행된다.
5) 컨테이너는 커널 공간과 호스트OS 자원(시스템 콜)을 공유한다.