안녕하세요!
이번주는 벌써 cloudwave 4주차가 시작되었네요.. 시간이 참 빠르게 지나가고 있답니다..
지난주부터 저는 docker와 docker compose, k8s에 대해 간단하게 배우고 있는데요!
특히 docker는 졸업작품과 동아리 프로젝트를 진행하면서 github Actions를 활용하여 CI/CD를 구축했던 경험이 있었어요.
그 때 당시에는 도커의 사용법도 제대로 모르고 개발을 완성하는 것만 초점에 많이 맞추다보니 기초가 많이 부족하더라구요..
그래서 오늘은 도커가 정확히 무엇인지? 간단하게 살펴보도록 하겠습니다!
참고로, 오늘은 혼잣말을 하는 컨셉이니 참고해서 읽어주세요🫶🏻
Docker란?
- 컨테이너 기반 가상화 도구
컨테이너? 가상화? 그러니까 그게 뭐냐구요....
지금부터 하나씩 알아가보도록 해요!
01 가상화란?
등장배경
여러분들이 만약 회사에서 서비스를 운영한다고 했을 때, 1000만원 짜리의 서버 한 대를 어떻게 이용하고 싶으신가요?
해당 서버에 쇼핑몰 서비스를 구동하고 있는 상황에서 유저의 이용자가 많지 않다면 서버의 자원은 쉬고있는 친구들이 많이 있을거예요..
그래서 여러분은 "좋았어! 서비스를 하나 더 운영해서 서버를 효율적으로 사용해보자!"는 생각으로 새로운 서비스인 배달 서비스를 진행하게 되었습니다.
그. 런 . 데.. 아차차... 서비스를 구동하려고 보니 해당 서버의 개발 환경이 충돌이 발생해서 둘 중 하나의 서비스만 운영할 수 밖에 없는 상황이 발생해 버렸네요..
이런 상황 속에서 여러분이라면 어떻게 해결하실건가요?
바로 이러한 배경에서 탄생된 것이 "가상화"입니다!
하나의 서버에 여러 서비스를 구동하려고 했을 때 충돌이 발생한다면, 이러한 문제를 해결하기 위해서 서버의 성능을 나눠서 사용할 수 있는 방법은 없을까? 즉, 하나의 서버자원을 나눠 가지며 성능을 분산 시키고 분산된 서버들은 각기 다른 서비스를 수행하는 것을 의미하는 것이죠.
이렇게 가상화를 사용하여 사용자가 많은 서비스는 많은 자원을 할당하고 사용자가 적은 서비스는 적은 자원을 할당할 수 있게됩니다.
그렇다면 가상화는 무엇일까? 조금 더 자세히 알아봅시다.
가상화의 종류
서버가상화와 컨테이너 가상화의 장단점에 대해 알아보며 개념을 이해해보자!
1) 서버 가상화
- 하나의 물리적 서버 호스트에서 여러개의 서버 운영체제를 게스트로 실행할 수 있게 해주는 소프트 아키텍처
- Host OS에 여러개의 Guest OS를 실행할 수 있도록 Hypervisor가 도와주는 역할
- 각 가상머신에는 여러 운영체제가 설치
- 하이퍼바이저에 의해 생성되고 관리되는 운영체제를 게스트 운영체제라고 부름
- 각 게스트 운영체제는 다른 게스트 운영체제와는 완전히 독립된 공간과 시스템 자원을 할당받아 사용
✏️ Hypervisor(하이퍼바이저)란?
- 서버 가상화 기술을 구현할 수 있게하는 SW
- 가상머신이라는 단위로 구현
- 하이퍼바이저는 운영체제들에게 자원을 나눠주며 조율
- OS들의 커널을 번역해서 하드웨어에게 전달
- 대표적인 가상화 Tools : virtualBox, VMware ..
가상화의 단점
- 가상화 작업은 반드시 하이퍼바이저를 거쳐야함
- 일반 호스트에 비해 성능 손실이 발생
- 이미지 거대화
- 가상 머신에는 게스트 운영체제를 사용하기 위한 라이브러리나 커널 등을 전부 포함하기 때문에 배포하기 위한 이미지로 만들었을 때 크기 또한 커짐
- 완벽한 운영체제를 만들기 위한 트레이드 오프
- 가상머신은 완벽한 운영체제를 생성하는데에는 유용하지만 성능이 느리고, 용량상으로 부담이 있다.
만약 작은 서비스를 운영한다면, OS까지 새로 띄우는 것이 부담스러울 수 있다.
그래서 탄생한 것이 바로 컨테이너 기반 가상화이다!
2) 컨테이너 기반 가상화
- 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, namespace, cgroup을 사용
- 즉, 프로세스 단위의 격리 환경을 만듦.
- 위의 그림을 참고해보면, Container Runtime(여기에선 Docker Engine으로 생각하겠다) 위에 컨테이너가 할당 된 것을 확인할 수 있다.
- 컨테이너 안에는 애플리케이션을 구동하는데 필요한 라이브러리와 실행파일만 존재한다.
- 그렇기 때문에, 이미지를 만들었을 때, 이미지 용량 또한 가상머신에 비해 대폭 줄어듦
- 따라서 이미지를 만들어 배포하는 시간이 가상머신에 비해 빠르며, 가상화된 공간을 사용할 때 성능 손실도 거의 없다는 장점이 존재
- 참고로, 이미지에는 Docker Engine이지만 컨테이너를 다루는 기술은 여러 벤더사가 존재한다.
- 즉, 컨테이너 기술은 도커만의 기술이 아니다.
자, 이렇게 서버 가상화와 컨테이너 가상화의 장단점에 대해 알아보았다.
그렇다면 우린 궁극적으로 “컨테이너를 왜 써야할까?”라는 질문에 대한 대답을 생각해보아야 한다.
‘이미지보다 가볍고, 빠르니까 그런것 아닐까?’
흠.. 아직 뭔가 알쏭달쏭하다.. 조금만 더 알아보자!!
컨테이너에 대해 조금 더 생각해보며 이유를 찾아보도록 할 것이다.
02 컨테이너란?
여기서 자주 헷갈리는 개념의 질문이 있다.
Q. 도커가 컨테이너 아닌가요?
A. 도커는 컨테이너 기술에 여러 기능을 추가한 오픈소스 프로젝트
컨테이너의 의미
컨테이너의 사전적 의미
- 어떤 물체를 격리하는 공간을 뜻한다.
- 즉, 각각의 컨테이너는 격리된 상태로 다른 컨테이너들과 분리된다.
그렇다면 기술적 의미에선 무엇을 의미할까?
우리는 종종 Servlet Container, IoC Container, Bean Container 등 컨테이너라는 용어를 자주 접해본 적이 있을 것이다.
이러한 컨테이너는 컨테이너들에 담긴 것들의 라이프 사이클을 관리해준다.
즉, 무언가의 생성, 운영, 제거까지의 라이프 사이클을 이야기 한다.
가상화 관점의 컨테이너의 의미
- 이미지의 목적에 따라 생성되는 프로세스 단위의 격리 환경이다.
이미지는 간단히 컨테이너를 만들기 위한 틀 정도로 생각하고 넘어가보도록 한다.
- 컨테이너는 환경을 제공하며 프로세스의 생명주기를 관리한다.
예를 들어 생각해보자. 만약 SpringBoot 1개와 Nginx 1개를 컨테이너에서 실행한다면 어떻게 될까?
우선 위에서 말했던 이미지의 목적이 바로 SpringBoot와 Nginx 애플리케이션이 된다.
컨테이너를 자세히 보니, SpringBoot 프로세스와 Nginx 프로세스가 각각 할당되며 격리되어 있다.
MySQL의 경우는 도커엔진 위에 없다는 점만 확인하고 넘어가도록 한다.
컨테이너는 파일시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간을 가진다.
컨테이너가 실행되며, 프로세스가 실행되기에 필요한 자원들을 할당받고 프로세스를 실행한다.
이때 커널을 통해 필요한 자원들을 가져온다.
프로세스는 OS 위에서 실행되는데, 이를 Host OS라고 표현하도록 한다.
그렇다면 Host OS입장에서는 컨테이너를 어떻게 바라볼까?
앞서 설명했듯 컨테이너는 프로세스의 생명주기를 관리하며 실행하는 하나의 프로세스라고 말할 수 있다.
즉, springboot 애플리케이션 프로세스를 직접 실행하나 컨테이너로 실행하나 호스트의 입장에서는 똑같은 프로세스로 바라보게 된다.
그렇다면 “컨테이너를 왜 써야할까?”
- Host와의 격리를 통해 독립된 개발 환경을 보장한다.
- 컨테이너는 프로세스를 격리된 환경에서 관리한다.
- 이때 격리된 환경은 Host OS와의 격리를 의미하며 이를 통해 컨테이너에 어떤 설정을 하든지 Host OS에 영향을 끼치지 않는다.
- 즉, 우리만의 독립된 개발환경을 보장받을 수 있다.
이를 통해 우리는 또 알게 된 사실이 있다.
- 프로세스를 컨테이너 단위로 바라보며 사용할 수 있다
- 프로세스의 관리, 확장이 용이하다.
그렇다면 컨테이너를 어떻게 관리 할 수 있을까?
우리는 [그림2]에서 본 것처럼 사용자는 도커엔진을 통해 컨테이너를 관리할 수 있다는 것을 확인할 수 있었다.
도커엔진? 그게 뭐지?
03 도커엔진이란?
- 유저가 컨테이너를 쉽게 사용할 수 있게 하는 주체
- 주요 기능
- 컨테이너 관리
- 컨테이너의 라이프 사이클을 관리
- 이미지 관리
- 컨테이너를 생성하기 위한 이미지관리
- 볼륨 관리
- 컨테이너의 데이터를 저장하기 위한 저장소를 관리
- 네트워크 관리
- 컨테이너의 접속을 관리
- 컨테이너 관리
자, 이제는 도커에서 제공하는 프로젝트를 잠시 살펴보도로 하자
docker를 각각의 프로젝트로 바라본다면, 그 안에 사각형 박스들은 각각 목적에 따라 분리되어 있다.
그렇다면, 사용자가 도커 명령어를 쳤을 때 어떠한 flow를 가질까?
사용자가 도커 명령어를 입력했을 때 flow 살펴보기
- 먼저 사용자는 docker 명령어로 도커 엔진에게 명령어를 보낸다.
- etc. docker run -it …
- 이를 전달 받은 도커 클라이언트는 /var/run/docker.sock 위치한 유닉스 소켓을 이용해 도커 데몬의 API를 호출
- 도커 데몬은 명령어에 해당하는 작업을 수행하고, 수행결과를 도커 클라이언트에게 반환하며 사용자에게 결과를 출력한다.
- docker는 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체이다.
- 도커 프로세스가 실행되어 입력을 받을 준비가 된 상태를 도커 데몬이라고 부름.
- 도커 데몬에게 명령어를 직접 보내고 싶을 경우에는 어떻게 하면될까?
- url 요청을 보내 명령어를 쳤을 때와 같은 동작을 수행할 수 있다.
- etc. curl 192.168.9.1:2222/version
✏️ 도커 소켓이란?
- 도커 소켓은 /var/run/docker.sock에 위치해 있다.
- 메인 도커 데몬과 통신하기 위해 사용된다.
- 도커 API 의 entry point이다.
- CLI 환경에서 도커 명령어를 실행하는데 사용된다.
정리
지금까지의 내용을 정리해보자!
가장 먼저 가상화의 필요성에 대해 알아보며 가상화의 종류까지 파악해보았다.
그리고 서버 가상화의 단점(이미지 거대화, 하이퍼바이저, 완벽한 운영체제를 만들기 위한 trade-off)으로 컨테이너 가상화를 사용한다는 것을 알았다. 또한, 프로세스의 생명주기를 관리하는 가상화 기술인 컨테이너에 대해 알아보았다.
이어서 컨테이너의 생명주기를 관리하는 도커엔진까지 알아보았다.
도커스웜과 도커 컴포즈에 대한 이야기는 다음 포스팅에서 정리하도록 하겠다!
그럼 다음 포스팅에서 만나요!!
📚 참고
'Cloud Wave' 카테고리의 다른 글
AWS를 이용하여 환경을 구축해보며 네트워크에 대해 알아보자! (1) | 2024.01.25 |
---|---|
사설 IP로 인터넷을 접속하려면 어떻게 하는걸까? NAT란?(with AWS) (3) | 2024.01.19 |
여러 개의 서버를 다루는 방법? Docker Compose, Docker Swarm (0) | 2024.01.08 |
DNS가 단순 도메인이 아니였다고? DNS란? (feat. Rocky Linux) (1) | 2023.12.28 |
[Network] 네트워크란? (1) | 2023.12.27 |