본문 바로가기

Dev. Back-End/Docker

[Docker] 도커를 사용해야하는 이유와 중요성

 

 

 

 

저는 도커를 사용하기전에 VMware를 통해 가상서버를 이용하였습니다.

도커를 사용해보면서 아직도 배우고 있고 알아가고 있는 단계이지만, 확실한건 정말 편하다는 것입니다.

예를들면 VMware, Virtual Box와 같은 서버를 세팅할때 버전문제부터 무겁기때문에 렉도 많이 걸리는 현상, 세팅하는데에 많은 시간비용이 발생했었습니다.

프레임워크나 언어와 같은 버전 업을 할 경우에 문제가 발생하여 해결하는데에도 시간이 많이 소모되었습니다.

즉, 도커에 대해 제가 개인적으로 느끼고 공부한 내용을 적어보려합니다. 


● 왜 도커를 써야 하죠?

컨테이너는 애플리케이션을 환경에 구애받지 않고 실행하는 기술입니다.예를들어 우분투 OS를 설치하려해도 도커는 명령어로 실행하면 어느 환경이든 상관 없이 다음 명령어를 사용하여 실행할 수 있습니다. 
서버 제작과정에 견고함과 유연성, 편리함이 좋고 다른 사람이 만든 서버를 소프트웨어 사용하듯이 바로 가져다가 사용할수 있는 장점이 있습니다. 또한 여러 대에 배포할 수 있는 확장성을 지녔습니다.

 

 

 운영하면서 만들어지는 눈송이 서버들(Snowflake Servers)

서버를 운영할때 많은 문제가 발생하여 오랜시간 잡고있는 경우가 많았습니다.

이는 서버를 다루는 기술과 별개로, 각 서버마다 운영 기록이 다르기 때문이었습니다.

똑같은 일을 하는 2개의 서버가 있다고 해도 A서버는 한달 전에 구성했고 B서버는 오늘 구성했다면 운영체제부터 컴파일러, 설치된 패키지, 언어, 프레임워크 등등 모두 완벽하게 같기에는 쉽지 않습니다.

그리고 이러한 차이점들이 장애를 일으키게되고 많은 시간이 소요됩니다.

예를들어 A서버는 잘되는데 B서버는 죽는 현상이 발생하고 같은 일이 벌어지게 됩니다.

이렇게 서로 모양이 다른 서버들이 존재하는 상황을 눈송이 서버라고도 합니다.

 

 

 

 

 

A서버와 B서버에 "사과"라는 도구를 설치한다고 가정합니다.

A서버는 두달전에 서버를 구성하면서 사과를 설치했고, B서버는 오늘 막 구성하여 각 서버에 웹 서비스를 업데이트하면서 배포하였습니다.

하지만, A서버에서 장애가 발생했고 여러가지의 원인을 추측할 수 있습니다.

 

1. 웹 서비스에서 사과 최신 버전에 새로 추가된 기능을 사용한 점

2. 웹 서비스의 업데이트 부분 코드에 문제가 있다

3. 사과의 버전이 2개의 서버가 다르다

4. 사과에 의존하는 라이브러리의 버전이 다르다.

 

 

서비스중이기때문에 장애 원인을 빨리 찾기 위해서는 A서버를 잘아는 사람이 필요한데 만약 퇴사를 하였거나 부재중일때 B서버를 구성한 작업자는 A서버가 구성되고 있는 운영된 모든 과정을 파악하여야합니다.

 

만약 2개의 서버 구성 시점이 몇달 차이 안나지만, 현업에서는 몇 년씩 차이나는 경우도 발생합니다.

서버 사이의 차이점이 눈송이 하나 만큼 작을지 모르지만, 서버 운영을 오랜기간하다보면 점점 커져서 집을 무너뜨리는 막대한 눈덩이가 되어있을겁니다.

 

이러한 문제점을 개선하기 위해서 다양한 방식으로 서버 운영 기록을 저장합니다.

( 서버 운영 뿐만아니라 백엔드 & 프론트엔드 개발자들도 문서화 기록은 중요합니다. )

서버에서 어떤 작업을 실행할 때마다 이를 사내 문서 도구에 기록하거나, 여러 서버에 동시 접속해서 한번에

명령을 실행하는 tmux-xpanes 같은 도구를 사용하기도 합니다.

 

tmux-xpanes / 출처 : https://www.44bits.io/ko/post/why-should-i-use-docker-container

 

하지만 문서에 적힌 대로 해봐도 안되는 경우가 발생하고 ( 시간이 흐름에 안되는 경우가 발생 ) 여러 서버를 한번에 조작할 때도 특정 서버하나만 문제가 발생하는 경우도 발생합니다.

따라서 서버의 운영 기록을 코드화하려는 다양한 시도들이 등장합니다.

 

첫번째, 베이그런트Vagrant나 셰프Chef, 퍼핏Puppet, 앤서블Ansible 등의 도구에는 모두 서버 운영 기록을 나중에도 재현하려는 의도가 담겨 있습니다.

 

두번쨰, 도커에서 사용하는 도커파일도 앞서 이야기한 서버 운영 기록을 코드화한 것입니다.

 

 

 

 

 

 

 

FROM ubuntu:14.04

RUN apt-get update &&\
apt-get -qq -y install git curl build-essential apache2 php5 libapache2-mod-php5 rcs

이 도커 파일로 docker image를 만들 수 있습니다.

도커 파일이 서버 운영 기록이라면 도커이미지는 운영 기록을 실행한 시점이라고 할 수 있습니다.

 

도커 파일 = 서버 운영 기록 코드화

도커 이미지 = 도커 파일 + 실행 시점

 

예를들어 앞서 살펴본 사과를 설치 한다고 가정합니다.

작업자는 1년 전에 이 사과 도구를 설치하여 A서버를 구성했고, 오늘 B 서버를 구성한다면

두 서버에 대해 사과가 설치된 시점은 1년의 차이가 발생합니다.

 

하지만 도커에서는 도커 파일로 이미지를 만들어 두면, 서버가 구성되는 시점이 이미지를 만든 시점으로 고정됩니다.

이 이미지를 사용해서 1년전에 A서버에 컨테이너를 배포하고, 오늘 B서버에 컨테이너를 배포한다고 해도 두 컨테이너 모두 사과가 설치된 시점은 같습니다. 

 

 

 

이것이 바로 도커가 여느 서버 구성 도구와 가장 다른 부분입니다.

다른 도구들은 모두 도구를 실행하는 시점에 서버의 상태가 결정되는데 도커는 작업자가 그 시점을 미리 정해둘 수 있기때문에 항상 어느 시점에서도 똑같은 상태로 만들 수 있습니다.

 

 

 

Ref : https://www.44bits.io/ko/post/why-should-i-use-docker-container