Devops/docker

[Docker] #1 도커란 무엇인가

거북이주인장 2022. 11. 9. 14:59

인프런 subicura님의 도커 기초 강의를 듣고 정리한 내용임을 미리 밝혀둡니다.


정리 배경


최근에 팀에서 생성하는 파이썬 프로세스를 도커 이미지로 띄우는 작업을 할당 받았다. 원래는 서버 내부에 multiprocessing.Process 모듈을 이용해서 프로세스를 생성했는데 몇몇 프로세스가 정상적으로 terminate되지 않고 계속 증식을 하면서 서버의 메모리를 전부 잡아먹어버리는 사건이 발생했었다. 이런 배경에서 프로세스를 도커 컨테이너로 띄우고 쿠버네티스를 이용해서 자원 할당을 유연하게 하자! 라는 의견이 나왔고 프로세스의 컨테이너화가 실행되었다.

도커란 무엇일까


Docker is a platform desinged to help developers build, share, and run modern applications

도커 공식 문서에 의하면, 도커란 개발자들이 현대 어플리케이션을 만들고 공유하고 실행하는데 도움을 주는 플랫폼이다. 역으로, 이전에는 개발자들이 어플리케이션을 만들고 공유하고 실행하는데 어려움이 있었기 때문에 도커가 나왔음을 생각해볼 수 있다. 도커가 나온 배경에 대해서는 바로 다음에 살펴보고, 도커에 대해서 조금 더 살펴보자.

도커는 컨테이너 기반

Use containers to build, share and run your applications

https://www.docker.com/resources/what-container/

 

What is a Container? - Docker

A container is a unit of software that packages code and its dependencies so the application runs quickly and reliably across computing environments.

www.docker.com

도커 공식 문서에는 containers을 사용해서 어플리케이션을 만들고 공유하고 실행하라고 나와 있다. 그럼 컨테이너는 무엇을 의미할까?

A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another

컨테이너란, 어느 환경에 국한되지 않고 다른 환경에도 빠르게 어플리케이션을 실행할수 있는 일종의 소프트웨어 단위이고 이 안에는 코드와 모든 의존성이 같이 묶여있다.

컨테이너 이미지

컨테이너는 컨테이너 이미지로부터 만들어진다. 그럼 컨테이너 이미지는 무엇일까?

A docker container image is a lightweight, standalone, executable package of software that includes everything needed to run an application: code, runtime, system tools, system libraries and settings

컨테이너 이미지는 컨테이너를 생성하기 위한 소프트웨어로, 컨테이너 이미지 자체가 실행되는 것은 아니다.

  • lightweight: 컨테이너는 기계의 OS을 공유하기 때문에 어플리케이션 개별로 OS를 요구하지 않아서 효율적이다.
  • standard: portable하고 어디서든 실행 가능하다.
  • standalone: 모든 의존성을 하나의 컨테이너에 포함시키기 때문에 컨테이너 이외의 것으로부터 독립적이다.
  • executable: 컨테이너 이미지는 실행가능하다. 실행하면 컨테이너가 만들어진다.

다 좋은데, 도커 왜나왔지?


논문을 읽다보면, 대부분 서두에는 이 논문의 motivation에 대해서 말한다. 이 논문이 왜 나왔고, 이전 방법에는 어떤 한계가 있어서 그 한계에 대한 해결책을 이 논문이 들고왔다는 식이다.

그럼 비슷하게, 도커도 새로운 기술이니까 그 이전 방식들에서 사람들이 어떤 불편을 느꼈는지, 어떤 한계가 있었는지, 그 가려워하는 부분을 도커가 어떻게 긁어줬는지 알아볼 필요가 있다. 그래야 도커를 쓰는 motivation을 얻을 수 있기 때문이다.

서버 관리는 복잡하다.

subicura님 강의에서 나온 그림

영사기 하나를 돌리는데 무진장 많은 뒷단 노력이 들어가는게 서버 관리이다. 저 중에 하나라도 잘못 된다면? 작은 결함이 생긴다면 그 결함이 어디서, 왜 일어났는지 봐야할텐데 저렇게 복잡한 구조에서는 원인 규명을 하기가 힘들 것이다.

다양한 기술이 빠르게 등장하고 그것들을 빠르게 적용할 필요가 있다.

다양한 프로그래밍 언어가 있고, 목적에 따라 개발 언어가 달라질 수 있다. 이 프로그램들을 안정적으로 실행하기 위해서는 어떤 것이 필요할까? 게다가 서버 환경 또한 바뀔 수 있다. aws, azure, google cloud 등, 환경이 계속 달라진다면 기존 환경에 맞춰서 개발했던 내용을 바꿔야하는 불필요한 비용이 발생할 수 있다.

전통적인 서버 관리 방식

출처: subicura님 강의

전통적인 서버 관리 방식은 한땀한땀 단계를 추가해서 마지막이 되어서야 프로그램을 실행할 수 있다. 중간에 하나라도 잘못되면 골치아픈 것이다.

출처: subicura님 강의

뿐만 아니라 어떤 패키지의 버전을 업데이트 해야하는 상황이 발생할 수도 있다. 그러면 이 버전 변경이 다른 것들에 어떤 영향을 미칠지는.. 짐작하는 수밖에 없다.

도커의 등장 배경

도커는 결국 이런 불편한 점을 해소해주기 위해 나왔다. 다시 말하면, 서버를 문제없이 관리하고 운영하기 위한 노력 중 하나라고 보면 된다. 서버를 잘 관리하기 위한 노력은 도커 이전에도 쭉 있었는데, 이에 대해서 알아보자.

서버를 문제없이 관리하기 위한 노력들


1. 문서화

코드가 아닌, docs이다. 초반에는 문서로 정리를 했다고 한다.

몇가지 단점이 있는데, 문서로 정리를 하니 누가 언제, 무엇을 수정했는지 명확하게 남지 않는다. 또한 똑같이 했는에 외않되?라는 말이 자주 나올 수 있다.

2. 상태관리 도구

코드로 상태를 관리하는 방법이다. yml 파일로 상태를 정의한다. 코드로 관리를 하니 vcs를 이용해서 버전 관리도 되고 문서로 하는 것보다는 여러 이점이 있으나 OS별로 다른 언어를 써야 하기 때문에 어렵다고 한다. 또한 하나의 서버에 여러 버전을 관리하는 것이 쉽지 않다.

출처: subicura님 강의

3. 가상머신

좀 더 쉽게 서버를 관리하고 싶은 니즈 때문에 가상머신이 등장했다. vm별로 환경이 분리되고 한 서버 내에서 여러 버전을 동시에 설치하기도 쉽다.

근데 vm을 완성하기까지 그 과정이 코드로 남아있지 않는 문제가 있다. 따라서 이 vm이 어떻게 만들어졌는지 그 과정을 정확히 알기가 어렵다. 그리고 굉장히 느리다. (vm과 컨테이너의 비교는 다음에)

4. 자원격리

리눅스 기능을 이용해서 빠르고 효율적으로 서버를 관리하고자 하는 방법이다. 일종의 벽을 쳐서 그룹별로 file system, cpu/memory/io 등을 분리하는 기술인데 어려워서 보편적으로 사용하지는 않았다.

5. 도커의 등장

복잡한 자원격리 기술을 사용하기 쉽게 만들어줬다.

도커가 등장함으로써, 모든 프로그램들이 컨테이너화 되었다.

출처: subicura님 강의

어떤 프로그램이든, 서로 다른 프로그램을 컨테이너로 만들어서 독자적으로 실행할 수 있다.

또한, 만든 컨테이너를 어떤 환경에서도 실행할 수 있다.

Reference