PROGRAMMING/Docker

Docker 소규모 아키텍트 (1) - Docker란 무엇일까

Heony 2022. 7. 27. 09:47

안녕하세요.
소규모 아키텍트를 직접 제작해보기 위해 AWS으로 인프라 구축을 하고있었는데, 마침 AWS의 ECR, ECS 서비스가 docker와 연관이 있는 것을 보고 Docker에 대한 소규모 아키텍트 정의를 해보는 것이 필요하다 느끼게 되어 글을 작성합니다.

 

각 서비스가 어떠한 기능을 가지고 있는지에 대해서는 아직 모르셔도 됩니다. 그냥 AWS 서비스 안에서 docker를 지원하는구나 정도의 수준으로 이해하시면 될 것 같습니다.

 

Docker

도커를 시작하게되면 많은 이야기를 듣습니다.

도커는 컨테이너 기술입니다.

또는

도커는 이미지를 구현합니다.

등의 이야기들을 말이죠.

 

좋은 문장이기는 하지만 정확하게 무엇을 의미하는지 이해하기가 힘듭니다. 가장 먼저 컨테이너가 무엇인지 살펴보아야 도커를 이해할 수 있을 것입니다. 컨테이너하면 떠오르는 것은 바로 이 이미지일겁니다.

 

정확하게 그 의미를 같이하는 것은 아니지만, 이 컨테이너를 떠올리셔도 됩니다. 그러면 하나의 예시를 들려드리겠습니다.

컨테이너 안에는 여러가지 물건들이 존재합니다. 예를 들어 A컨테이너 안에는 낚시 용품들이 가득 차있다고 해볼까요?
우리는 이 컨테이너만 있으면 낚시를 할 수 있습니다! 그것도 부족함 없이 말이죠.

이 컨테이너를 바리바리 싸들고 우리는 낚시를 하러 갔습니다. 낚시가 끝났네요!
얼른 짐을 다시 싣고 정리해야겠습니다.

이 컨테이너를 다른 사람들이 사용한다면 제가 즐겼던 낚시를 그대로 즐길 수 있을 것입니다.
또한 이 컨테이너에는 다양한 낚시 용품도 추가로 집어넣을 수 있지만, 이후에는 자체적으로 보관되거나 격리될 것입니다!

이 낚시 용품 컨테이너는 앞으로 다른 컨테이너의 상품과 섞이지도 않을 것입니다. 저만의 낚시 용품 보관소니까요.

 

여기서의 컨테이너 의미가 docker에서 사용하는 컨테이너 의미와 동일합니다. 다만, docker container는 어떤 code의 집합체 입니다. 즉, 소프트웨어 유닛 / 코드가 포함된 패키지 및 코드가 실행되는 종속성을 보관할 수 있고, docker는 해당하는 container를 가져올 수 있고 구축할 수 있습니다.

docker는 이러한 container를 구축하기 위한 도구일 뿐입니다!

docker를 사용하면 container의 지원이 최신 운영체제에 내장되어 있거나, 최소한 시작하기 쉽고 모든 최신 운영체제에 설치하여 작업할 수 있다는 것입니다. 다시 말해, 이러한 container의 생성 및 관리 프로세스를 단순화하는 도구일 뿐입니다.

그러나 왜 소프트웨어 개발에는 container라는 것이 왜 필요한 것일까요? 그게 꼭 중요한 일일까요?

다음을 예시로 들어보겠습니다.

import express from 'express';
import connectToDatabase from './helpers.mjs'

const app = express();

app.get('/', (req, res) => {
	res.send('<h2>Hi there!</h2>');
});

// 주의!
await connectToDatabase();

app.listen(3000);

다음은 Node.js의 일부분을 발췌했습니다. 물론 Node.js의 문법을 비롯한 나머지를 모르셔도 됩니다. 우리가 이 코드에서 알아야 하는것은 이 Node.js의 현재 버전은 14.3에서 실행되는 것이며, await이라는 기능을 현재 사용하고 있다는 것입니다!

즉, 14.3 버전이 아닌 그 이하의 버전에서는 실행조차 되지 않는 엉망의 코드가 되어버린다는 의미입니다. 문제는 그 버전이 로컬 환경, 개발 환경, 로컬 머신에만 설치되어 있을 수 있다는 것입니다. 하지만 서버의 일부 원격 시스템에 배포하여 전 세계가 연결할 수 있도록 하는 경우 해당 원격 시스템에서는 이전 버전의 Node.js를 가질 수 있습니다.

우리가 작성한 코드가 다른 개발 환경에서는 무용지물이 되어버리는 셈입니다!

우리가 제품 생산에서 가지고 있는 것과 똑같은 개발 환경을 가지는 것은 상당한 가치가 있으며 이것이 바로 개발 환경과 코드를 그대로 가질 수 있는 container의 역할과 그를 구축할 수 있는 docker의 중요성이라는 것입니다.

이 외에도 다른 문제들이 있을 수 있습니다.

우리는 최신버전을 사용해서 언어를 사용하고 있는데, 시스템 개발이 현재 우리보다 이전 단계의 버전을 사용하고 있어 관리하기가 쉽지 않을 때, 또는 업데이트를 굳이 하지만 종속성과 연관이 있는 코딩으로 되어있어 업데이트가 쉽지 않을 때, 마지막으로는 자신이 여러 가지 프로젝트를 진행하고 있는데 어떤 이유에서든 프로젝트간 서로 다른 버전을 사용하고 있는 프로그램이 존재할 때.. 등의 문제가 있답니다.

우리는 각 버전을 컨테이너에 보유하고, 각 프로젝트에는 그들만의 컨테이너가 존재하도록 합니다. 또한 호스트 컴퓨터가 아닌 컨테이너에 모든 것이 있기 때문에 매번마다 버전을 제거 및 설치할 필요 없이 다른 컨테이너를 시작하는 행위로 쉽게 프로젝트를 전환할 수 있습니다.

 
 

가상머신(VM)과의 비교

또한 많이 듣는 소리가 있습니다. 바로 VM과의 차이점입니다.

mac에서 가끔 페러럴즈를 활용하여 윈도우를 사용하거나, 또는 윈도우 환경에서 VM을 다운받아 다른 리눅스 환경에서 무언가를 개발하는 실습을 하신 경험이 있을까요? 그러면 이해가 더 쉬울 수 있지만 해보지 않으셨어도 됩니다.

우리가 가지고 있는 운영체제(Window, Mac, ubuntu 등) 위에 또 다른 운영체제를 입힌다는 의미입니다. 즉 컴퓨터 안에 컴퓨터라는 이야기죠. 듣기만 해도 벌써부터 무언가 무거워보이지 않으신가요? 여기서 가장 큰 문제는 매번 새로운 컴퓨터를 머신 내부에 설치해야 하고, 또는 메모리, CPU 및 하드드라이브의 공간을 낭비하게 됩니다. 또한 동일하게 복제되는 많은 것들도 존재합니다.

가령 리눅스에서만 수행가능한 A라는 일이 있다고 가정해봅시다. 우리는 윈도우 환경이라 A를 구현하기 위해서는 리눅스 전체를 설치받아야 합니다! 즉, VM으로 리눅스를 다운 받아 컴퓨터를 설치하고, 그 안에서 A를 수행한다는 점입니다. 당연히 많은 공간을 낭비하며, 호스트의 디바이스 성능이 나빠질 수도 있고, 이러한 낭비가 계속될 경우 모든 VM의 성능도 함께 저하될 것입니다.

또한 다른 곳에서 A를 실행시키기 위해서도, 똑같은 리눅스 환경을 구현하고, 동일한 방식으로 구성해야하기 때문에 까다로울 수 있습니다.

 

Flaticon Image 활용

불고기버거를 먹으려고 하는데 치즈를 추가하고 싶습니다.
A점포는 모든 것들이 기성품으로 존재하기 때문에 치즈를 단독으로 추가할 수 없습니다. 그래서 햄버거 안에 치즈버거를 넣어 먹어야만 합니다!
B점포는 치즈 단독으로 존재해 우리의 햄버거 안에 치즈만 단독으로 넣을 수 있습니다.

방금 생각난 예시인데 적절하지 않나요? A라는 일을 수행하기 위해 리눅스 운영체제를 다운받아야만 한다니.. A점포와 똑같은 상황이군요..

container를 사용하면 여전히 호스트의 운영체제는 존재하지만, 하나의 머신에 몇 대의 머신을 추가적으로 설치하지는 않습니다. 그 대신에 우리는 운영체제가 기본적으로 내재하고 있거나 컨테이너 에뮬레이트를 지원하는 내장 컨테이너를 활용합니다.

그 위에 우리는 Docker Engine을 기반으로하여 여러 container를 가동할 수 있게 됩니다. 도커 엔진은 하나의 도구에 불과하고, 여기에는 가벼운 소형 도구가 설치되어 있을 뿐이고 여러개의 container으로 분리할 수 있습니다. 여기에는 부풀려진 운영체제도, 수많은 추가 도구도 들어가지 않습니다. 작은 운영체제의 레이어가 있을 수는 있지만, VM에서 사용하는 운영체제에 비해 매우 가벼운 버전으로 존재하는 것입니다.

 

GuestOS의 유무

즉 가장 큰 차이점으로 빨간 네모에 존재하는 Guest OS -> VM에서는 운영체제의 자원 낭비로 많이 사용되는 것이 바로 docker engine 상에서는 존재하지 않는다는 것을 확인하시면 되겠습니다.

인터넷에 올라와있는 여러 사진들을 보며 정확하게 집고 넘어가시면 좋지만,
위에서 설명했다시피 흐름을 이해하고 사진을 보면 조금 더 이해하실 수 있을 것이라고 생각합니다.

다음 포스트에서는 직접 도커로 제작해보고 활용할 수 있도록 준비해보겠습니다.

* 본 포스트는 'Udemy 【한글자막】 Docker & Kubernetes: 실전 가이드 -2022년판' 강의를 참고합니다.

728x90