잡다한 공부/Cloud

[도커&쿠버네티스] 3.도커의 동작원리

자이구 2023. 12. 4. 23:42

도커의 구조

일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 

도커를 사용하면 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다. 

프로그램이나 데이터는 컨테이너 안에 위치한다. 

 

모든 컨테이너에는 리눅스 운영체제 비슷한 무언가 들어있다. 

운영체제 비슷한 무언가일 뿐 실제 운영체제가 아니다. 

운영체제는 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역활을 한다. 

 

도커엔진 아래에도 리눅스 운영체제가 있는데, 컨테이너 속에 또 리눅스 운영체제 비슷한 것이 있다. 

본래 운영체제는 커널과 그 외 주변 부분으로 구성된다. 

주변 부분이 프로그램의 연락 내용을 커널에 전달하고 커널이 하드웨어를 다룬다. 

 

도커에서는 컨테이너가 완전히 분리돼 있으므로 밑바탕이 되는 리눅스 운영체제의 주변 부분이 컨테니어 속 프로그램의 명령을 전달받을 수 없다. 따라서 컨테이너 속에 운영체제의 주변 부분이 들어있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 돼 있다. 

 

Q.그럼 간단하게 리눅스 운영체제 전체를 컨테이너 속에 넣으면 되지 않을까?

A.주변 부분만 컨테이너에 넣고 커널은 밑바탕에 있는 것을 빌려 쓰는 형태 덕분에 도커의 가장 큰 특징인 가벼움을 얻을 수 있다. 


도커는 기본적으로 리눅스용이다.

도커는 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 돼 있어 리눅스 운영체제에서만 동작할 수 있다.

또 컨테이너 안에 들어 있는 주변 부분도 이에 맞춰 리눅스 운영체제의 주변 부분이어야 한다.

컨테이너에서 실행할 소프트웨어(프로그램) 역시 리눅스용 스프트웨어다. 

 

즉, 도커는 리눅스 컴퓨터에 독립된 격리환경을 만드는 것이며, 리눅스에서만 동작하고, 컨테이너에서 동작할 프로그램 역시 리눅스용 프로그램이다. 

 

Q.그러면 윈도우와 macOS에서 도커는 어떻게 구동되는 것일까?

A. - VirtualBox와 VMware 같은 가상 환경 위에 리눅스 운영체제를 설치하고 그 위에 도커를 실행

     - 윈도우용 또는 macOS용 도커 데스크톱처럼 도커를 실행하는데 필요한 리눅스 운영체제를 포함하는 패키지를 설치

    즉 윈도우나 macOS 위에 리눅스 운영체제를 끌어들여 도커를 실행하는 것이다. 


이미지와 컨테이너

컨테이너를 생성하려면 먼저 이미지를 만들어야 한다. 이미지는 컨테이너를 찍어내는 '빵틀'과 같은 것으로 

컨테이너의 설계도 역활을 한다. 이미지는 컨테이너를 만드는 데 사용하며 우리가 실제로 사용하는 것은 컨테이너이지, 이미지를 그래도 사용하는 일은 없다 .

 

이미지는 '빵틀'과 같은 역활을 하는 것으로, 하나만 있으면 똑같은 것을 여러개 만들 수 있다. 

따라서 동일한 컨테이너를 여러 개 배치하기 편리하다. 

 

이미지로만 컨테이너를 만들 수 있는 것이 아니라 컨테이너로도 이미지를 만들 수 있다. 

컨테이너로 이미지를 만드는 것은 이미 만든 컨테이너에 손을 대서 '빵틀'을 새로이 만드는 과정이다. 

개조된 컨테이너로부터 이미지를 만들고 나면 새로 만든 이미지를 사용해 개조된 컨테이너를 여러개 만들 수 있다.

 

동일한 컨테이너를 여러 개 만들지 않더라도 이러한 특성을 이용해 다른 물리 서버에 설치된 도커 엔진으로 컨테이너를 이동시킬 수 있다. 컨테이너는 도커 엔진만 설치돼 있으면 구동이 가능하므로 다른 서버나 컴퓨터에 도커 엔진을 설치하고 새로운 도커 엔진에 이미지를 이용해 똑같은 컨테이너를 생성하면 된다. 사실 컨테이너 자체가 이동하는 것은 아니지만 이미지를 통해 컨테이너가 이동한 것과 같은 효과를 얻을 수 있다. 

 

도커 허브는 구글 플레이 스토어와도 같은 존재로, 공개된 컨테이너 이미지가 모여 있는 곳이다. 이곳에서 원하는 컨테이너의 이미지를 내려받을 수 있다.  


도커 컨테이너의 생애주기와 데이터 저장

컨테이너는 쓰고 버리는 일회용품 같은 것이다.

새로운 버전이 나오면 새로운 컨테이너로 갈아타는 것이 좋다. 

컨테이너는 여러 개를 동시 가동하는 상황을 전제로 하기 때문이다.

여러 개의 컨테이너를 하나하나 업데이트하려면 많은 수고가 든다.

초기 구축은 간단히 마쳤는데 유지 보수할 때마다 컨테이너를 일일이 업데이트하려니 컨테이너의 장점이 반감된다.

이러한 이유로 오래된 컨테이너를 버리고 새로운 이미지로부터 새로운 컨테이너를 만들어 갈아타는 방식을 사용한다.  

 

이렇듯 컨테이너를 만들고 -> 실행하고 -> 종료하고 -> 폐기하는 일현의 가정을 컨테이너의 생애주기라고 부른다. 

 

컨테이너를 폐기했다면 컨테이너에 들어있던 데이터는 어떻게 될까?

 

컨테이너를 폐기했다면 해당 컨테이너 안에서 편집했던 파일은 당연히 사라진다. 이런 일을 방지하기 위해 보통은 

도커가 설치된 물리적 서버의 디스크를 마운트해 이 디스크에 데이터를 저장한다. 

마운트는 디스크를 연결해 데이터를 기록할 수 있도록 한 상태를 의미한다.

 

운영체제나 소프트웨어 부분은 컨테이너 형태로 만들었다가 쓰고 버리는 것을 반복하고, 데이터는 다른 곳에 저장해두고 같은 것을 계속 사용한다고 보면 된다. 설정 파일도 마찬가지이다. 

그러나 프로그램을 개발할 때는 다른 저장소에 저장하지 않은 경우도 있으므로 다시 한 번 확인 해야한다.