Welcome :っ)

Devlog/Docker

Docker란 무엇일까? 왜 사용할까?

lazy.won 2022. 12. 16. 12:20
728x90
반응형

 

 

 

 

 

 

 

간략한 개념은 알고 있었으나, 아직까지 실무에서 내가 직접 다루지 않고 있던 Docker를 이제는 회피할 수 없게 되어 미루고 미루던 도커 공부를 드디어 해보려고 한다. 개발자로서 도커를 잘 다룰 줄 알면 분명 어디엔가 도움이 될 거라 생각한다. 

 

먼저 이번 글에서는 도커의 탄생 배경과 도커의 핵심 개념들에 대해 간단히 알아보고자 한다.

 

 

 

 

Docker의 탄생 배경 🔎

일단 나의 경험상 .. 입사 초기에 회사에서 서비스 사용자수가 늘어나면서 서버를 증설하게 되었다. 그에 따라 새로운 서버에 OS와 컴파일러, 서버 세팅에 필요한 프로그램들을 설치하면서 이전에 운영 중인 서버의 환경과 완전히 동일하게 구성하는 과정에서 각종 오류를 마주하였고, 해결하는데 굉장히 힘들었던 기억이 있다. 특히 파이썬의 경우 패키지 버전에 따른 의존성 문제로 밤새 재설치만 주구장창  했던 기억도 있다... 심지어 인터넷이 안 되는 폐쇄망에서.. 진심 토하는 줄 알았다. 

 

이처럼 같은 서버에서도 운영체제부터 컴파일러, 설치된 패키지까지 휴먼이 직접 세팅하는 경우 완벽하게 동일한 서버 환경을 만드는 것은 쉽지 않다. 그리고 이러한 차이점들이 결국 장애를 일으키고 만다. 

 

 

기존 서버 관리의 문제: 복잡하고 어려운 서버 관리(서버 셋팅)

전통적인 서버 관리 방식

0. 용량 산정
0.1 서버 구매
0.2 IDC 입고
1. 유저 추가
2. 시스템 환경 변수 추가
3. 방화벽 추가
4. 네트워크 설정
5. Dependencies 추가
6. Python
7. git clone
8. 패키지 설치
9. 설정
10. DB 마이그레이션
11. 프록시 서버 설치
12. 프로그램 run

 

기존에는 위와 같은 복잡한 단계를 거쳐야만 프로그램이 실행되었는데, 다양한 이유로 인해 버전 업데이트나 회사의 언어 정책 변경, 클라우드의 변경 등의 서버 환경이 지속적으로 변경될 수 있어 기존의 서버 환경은 관리하기에 매우 복잡하다는 문제가 있었다. 위에서 말했듯 서버 환경이 변경되면 개발 환경 셋팅을 다시 하는 과정에서 발생하는 문제들이 많았다. 쉽게 설치가 되면 다행이지만 설치 과정에서 한 번에 잘 되는 경우는 거의 못 봤다..

 

 

 

 

서버 관리 방식의 변화와 도커의 등장

위와 같은 자체 서버 운영에 대한 어려움과 문제점 때문에 서버를 보다 안정적이고 용이하게 변경하기 위해 서버 환경을 관리하는 방식이 아래와 같이 발전하게 되었다. 

 

문서화

예전에는 문서로 서버 운영 방법을 기록했다. 시간이 지나면서 문서의 정확성과 서버 업데이트 관련 이력을 관리하기 힘들어지는 문제가 발생했고, 이런 문제점을 해결하기 위해 상태 관리 도구가 등장했다. 

 

상태 관리 도구 (인프라를 코드로 관리)

서버 상태를 기술한 코드 파일로 서버의 상태를 관리하는 방식이다. 프로그램이 참조하는 설정 파일 및 서버 상태를 모아서 파일로 한 번에 기술하여 빠르고, 비용 및 리스크가 절감될 뿐만 아니라 서버 상태를 재현하는 것도 용이해졌다.

하지만 러닝 커브가 높고, 한 서버에서 다른 버전 여러 개를 설치하는 게 어렵다는 단점이 존재했다. 

 

가상 머신

물리적인 머신을 가상화시켜 가상의 머신을 구성하는 방식이다. 물리적 머신 위에 OS를 설치하고, OS 위에 Hyper-v 설치, 그 위에 여러 다른 OS들을 설치하고 각각 설치된 OS 마다 다양한 실행환경을 돌릴 수 있도록 구성되어, 독립적인 실행환경을 구성할 수 있도록 도와준다. 

가상 머신을 통해 하나의 물리 머신을 여러 대의 가상 머신으로 나누어 다양한 버전의 SW 설치가 가능해졌다. 또한 가상 머신을 이미지 형태로 저장할 수 있기 때문에 이미지 기반으로 동일한 상태를 가진 서버 구축이 가능해졌다. (이를 변하지 않는 인프라로 Immutable Infrastructure라고 한다. )

가상 머신은 한 서버에 여러 개 설치가 쉽고, 현재 상태를 스냅샷으로 저장할 수 있다는 장점이 있으나, 처음부터 셋팅하는 방법이나 이미지 공유를 하기 힘들었고, 결정적으로 무겁고 너무 느렸다. (뒤에서 자세히 살펴보자.)

 

자원 격리

리눅스 가상화 기술을 사용하여 프로세스, 파일, 디렉터리를 가상으로 분리했다. CPU, Memory, I/O도 그룹별로 제한을 함으로써 속도도 빠르고 효율적인 서버 관리가 가능했지만, 이러한 기술을 익히기엔 기업에서 너무 어려웠기 때문에 구글급 회사에서만 사용했다고 한다.

 

✨ 도커의 등장

서버 관리에 대한 시행착오를 겪으면서 위의 4가지 방법들의 문제점들을 해소하기 위해 2013년 Docker가 등장하였다.

 

 

 

 

 

 

 

🐳 Docker란?

Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해 준다. 

즉, Docker만 설치되어 있다면, OS와 CPU에 상관없이 컨테이너를 사용할 수 있다. 다시 말해, 백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립 PC, AWS, Azure, Google cloud 등 어디에서든 실행할 수 있다.

 

 

Container

Container란 가상화 기술 중 하나로, OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어진다.

 

💡 가상화를 사용하는 이유?
안정성을 높이며 리소스도 최대한 활용할 수 있는 방법으로 컴퓨터 성능을 더욱 효율적으로 사용하기 위해서 가상화를 사용한다. 대표적인 가상화 플랫폼으로 OS를 가상화하는 가상 머신(VM)이 있다. 

 

 

VM 가상화 플랫폼 vs Docker 가상화 플랫폼

먼저, 기존 가상화 방식과 컨테이너 기반 가상화 방식의 차이를 알아야 할 필요가 있다. 

가상머신과 도커

 

기존 가상화 방식은 주로 OS를 가상화하였다. 호스트 OS에서 구동되며 그 바탕이 되는 하드웨어에 가상으로 액세스 하는 Linux, Windows 등의 게스트 OS를 의미한다. 우리에게 익숙한 VMware나 VirtualBox 같은 가상 머신은 호스트 OS 위에 게스트 OS 전체를 가상화하여 사용하는 방식이다. 즉, 가상 머신은 하드웨어 스택을 가상화한다. 

Host OS 위에 가상화를 시키기 위한 Hypervisor엔진 그리고 그 위에 Guest OS를 올려 사용한다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽히 Host와 분리된다고 봐도 무방하다. 

이 방식은 한 서버에 여러 가지 OS를 가상화(리눅스에서 윈도우를 돌린다던가)하여 비교적 사용법이 간단하며 Host OS와 완전히 분리된다는 장점이 있지만, OS 위에 OS를 올리기 때문에 무겁고 느리다. 

 

 

컨테이너 기반 가상화 방식은 VM과 달리 운영체제 수준에서 가상화(프로세스를 격리하는 방식)를 실시하여 다수의 컨테이너를 OS 커널에서 직접 구동한다.

위 그림을 보면 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 된다. 따라서 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진 위에서 바로 동작하며 Host의 커널을 공유한다. 커널을 공유하기 때문에 I/O 처리가 쉽게 되어 성능의 효율을 높일 수 있다. 

즉, 컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라, Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것이다. 

이로 인해 VM에 비해 훨씬 가볍고 운영체제 커널을 공유하며, 시작이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 훨씬 적게 차지한다는 장점이 있다.

 

 

둘 다 각자 장단점이 있기 때문에 어떤 것이 더 뛰어나다고 할 수는 없다. 

기존 OS 가상화는 컨테이너 기반 가상화보다 더 높은 격리 레벨을 지원하여 보안적인 측면에서 더 유리하다. 또한 OS 가상화의 커널을 공유하지 않는 만큼 멀티 OS가 가능하다는 장점이 있다. (커널을 공유하지 않아 멀티 OS가 불가능하다는 것은 Linux위에 Window를 올릴 수 없다는 것.) 

 

그럼에도 Docker를 사용하는 이유성능 향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성 때문이다. 

 

 

 

Docker Image

도커에서 가장 중요한 핵심 개념은 위에서 본 컨테이너와 이미지라는 개념이다.

Docker Image는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로, 상태 값을 가지지 않고 변하지 않는다(Immutable). 즉, 컨테이너를 실행할 수 있는 실행파일과 설정 값들을 갖고 있는 것이라 생각하면 된다. 

이미지를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작하게 되는 것이다. 

컨테이너는 이미지를 실행한 상태라고 볼 수 있고, 추가되거나 변하는 값은 컨테이너에 저장된다. 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있고 컨테이너 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있다. 

 

 

레이어 저장 방식

이미지가 만들어지는 과정에 대해 알아보자.

Docker Layer

도커 이미지는 컨테이너를 실행하기 위한 모든 정보를 갖고 있어 보통 용량이 수백MB에 이른다. 처음 이미지를 다운로드할 때는 크게 부담이 안되지만 기존 이미지에 파일 하나 추가했다고 수백Mb를 다시 다운로드한다면 매우 비효율적일 수밖에 없다.

 

도커는 이 문제를 해결하기 위해  레이어(Layer)라는 개념을 사용하여 여러 개의 레이어를 하나의 파일 시스템으로 사용할 수 있게 해 주었다. 

이미지는 여러 개의 읽기 전용 read only 레이어로 구성되고 파일이 추가되거나 수정되면 새로운 레이어가 생성된다.

위 그림처럼 ubuntu 이미지가 A + B + C의 집합이라면, ubuntu 이미지를 베이스로 만든 nginx 이미지는 A + B + C + nginx 가 된다. 마찬가지로 webapp 이미지를 nginx 이미지 기반으로 만들었다면 A + B + C + nginx + source 레이어로 구성된다. 만약 webapp 소스를 수정하면 A, B, C, nginx 레이어를 제외한 새로운 source_v2 레이어만 다운로드하면 되기 때문에 굉장히 효율적으로 이미지를 관리할 수 있다.

 

컨테이너를 생성할 때도 레이어 방식을 사용하여 기존의 이미지 레이어 위에 읽기/쓰기 read-write 레이어를 추가한다. 이미지 레이어를 그대로 사용하면서 컨테이너가 실행 중에 생성하는 파일이나 변경된 내용은 읽기/쓰기 레이어에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용한다. 

 

 

Dockerfile

도커는 이미지를 만들기 위해 Dockerfile이라는 파일 자체에 DSL(Domain-specific Language) 언어를 이용하여 이미지 생성 과정을 적는다. 

서버에 어떤 프로그램을 설치하려고 이것저것 의존성 패키지를 설치하고 설정 파일을 만드는 과정을 더 이상 블로깅하거나 메모장에 적지 않고 Dockerfile로 관리하면 된다. 이 파일은 소스와 함께 버전 관리되며, 원한다면 누구나 이미지 생성 과정을 보고 수정할 수 있다. 

 

 

Docker Hub

도커는 Docker Hub를 통해 공개 이미지를 무료로 관리해 준다. Docker Hub를 이용하면 손쉽게 이미지를 pull 받아 컨테이너에 적용시킬 수 있다. 

 

 

 

 

 

 

 

 

 

 

 

참고

https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html

 

초보를 위한 도커 안내서 - 도커란 무엇인가?

도커를 처음 접하는 시스템 관리자나 서버 개발자를 대상으로 도커 전반에 대해 얕고 넓은 지식을 담고 있습니다. 도커가 등장한 배경과 도커의 역사, 그리고 도커의 핵심 개념인 컨테이너와 이

subicura.com

https://han-py.tistory.com/494

 

도커(Docker) 기초 정리

도커란 개발 시 application을 쉽고 빠르게 구축, 공유 및 실행할 수 있는 소프트웨어이다. 만약 프로젝트 시작 시, 환경설정부터 기본 세팅을 해야 한다. 하지만 도커를 사용하면 프로젝트마다 반

han-py.tistory.com

https://velog.io/@sa1341/Docker-%EB%93%B1%EC%9E%A5-%EB%B0%B0%EA%B2%BD-%EB%B0%8F-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC

 

Docker 등장 배경 및 명령어 정리

도커는 어떠한 프로그램도 컨테이너로 만들 수 있고 어디서든 돌아갑니다.가상머신과의 차이점은 가상머신처럼 독립적으로 실행되지만, 더 빠르고 더 쉽고, 더 효율적입니다.예전에는 서버를

velog.io

https://wooody92.github.io/docker/Docker-%EB%8F%84%EC%BB%A4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80/

 

Docker - 도커란 무엇인가

도커, 도커를 사용하는 이유, 도커의 특징 이해

wooody92.github.io

https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/

 

[Docker] 개념 정리 및 사용방법까지.

 

cultivo-hy.github.io

https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90

 

[Docker] Docker의 개념 및 핵심 설명

Docker란 Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼이다.현재 Docker 0.9버전 부터는 직접 개발한 libcontainer 컨테이너를 사용하고 있다. 가상화를 사용하는 이유는?이제

khj93.tistory.com

 

320x100
반응형

'Devlog > Docker' 카테고리의 다른 글

Docker 기본 명령어 정리  (0) 2022.12.20