이 글은 메타코딩 님의 유튜브 강의를 학습한 내용을 정리하여 작성합니다.
도커 작동 원리
도커의 구조
운영체제를 통해 하드웨어를 제어할 수 있다.
도커(Docker)는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.
도커 웹 페이지의 기능을 인용하면 다음과 같다:
도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.
도커는 리눅스에서 운영 체제 수준 가상화의 추상화 및 자동화 계층을 추가적으로 제공한다. 도커는 cgroups와 커널 이름공간과 같은 리눅스 커널의 기능들과 OverayFS, aufs와 같은 유니언 가능 파일 시스템의 리소스 격리 기능을 사용하며, 이를 통해 독립적인 "컨테이너"가 하나의 리눅스 인스턴스 안에서 실행할 수 있게 함으로써 가상 머신을 시작하여 유지보수해야 하는 부담을 없애준다.
리눅스 커널의 이름공간 지원은 대체적으로 프로세스 트리, 네트워크 사용자 ID, 마운트된 파일 시스템을 포함한 운영 환경에 대한 응용 프로그램의 관점을 격리시키지만, 커널의 cgroup들은 CPU, 메모리, 블록 입출력, 네트워크를 포함한 리소스 제한을 제공한다. 버전 0.9부터 도커는 libvirt, LXC (리눅스 컨테이너), systemd-nspawn을 통한 추상화된 가상화 인터페이스를 사용하는 것 뿐 아니라 리눅스 커널이 제공하는 가상화 기능을 직접 사용하기 위한 유일한 수단으로 libcontainer 라이브러리를 포함하고 있다.
- 위키백과
컨테이너 내부
- 모든 컨테이너에는 리눅스 운영체제 비슷한 무언가가 들어있다.
- 이때 운영체제 비슷한 무언가는 실체 운영체제가 아니다.
도커 구조
그림으로 그려보면 대략 다음과 같다.
- 이때 OS는 host 운영체제이다.
- 위키백과의 말에 따르면 도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.
- 도커는 기본적으로 리눅스 운영체제에서만 동작한다.
- 도커는 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 되어 있어 리눅스 운영체제에서만 동작할 수 있다.
- 이러한 이유로 컨테이너 낭네 들어 있는 주변 부분도 이에 맞춰 리눅스 운영체제의 주변 부분이어야 한다.
- 또한 컨테이너에서 실행할 소프트웨어 역시 리눅스용 소프트웨어이다.
- 즉, 도커는 리눅스 컴퓨터에 독립된 격리 환경을 만드는 것이며, 리눅스에서만 동작하고, 컨테이너에서 동작할 프로그램도 리눅스용 프로그램이다.
- 운영체제 위에 리눅스가 필요하다.
- 하지만 존재하지 않으므로 운영체제 위에 리눅스 하위 시스템을 설치한다.
- 이런 경우 크게 두가지 방식이 존재한다.
- VirtualBox나 MVware 같은 가상 환경 위에 리눅스 운영체제를 설치하고 그 위에서 도커를 실행한다.
- 윈도우용 또는 macOS용 도커 데스크톱처럼 도커를 실행하는 데 필요한 리눅스 운영체제를 포함하는 패키지를 설치해 사용한다.
- 도커를 사용하려면 어떤 형태로든 리눅스 운영체제를 갖추어야 한다.
- 리눅스 하위 시스템을 설치했다면 도커 컨테이너를 올릴 수 있다.
- 도커는 기본적으로 리눅스 운영체제에서만 동작한다.
- 카카오톡과 같은 응용프로그램은 커널에 의해 하드웨어에 접근한다.
- 실제 운영체제의 역할은 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 것이다.
- 도커에서는 컨테이너가 완전히 분리돼 있으므로 밑바탕이 되는 리눅스 운영체제의 주변 부분이 컨테이너 속 프로그램의 명령을 전달받을 수 없다.
- 따라서 컨테이너 속에 운영체제의 주변 부분이 들어 있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 되어 있다.
- 일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 도커를 사용하는 경우 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다.
커널 구조
- 사용자가 터미널을 통해 명령어를 입력하면 host 운영체제는 해당 명령어를 받아 도커 서버에게 명령을 내린다.
- 도커 서버는 해당하는 컨테이너에게 다시 명령을 내린다.
이미지와 컨테이너
컨테이너를 생성하려면 먼저 이미지를 생성해야 한다.
이미지는 컨테이너를 찍어내는 빵틀과 같은 것으로 컨테이너의 설계도 역할을 한다.
이미지 하나만 있으면 동일한 컨테이너 여러 개를 배치하기 편리하다.
이미지 자체로는 큰 쓸모가 없다.
이미지는 컨테이너를 만드는 데 사용한다.
실제 사용하는 것은 컨테이너이며, 이미지를 그대로 사용하는 일은 없다.
즉, 이미지가 실행되어 인스턴스가 되면 그것을 컨테이너라 한다.
컨테이너로도 이미지를 만들 수 있다.
컨테이너로부터 이미지를 만들 수 없었다면 여러 개의 컨테이너를 일일이 수정할 수밖에 없었을 것이다.
개조된 컨테이너로부터 이미지를 만들고 나면 새로 만든 이미지를 사용해 개조된 컨테이너를 여러 개 만들 수 있다.
예를 들어 소프트웨어나 시스템을 넣은 새로운 이미지를 만들면 다수의 서버를 준비하는 작업이 매우 간단해진다.
'Docker' 카테고리의 다른 글
도커 이미지 삭제하기 (0) | 2023.05.24 |
---|---|
도커 컨테이너의 생애주기와 데이터 저장 (0) | 2023.05.24 |
도커, 도커허브설치 및 도커허브 회원가입 (0) | 2023.05.24 |
도커, 도커컴포즈, 도커허브 (0) | 2023.05.18 |
도커(Docker) 개념 (0) | 2023.05.18 |