Docker

윤현우·2023년 6월 20일
0
post-thumbnail

도커란, 컨테이너 기술을 사용하여 애플리케이션에 필요한 환경을 신속하게 구축하고 테스트 및 배포를 할 수 있게 해주는 일종의 가상화 플랫폼이다.

가상화란 물리적 자원인 하드웨어를 효율적으로 활용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술이고, 컨테이너란 컨테이너가 실행되고 있는 호스트 os의 기능을 그대로 사용하면서 프로세스를 격리해 독립된 환경을 만드는 기술을 뜻한다.

사실, 도커가 세상에 나오기 전 컨테이너 기술은 이미 있었다.


가상머신과 도커 비교


가상머신(Virtual Machines)

기존의 가상화 기술인 가상머신(Virtual Machines)은 하이퍼바이저(Hypervisor)를 이용해 여러개의 운영체제를 하나의 호스트에서 생성해서 사용하는 방식이었다.

하이퍼바이저는 호스트 하드웨어에 설치되어 호스트와 게스트를 나누는 역할을 하고, 각각의 게스트는 하이퍼바이저에 의해 관리되며 시스템 자원을 할당받게 된다.

이 때 하이퍼바이저에 의해 생성된 게스트는 호스트나 다른 게스트와 상호 간섭하지 않고 완전히 분리된 환경에서 구동된다.

하이퍼바이저를 활용하면 마치 하드웨어가 여러 개인 것처럼 하나의 서버를 여러 명이 나눠 쓸 수도 있고, 컴퓨터 한 대에서 서로 다른 OS를 동시에 사용할 수도 있다.

이러한 가상화 방식을 사용하는 툴은 VirtualBox, VMware 등이 있다.

하지만, 이러한 가상화 방식은 기존OS 위에 OS를 실행하는 것이므로 리소스(CPU, 메모리 등)을 할당하는데 작업이 필요하고, 게스트 운영체제를 사용하기 위한 라이브러리, 커널 등을 전부 포함하기 때문에 가상 머신을 배포하기 위한 이미지로 만들었을 때 이미지의 크기 또한 커진다.

즉, 가상 머신은 완벽한 운영체제를 생성할 수 있다는 장점은 있지만 일반 호스트에 비해 성능 손실이 있으며, 수 기가바이트에 달하는 가상 머신 이미지를 애플리케이션으로 배포하기는 부담스럽다는 단점이 있다.

정리

  • 가상머신은 Hypervisor를 통해 여러개의 운영체제를 생성되고 관리됨. (Guest OS)

  • 시스템 자원을 가상화하고 독립된 공간을 생성하는 작업은 HyperVisor를 거치므로 -> 성능 손실이 큼 ↑

  • 가상머신은 Guest OS를 사용하기 위한 라이브러리, 커널 등을 포함하므로 -> 배포할 때 용량이 큼 ↑

이러한 기술을 대체한 것이 바로 도커이다.


MSA(Micro Seivice Architecture)

사실 요즘 MSA(Micro Service Architecture)가 대세로 떠오르면서 MSA의 단점인 관리의 복잡성을 해결해주기 위해 서비스의 컨테이너화가 이루어지고, 이 과정에서 Docker와 Kubernetes가 많이 도입되었다.

MSA(Micro Service Architectur)란 간단하게 설명하자면, 서비스간의 의존성을 없애고 기능을 쪼개는 것을 중점적으로 설계한 아키텍처이다.

하나의 통합된 프로그램이 아닌 비슷한 기능을 가진 것들을 잘게 쪼개서 만든 것이다.

이런 방식의 아키텍처는 새로운 서비스 개발 시(기능 업데이트) 필요한 기능 부분만 수정하여 비교적 간편하게 작업을 경량화 시킬 수 있다.

전체적인 그림에서 서비스간 결합도(Coupling)를 줄이고 응집도(Cohesion)를 높이는 효과를 볼 수 있다.

MSA에 이런 장점들이 있는 반면에, 서비스들을 관리하기 복잡하다는 단점이 있다.

도커를 사용하면 이런 문제를 쉽게 해결할 수 있다.


도커(Docker)

도커 컨테이너는 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스(namespace), cgroup을 사용함으로써 프로세스 단위의 격리 환경을 만들기 때문에 성능 손실이 거의 없다.

컨테이너에 필요한 커널을 공유해서 사용하고, 컨테이너 안에는 어플리케이션을 구동하는 데 필요한 라이브러리 및 실행 파일만 존재하기 때문에 컨테이너를 이미지로 만들었을 때 이미지의 용량 또한 가상 머신에 비해 대폭 줄어든다.

따라서 컨테이너를 이미지로 만들어 배포하는 시간이 가상 머신에 비해 빠르며, 가상화된 공간을 사용할 때의 성능 손실도 거의 없다는 장점이 있다.

  • 도커 컨테이너는 가상화된 공간을 생성할 때 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 만드므로 -> 성능 손실 없음 無

  • 가상머신과 달리 커널을 공유해서 사용하므로, 컨테이너에는 라이브러리 및 실행파일만 있으므로 -> 용량이 작음 ↓

  • 위의 이유로 -> 컨테이너를 이미지로 만들었을 때

    배포하는 시간이 가상 머신에 비해 빠르며 ↑, 사용할 때의 성능 손실 또한 거의 없음 ↓


도커를 사용하는 이유

가상머신에 비해 월등히 뛰어나다, 도커는 단점이 없다. 이런 뜻이 아니다. 때에 따라 경우에 따라 사용하는 환경이 다를 뿐이다.

어떤 때에 도커를 사용하는 것일까?

가장 첫번째로 위에 말했듯이 MSA환경을 구축할 때 도커를 주로 이용한다.

도커를 사용하게 되면 IaC(Infrastructure as Code)가 가능 하다.

Docker의 진짜 큰 힘은 인프라를 코드화해서 관리할 수 있다는 점이다.

Dockerfile이나 docker-compose를 만져보면 이전에는 직접 시스템을 세팅해줘야 하는 부분들을 코드로 편리하게 관리할 수 있는 것을 볼 수 있다.

두번째로 도커는 테스트, 스테이징, 배포 등 여러 용도로도 사용 가능하다.

테스트 환경, 스테이징 환경, 배포 환경등이 개발환경과 다를 수 있다.

각각의 환경들을 하나의 레거시 환경에서 돌리게 된다면, 수많은 오류를 마주할 수 있다.

결국 도커를 사용하여 여러 환경에 맞추어 애플리케이션을 컨테이너화 시키면, 개발과 배포의 흐름이 매우 간단해져서 빠르게 진행될 수 있다.

서버의 운영체제나 미들웨어의 의존성에 대해 걱정할 필요없이 Docker만 설치되어 있다면 모든 것이 해결된다.

또한 배포 후, 애플리케이션 사용자 수가 늘어나면 해당 인프라를 확장할 시 scale-out에 매우 큰 도움이 될 수 있다.

결국 우리는 이러한 개발환경에 익숙해져야 하고 잘 쓸줄 알아야 한다.

곧 개발단계가 끝나가는 프로젝트가 있는데, 도커와 aws를 통해 배포해볼 예정이다.

해당 프로젝트를 배포하기전에 docker와 aws에 대해 자세히 알아볼 예정이다.


References
https://myjamong.tistory.com/297
https://velog.io/@markany/%EB%8F%84%EC%BB%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%96%B4%EB%96%A4-%EA%B2%83-1.-%EB%8F%84%EC%BB%A4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
https://seosh817.tistory.com/345#Virtual%20Machine(%EA%B0%80%EC%83%81%EB%A8%B8%EC%8B%A0)%20vs%20Docker%20Container(%EB%8F%84%EC%BB%A4%20%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88)-1

profile
개발자가 되는 그날까지

0개의 댓글