개요
업무 관련해서 컨테이너, k8s 등 인프라 관련 발표를 진행할 일이 있었다. 이 업무를 맡으면서 컨테이너와 K8S라는 기술이 등장한 배경과 이점이 무엇인지에 대해 잘 이해했다고 생각했는데 뾰족한 질문들에 대한 답을 못했다.
질문 리스트는 다음과 같다.
- 도커 OS와 가상환경 OS의 차이점. (왜 컨테이너 OS가 더 가벼운건지?)
- 도커 이미지 생성 원리(도커 이미지 레이어)
- 여러 컨테이너로 배포한다고 했을 때 port가 중복이 될텐데 그러한 문제는 발생하지 않는지?
아무튼 질문에 대해 궁금하기도 하고, 확실히 알아야 할 것같아 이번 포스팅을 통해 정리해본다.
Host OS와 Guest OS
가상머신과 컨테이너의 차이점을 알기 위해서는 먼저 Host OS와 Guest OS란 무엇인가? 에 대한 이해가 필요하다.
1) Host OS: 말 그대로 주인. 원래 있던, 즉 내 컴퓨터에 본래 설치되어있는 운영채제이다.
2) Guest OS: 말 그대로 손님. 내 컴퓨터 OS 위에 추가적으로 설치될 OS이다.
VM 인스턴스
VM 인스턴스는 이러한 Guest OS를 갖는다. 아래의 그림과 같이 Host OS 위에 여러 Guest OS가 설치되어 작동하는 것이다. 이러한 Guest OS는 설치 과정까지 필요하다.
가상 머신 관련 이미지를 찾아보면 하이퍼바이저가 등장하는데, 이는 게스트 운영체제와 호스트 운영 체제가 소통할 수 있는 매개체 역할을 한다. 이 하이퍼바이저가 리소스 공유를 조정하므로 가상 머신(VM)은 동일한 하드웨어에서 여러 개의 다른 가상 머신과 함께 독립적으로 실행된다.
컨테이너
물리적 OS의 커널을 공유한다. 컨테이너는 컨테이너 엔진 or 컨테이너 런타임을 사용한다. 이 컨테이너 엔진이 Host OS와 컨테이너 사이에서 Agent 역할을 하며 애플리케이션에 필요한 시스템 리소스를 제공하고 관리한다. 따라서 컨테이너는 애플리케이션 실행을 위해 필요한 리소스만 패키징하고 있으면, 컨테이너 엔진이 Host OS에서 필요한 자원을 할당 받아 사용한다.
VM | Docker | |
가상화 | 전체 HW부터 SW까지 | SW 요소만 |
OS | Host OS 위에 Guest OS를 복제해서 사용(RAM, CPU 등등 모두) | 애플리케이션 동작에 필요한 dependencies들만 패키징하고있음 -> Host OS 공유 |
Docker 이미지 레이어
도커 공식 문서를 확인해보면 도커 이미지는 읽기 전용 템플릿으로, Dockerfile에 작성되는 각각의 명령줄이 layer로 형성이 된다.
도커가 이미지 레이어를 구성하는 방법
도커는 이와 같이 Dockerfile에 작성된 각각의 명령줄에 대한 레이어를 생성한다.
그런데 이러한 레이어에는 캐시 특성이 있다.
예를 들어 소스코드가 변경이 된다면 도커 파일은 이 소스코드 파일을 컨테이너에 복사하기(COPY . .) 전에 필요한 종속성을 다운받고 설치한다. 이때, 복사하는 명령어가 2개 이상 있다면 중복되는 부분에 한해서 도커 빌더는 캐시로 저장된 종속성 내용들을 재사용하는 특성이 있다.
따라서 개발자는 Dockerfile은 명령줄이 위에서부터 순서대로 적용되므로, 도커 파일의 instructions 순서를 잘 배치해야 이러한 캐시 특성을 잘 활용하여 리소스를 효율적으로 사용할 수 있다.
Docker 이미지 레이어 명령어
명령어별로 layer에 포함이 되는 명령어가 있고, 아닌 명령어가 있다. (참고 자료)
- docker image layer에 포함 - RUN, ADD, COPY
- docker image layer에 미포함 - CMD, LABEL, ENV, EXPOSE
이와 관련해서는 아래 명령어로 출력된 결과를 통해 어떤 레이어가 어떻게 저장되는지 해시값으로 알 수 있다.
docker image inspect
Docker 아키텍처
도커 아키텍처를 보면, 도커를 사용하는 개발자가 도커 명령어를 작성하는 것은 도커 데몬측으로 요청을 날리는 것이다.
이러한 요청을 받은 도커 데몬은 요청에 맞는 응답을 제공하는 서버 역할을 한다.
따라서 도커는 client - server 구조이며, 원하는 port 연결을 세팅할 수 있다.
결론과 내 생각
컨테이너 서비스를 사용한다는 건 명확한 이점이 많다. 하지만 컨테이너를 공부할수록 k8s와 뗄 수 없는 관계라는 것을 직감할 수 있었다. 그런데 우리 회사 서비스와 인력 상황을 생각했을 때 컨테이너 서비스의 이점을 얻으려고 k8s를 구축하는 것은 오버 엔진이다. 그래서 컨테이너의 이점을 살릴 수 있는 CI만 구축하기로 결정하였다.
실무를 하면서 확실히 느낀 건, 기술이 발전하고 이를 통해 고도화된 서비스를 제공할 수 있는 건 맞지만
현실적인 상황과 개발 일정 등을 모두 고려해서 이 기술의 효용을 극대화하는 능력이 중요하다.
도커∙컨테이너 서비스를 활용하여 더 좋은 서비스를 만들 수있는 확신이 생겼으니, 더 깊이있게 공부해서 앞으로 잘 사용해보고싶다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] Docker와 Docker Hub로 CI/CD 구축하기 (1) | 2023.10.23 |
---|---|
[Docker] MariaDB 도커 이미지와 PyMySQL로 쿼리 작성하기 (0) | 2023.06.08 |
[Docker] 도커란, 가상화(Virtualizaion)와 컨테이너 (0) | 2023.03.29 |