-
도커 이미지란 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태
특정 프로세스를 실행하기 위한 (즉, 컨테이너 생성(실행)에 필요한) 모든 파일고 설정값 (환경)을 지닌 것으로, 더이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요 없는 상태의 파일을 의미
예를 들어, 우분투 이미지는 우분투를 실행하기 위한 모든 파일을 갖고 있는 것, 오라클 이미지는 오라클 실행하는데 필요한 파일과 실행 명령어, port 정보등 모-두 가지고 있는 것
-
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다(Immutable).
-
즉 컨테이너를 생성하기 위해 필요한 설계도 개념입니다.
-
컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 보통 용량이 수백메가MB에 이릅니다. 처음 이미지를 다운받을 땐 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백메가를 다시 다운받는다면 매우 비효율적일 수 밖에 없습니다.
도커는 이런 문제를 해결하기 위해 레이어layer라는 개념을 사용하고 유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해줍니다. 이미지는 여러개의 읽기 전용 read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성됩니다. ubuntu 이미지가 A
+ B
+ C
의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A
+ B
+ C
+ nginx
가 됩니다. webapp 이미지를 nginx 이미지 기반으로 만들었다면 예상대로 A
+ B
+ C
+ nginx
+ source
레이어로 구성됩니다. webapp 소스를 수정하면 A
, B
, C
, nginx
레이어를 제외한 새로운 source(v2)
레이어만 다운받으면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있습니다.
실제로는 아래에 보이는 것처럼 16진수 ID값으로 구분되어지며, 각각의 이미지는 서로에게 독립적으로 존재합니다. 예를들어 8896kbi6sa8a 이미지는 Ubuntu14.05 이미지이며, 그아래 adasd372e3gs 이미지는 Ubuntu14.05 이미지를 가지고 컨테이너를 생성한 뒤, 그곳에 mysql같은 응용프로그램을 추가로 설치한 후에 그것을 다시 도커 이미지로 생성한 것입니다.
즉 Ubuntu + 응용프로그램들이 들어있는 컨테이너를 생성할 수 있는 이미지인 것입니다. 그러나 adasd372e3gs 이미가 통째로 모든것을 가지고 있는것이 아니고 추가로 바뀐 부분(응용프로그램)만을 포함하고 나머지는 부모 이미지를 참조하는 방식으로 동작됩니다. 즉 Ubuntu + mysql 이미지는 56asd755w1za, l0d9x8fll5cx, 8896kbi6sa8a 이미지까지 참조하여 함께 동작합니다.
컨테이너를 생성할 때도 레이어 방식을 사용하는데 기존의 이미지 레이어 위에 읽기/쓰기 read-write 레이어를 추가합니다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러개의 컨테이너를 생성해도 최소한의 용량만 사용합니다.
- 도커는 가상머신과 다르게 이미지를 관리할 수 있는 기능들을 제공합니다.
- 도커에서는 이미지를 Docker Hub(https://hub.docker.com/)라는 중앙 저장소에서 관리하며, 이미지 버전 관리 기능까지 제공합니다.
- Git과 마찬가지로 이미지를 Push(업로드), Pull(다운로드) 할 수 있으며, 다양한 어플리케이션을 이미지로 제공합니다.
- 위에서 얘기했든 이미지들은 서로 필요한 부모 이미지를 참조하며, 이미지를 원격 저장소에 올리거나 내려받을 때 의존하는 부모 이미지가 존재한다면 이또한 함께 올리거나 내려받 습니다.
- 또한 하나의 이미지만 있으면 서버가 몇대가 되든 여러개의 컨테이너 생성이 가능합니다.
컨테이너(Container)는 개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말합니다
가상 환경에 익숙하다면 컨테이너를 가상 머신(Virtual Machine)에 비교하여 생각하면 이해하기 쉽습니다.
단, 가상 머신은 하드웨어 스택을 가상화하지만 컨테이너는 이와 달리 운영체제 수준에서 가상화를 실시하여 다수의 컨테이너를 OS 커널에서 직접 구동합니다. 컨테이너는 훨씬 가볍고 운영체제 커널을 공유하며, 시작이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 훨씬 적게 차지합니다.