개발/개발 이모저모

docker란 도대체 무엇이고 왜 사용할까?

키드 뮤지션 2023. 6. 22. 15:07

 

docker란 무엇인가?

챗쥐한테 물어보니깐 이렇게 답한다.

 

Docker는 컨테이너 기반의 오픈 소스 가상화 플랫폼입니다.  컨테이너는 소프트웨어를 패키징하고 실행하는 데 필요한 모든 것을 포함하는 완전한 파일 시스템을 제공합니다. Docker는 이러한 컨테이너를 만들고 관리하는 도구 세트를 제공하여 애플리케이션의 이식성, 확장성 및 격리를 향상시킵니다. 찍찍!

 

핵심단어를 뽑아보면 다음과 같다. 

컨테이너

가상화

이식성

확장성

 

그럼 이 4가지 단어를 알면 docker를 이해할수 있는거다.

그럼 하나씩 알아보자.

 

컨테이너

컨테이너는 기술적으로 어플리케이션을 실행하는데 필요한 코드, 라이브러리, 환경 변수, 설정 등을 하나의 패키지로 묶은 격리된 단위를 의미한다.

 

예를 들면

const http = require('http');

const hostname = '0.0.0.0';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello, Docker!\n');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

 

 

3000port에 요청하면 'hello,docker'  실행하는 간단한 코드이다. 

이를 실행시키기 위해선 무엇을 해야할까?

 

1. nodejs를 설치한다.

2. npm install로 관련 dependency를 설치한다.(사실 이코드는 외부 dependency가 없지만

3.{hostname},  {port}이라는 환경변수를 설정한다. 

4. 그리고 실행한다.

 

이래야 우리는 'hello,docker'라는 글자를 볼수 있게된다.

 

우리는 위와 같은 작업을  window 서버에서 실행할수 있다. 

이걸 우리는 리눅스 서버에서 실행할수도 있다.

centos에서 실행할수도 있다.

ubuntu에서 실행할수도 있다.

 

환경이 다르기 때문에 각기 다른 명령어로 실행해야만 한다. 

그래서 docker는 container를 제공한다.

 

각 운영체제에 docker를 설치하고 다음과 같은 dockerfile을 실행시키면 되는거다.

# Node.js를 기반으로 하는 공식 Node 이미지를 사용합니다.
FROM node:14

# 앱의 소스 코드를 컨테이너 내부로 복사합니다.
WORKDIR /usr/src/app
COPY app.js .

# 앱의 종속성을 설치합니다.
RUN npm init -y
RUN npm install

# 컨테이너가 시작될 때 실행할 명령을 지정합니다.
CMD [ "node", "app.js" ]

 

 

즉 컨테이너는 어플리케이션의 실행 환경에 대한 걱정 없이, 다양한 환경에서 안정적으로 어플리케이션을 실행할 수 있게 해준다.

 

가상화

그럼 가상화란 무엇일까?

위에서 우리는 운영체제위에 docker를 설치했다. 그리고  docker위에서 서비스가 실행되게 만들었다.

 

서비스가 실행되려면 운영체제의 cpu 메모리 그리고 네트워크 리소스들을 사용해야만 한다.

이를 사용할수 있게 도와주는게 바로 가상화이다.

위에 보면 hostos위에 docker Engine 있는데 바로 docker engine이 가상화를 도와준다.

 

이식성

사실 아까 이야기 했던 내용이다. 

다시 아까 작성했던 dockerfile을 보자.

# Node.js를 기반으로 하는 공식 Node 이미지를 사용합니다.
FROM node:14

# 앱의 소스 코드를 컨테이너 내부로 복사합니다.
WORKDIR /usr/src/app
COPY app.js .

# 앱의 종속성을 설치합니다.
RUN npm init -y
RUN npm install

# 컨테이너가 시작될 때 실행할 명령을 지정합니다.
CMD [ "node", "app.js" ]

 

 

nodejs를 설치하고

npm install을 하고

app을 실행을한다.

 

 

이 dockerfile만 있으면 윈도우이든, 리눅스이든, centos이든 어떤 운영체제에서도 서비스를 실행시킬수 있다.

단, docker engine이 설치되어 있을떄만

 

이를 컨테이너의 "불변성"이라 하고, 결국 어느 운영체제든 이식이 가능하게 만든다.

 

확장성

그럼 확장성이란 무엇일까?

이건 좀 어려운 개념을수 있다.

서버개발을 어느정도 이해하고 있어야만 한다.

이해가 안되면 여러번 읽어보길 권장한다.

 

Docker의 확장성은 어플리케이션의 사용자 수나 데이터 증가에 따라 시스템의 용량을 쉽게 늘릴 수 있는 능력을 말한다.

 

이게 무슨뜻이냐 하면

서버에 앱을 배포했는데 갑자기 사용자가 많아 졌다고 해보자. 그러면 앱을 추가 배포해야만 한다. 그러기 위해선

 

1. ec2를 셋팅한다.

2. docker를 설치한다.

3. nodejs를 설치한다.

4. npm install로 관련 dependency를 설치한다.

5.{hostname},  {port}이라는 환경변수를 설정한다. 

6. 그리고 실행한다.

 

이 과정을 반복해야만 한다. 물론 CI/CD를 통해서 할수있다.

docker는 dockerfile을 통해서 3~6과정을 생략하게 해준다.

그리고 여기에 더해서

1~2과정까지 단순화 시키는 도구들이 등장한다.

 

kubernetes

ECS

등등...

 

 

들어봤을수도 있고 못들어봤을수도 있다.

오늘 주제에서는 많이 벗어나기 떄문에 추가 설명은 생략한다.

다만 위 도구들은 배포 및 앱의 확장을 쉽게 도와준다.

한번 검색해보길 바란다.