Docker 동작 원리

둥냥둥냥둥·2024년 1월 7일
0
post-thumbnail

도커의 구조

일반적으로 도커와 컨테이너는 서버에서 사용되며, 아래의 그림과 같은 구조를 보인다.
사실 이보다 복잡하지만 지금은 이 그림과 같다고 생각해보자.

우선 물리 서버가 있고, 이 물리서버에서 동작하는 리눅스 운영체제가 있다. 여기까지는 일반적인 서버와 다를 바 없다.

일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 도커를 사용하는 경우에는 운영체제 위에 도커 엔진이 동작하고 그위에서 컨테이너가 동작한다.


그림 01

그렇다면 컨테이너 속은 어떤 구조일까?

'컨테이너에 넣는다'는 표현을 생각하면 빈 컨테이너에 무언가를 넣는 상상을 하게 되지만 정말로 텅빈 컨테이너는 의외로 잘 상용되지 않는다. 텅 빈 컨테이너가 진짜로 있긴 하지만 이를 사용할 일을 거의 없다.

컨테이너의 구조에 대한 이야기로 돌아가면, 모든 컨테이너는 '리눅스 운영체제 비슷한 무언가'가 들어있다. 술집에서 아무것도 주문하지 않아도 기본 안주가 나오듯, 최소한의 컨테이너에도 '리눅스 운영체제 비슷한 무언가'가 딸려 나온다. 빈 컨테이너라고 했지만 정말로 텅 빈 것은 아닌 셈이다.


운영체제가 하는 일은 뭘까?

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

사람이 보면 복잡하기 짝이 없는 프로그램이지만 하트웨어의 입장에서 보면 대강의 명령으로만 구성돼 있다. 그 이유는 사람은 하나의 단어로 여러 동작을 나타낼 수 있기 때문이다. 하드웨어는 자신의 판단으로 여러 의미 중 적절한 것을 고르거나 적당히 일을 할 수 없고, 지시받은 대로만 수행할 수 있기 때문에 세세한 동작 하나하나를 지정해주지 않으면 안 된다.

예를 들자면

  • 테이블 위 귤이 하나 있을 떼 "귤을 먹어라" 명령
  • 사람 : 아무 어려움 없이 명령 수행
  • 하드웨어 : 테이블 오른쪽 상단에 위치한 귤을 손에 쥐고 껍질을 벗겨 알맹이를 먹어라
  • 이렇듯 하드웨어는 사람과 달리 구체적으로 지시하지 않으면 이해를 못한다.

프로그램에 적힌 것은 "귤을 먹어라" 정도의 수준이며, 이보다 자세한 사항은 운영체제가 풀어서 하드웨어에 지시한다.


그림 02

  • 소프트웨어 : 귤 먹어라
  • 운영체제 : 테이블 오른쪽 상단에 위치한 귤을 손에 쥐고 껍질을 벗겨 알맹이를 먹어라
  • 하드웨어 : OK

운영체제 역할을 이해 했으니 다시 컨테이너에 대한 설명으로 돌아가자

위 (그림 1)을 보면 도커 엔진 아래에도 리눅스 운영체제가 있는데, 컨테이너 속에 또 리눅스 운영체제가 있다(그림에 mtsql 있지만, 이 설명에서는 리눅스 운영체제 비슷한 무엇가로 생각하자)

하지만 바로 이 점이 도커의 가장 큰 특징 중 하나이다.

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

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

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

그림 출처 : https://velog.io/@kjw8370/%EB%8F%84%EC%BB%A4%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC

컨테이너 속에 '리눅스 운영체제 비슷한 것'이 들어 있는 것은 이 때문이다. 전체 리눅스 운영체제가 들어있는 것이 아니라 주변 부분만 들어 있기 때문에 '비슷한 것'이라고 표현하는 것이다.

간단하게 리눅스 운영체제 전체를 컨테이너 속에 넣으면 되지 않을까 싶지만 주변 부분만 컨테이너에 넣고 커널은 밑바탕에 있는 것을 빌려 쓰는 형태 덕분에 도커의 가장 큰 특징인 "가벼움"을 얻을 수 있었다.


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

도커는 기본적으로 리눅스 운영체제에서만 동작한다.

이유는 도커는 밑바탕에서 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 괘 있기 때문에 리눅스 운영체제에서만 동작할 수 있다.

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

그리고 컨테이너에서 실행한 소프트웨어 역시 리눅스용 소프트웨어이다. 윈도우나 macOS 소프트웨어는 컨테이너에 넣어도 동작하지 않는다.

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

도커에 대한 이야기는 대개는 서버 환경을 전제로 한 것이 많은데, 리눅스 운연체제가 서버에서 사용되는 경우가 많고 리눅스용 소프트웨어도 서버용 소프트웨어가 많기 때문이다.

그림 03

  • 컨테이너에 들어가는 프로그램은 리눅스용이어야 한다.

이렇듯 도커는 리눅스 운영체제를 사용한다고 전제하기 때문에 우리가 평소에 사용하는 윈도우나 macOS 운영체제를 사용하는 컴퓨터에서도 도커를 사용할 수 있어야한다. 그러나 실제로는 윈도우 또는 macOS 컴퓨터에서 도커를 사용할 수 있다.

이런 경우에는 VirtualBox나 VMware 같은 가상 환경 위에 리눅스 운영체제를 설치하고 그 위에서 도커를 실행하거나 '윈도우용 또는 macOS용 도커 데스크톱'처럼 도커를 실행하는 데 필요한 리눅스 운영체제를 포함한 패키지를 설치해 사용하는 경우가 있다.

간단하게 말하면 위도우나 macOS 위에 리눅스 운영체제를 끌어들여 도커를 실행하는 것이다.

도커를 사용하려면 어떤 형태로든 리눅스 운영체제를 갖춰야 한다는 것만 기억해 두자

그림 04

그림 출처 : https://velog.io/@sayo11/%EB%8F%84%EC%BB%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A0%A4%EB%A9%B4
profile
Java 먹자

0개의 댓글