위와 같은 구조에서 프로그램이나 데이터는 컨테이너 안에 있으며, 도커 엔진 동작 후 그 위에 컨테이너가 동작합니다.
도커 엔진 아래에도 리눅스 운영체제가 있고 container 내부에 리눅스 운영체제와 비슷한 것이 존재합니다.
본래의 운영체제는 커널과 그 외의 주변으로 구성됩니다. 주변 부분이 프로그램의 내용을 커널에 전달 -> 커널이 하드웨어를 조작하게 됩니다.
하지만 도커 환경에서는 컨테이너가 완전히 분리되어 있어 커널 주변으로 부터 명령을 전달받을 수 없습니다. 그렇기 때문에 컨테이너 내부에는 리눅스 운영체제의 주변 부분과 같은 것이 들어 있어 명령을 전달받고 커널에 전달하는 구조로 되어있습니다.
이미지 자체로는 쓸모가 없지만 컨테이너를 생성할 때 사용합니다. 1개의 이미지로 동일한 컨테이너를 여러 개 만들 수 있습니다. 예를 들면) 이미지는 설계도 역할과 비슷하며, 컨테이너를 설계도를 기반으로 만든 건축물과 동일합니다.
그렇다면 이미지는 어떻게 만들까요? 컨테이너도 이미지를 생성할 수 있습니다. 마치 이미 제작된 건축물의 변형시키고 설계도를 만드는 것과 비슷한 개념입니다.
이러한 특성을 이용하여 도커 엔진만 설치되어 있으면 환경에 구애받지 않고 컨테이너를 이동시킬 수 있습니다. 정확하게 이동하는 것은 아니지만 이미지를 통해 컨테이너가 이동한 것과 동일한 효과를 얻을 수 있습니다.
이미지의 경우 도커 허브(https://hub.docker.com/)에서 구할 수 있으며 공식적으로 운영됩니다. 원하는 컨테이너의 이미지를 내려받을 수 있으며 누구든지 이미지를 등록하고 공개할 수 있습니다.
도커 환경에서 컨테이너는 중요한 역할을 하지만 일회용품에 가깝습니다. 컨테이너는 쉽게 만들수 있는 만큼 버리는 것도 쉽습니다. 새로운 버전이 나오면 재사용하지 않고 새로운 컨테이너로 갈아타는 것입니다.
컨테이너의 장점은 여러 개를 동시에 사용할 수 있는 것입니다. 하지만 여러 컨테이너를 관리하다보면 유지보수 항목이 늘어나며 장점이 반감됩니다. 이러한 이유로 새로운 컨테이너를 만들어 갈아타는 방식을 사용합니다.
생성 -> 실행 -> 종료 -> 폐기 -> 생성...
컨테이너를 폐기하면 데이터가 사라지는데 일회용품 처럼 사용하는게 맞을까?라는 생각이 들었습니다.
도커는 물리적 서버(호스트)의 디스크를 마운트(HDD, SSD 저장방식)를 이용하여 데이터를 저장합니다. 즉, 컨테이너를 폐기해도 컨테이너 외부에 안전하게 저장됩니다. 도커 엔진에 이상이 생겨도 데이터는 보존됩니다. 외부에 저장된 데이터는 다른 컨테이너와 데이터 공유하기 용이한 것도 큰 이점입니다.