
단일 컴퓨팅 시스템이서 설치된 리눅스 운영체제 상에서, 다른 영역과 완전히 분리된 별도의 리눅스 시스템을 운영할 수 있는 리눅스 커널 기술이다.
Linux 컨테이너는 운영체제 수준에서 영역과 자원 할당 (CPU, 메모리, 네트워크)등을 분리하여, 프로세스를 격리된 환경에서 실행할 수 있게 해주는 기술이다.
도커는 리눅스 커널에 LXC 기술을 사용하여 리눅스 컨테이너를 만들고 리눅스 컨테이너 상에 별도로 구성된 파일 시스템에 시스템 설정 및 응용 프로그램을 실행할 수 있도록 하는 기술을 정의한 것이다.
Docker를 사용하면 컨테이너를 매우 가벼운 모듈식 가상 머신처럼 다룰 수 있다. 또한 컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있어, 애플리케이션을 클라우드에 최적화하도록 지원해준다.
초기 도커는 LXC 기술을 기반으로 구현되었지만 최근에는 별도 컨테이너 기술을 구현하여 사용하고 있다.
전통적인 Linux 컨테이너는 멀티플 프로세스를 관리할 수 있는 init 시스템을 사용합니다. 즉, 전체 애플리케이션을 하나로 실행할 수 있습니다. Docker 기술은 애플리케이션을 개별 프로세스로 세분화하도록 권장하고 이를 위한 툴을 제공합니다. 이러한 세분화된 접근 방식에는 장점이 있다.
Docker Engine
도커는 서버/클라이언트 구조로 이루어져 있다.
서버는 Docker Daemon process 형태로 동작한다.
데몬이란 백그라운드에서 실행되는 프로그램으로, 사용자가 직접적으로 제어하지 않고 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다. 사용자의 요청을 기다리고 있다가 요청이 발생하면 이에 적절히 대응하는 리스너와 같은 역할을 한다.
Docker Daemon process에 요청하기 위해, 프로세스간 통신 기법이 필요하며, Docker는 이를 위해 Rest API를 사용한다.
Docker Command를 입력시 내부적으로 Rest API를 사용하여 Docker Daemon process를 호출한다.
Docker Image
구동에 필요한 프로그램과 라이브러리, 소스 코드를 패키징한 파일이다.
여러 이미지들을 Layer로 쌓는 것이 가능하며, 이를 통해 원하는 형태의 이미지를 만드는 것이 일반적이다.
Docker Container
Docker Image의 구체적인 실행 인스턴스이다.
Docker Daemon에 있는 커널에서 LXC로 리눅스 컨테이너를 생성한 후, 해당 컨테이너에 Docker Image에 포함된 명령을 실행하여, Docker Container를 만들고 실행한다.
Docker Container는 분리된 공간이므로, Docker Daemon process를 통해 접속할 수도 있고, 내부에 들어가서 코드 수정, 재실행도 가능하다.
[추가 참고]
https://www.redhat.com/ko/topics/containers/what-is-docker