국문과 유목민

[Docker] Docker를 쉽게 알아보자 (Docker 에피타이저) 본문

기술 견문록/MLOps

[Docker] Docker를 쉽게 알아보자 (Docker 에피타이저)

논곰 2024. 10. 25. 23:01
처음 AI를 공부할 때, 데이터를 다루는 방법이나 AI 기술에 대한 이해만 있으면 될 줄 알았다. 그러나 실제 현업에서 일을 해보니 알아야 되는 기술은 많았고, 길바닥 출신이었던 나는 막연한 두려움을 가졌던 것 같다. 그러나 막상 기술들을 실제 사용해보면 두려움과 어려움은 잠시뿐이고, 오히려 편리함을 주는 기술들이 많았다. 그래서 이러한 기술들에 대해 막연한 두려움을 해결할 수 있게 도움을 줄 수 있는 글이 있으면 좋지 않을까 생각했고 이번 글또를 통해 정리해보고자 한다. 그래서 전문적인 부분보다는 해당 기술들이 왜 필요한 지를 위주로 설명을 해보고자 한다.

Docker가 뭔가요? (What)

우선 처음 Docker를 접한다고 생각하고 Docker를 구글에 검색해봅니다. 그러면, 가장 처음 등장하는 '위키백과'의 설명을 보면 Docker에 대해 다음과 같이 써있습니다.

도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다. 도커 웹 페이지의 기능을 인용하면 다음과 같다: 도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 위키백과

솔직히 이것만 보고 '아 Docker는 되게 좋은 서비스구나 완벽히 이해했어'라고 이해했다면...그 머리가 조금은 부러울 지도 모르겠다. 사실 나는 이 글만 보고는 왜 써야 하는 지 명확히 이해가 가지 않았다. 특히 당시 개발이라고는 python으로 jupyter notebook 위에서 하는 게 전부였기에 왜 Docker를 써야하는지 몰랐고, 그나마 기술면접에서 나온다고 해서 암기하는 게 전부였다. 

Google 검색 결과

그러나 AI 서비스를 만들며서, 실제 사용자들이 사용을 할 수 있게 만들기 위해서는 '서빙'이 필요하다는 것을 알았고, Docker는 '서빙' 단계에서 겪을 수 있는 다양한 문제점을 사용자가 느끼지도 못하게 미리 해결해주는 좋은 도구였다. 

정리해보면
- Docker는 우리가 만든 AI 모델(서비스)을 다른 사용자들에게 제공하기 위해 '서빙'하는 과정에 도움을 주는 기술이다. 

Docker를 왜 쓰는데요?

 그렇다면 '서빙'에서 도움을 준다는 것까지는 이해했다고 치고, 왜 도움이 되는 지를 얘기해보자. 그 전에 처음 AI를 공부하는 분들이라면 간단하게 서빙의 필요성에 대해 얘기하겠다 (알고 있다면 다음 단락으로 넘어가자).
 만약, 처음 AI를 공부하시는 분들이라면 아직은 '서빙'은 큰 고려사항이 아닐 수 있다. 지금 당장 데이터 전처리하고, 모델 학습하면 끝이라고 생각할 수 있다 (그 당시 나처럼...). 그러나 조금 더 생각해보면 AI 서비스를 만든다고 생각했을 때, 최종적인 목표는 사용자들에게 제공됨으로써 편의를 개선하는 것이 목표일 것이다. 만약, 전국민들이 겪는 어려움을 해결할 수 있는 모델을 개발했다고 하더라도, 사용자들이 쓸 수 없으면 결국 의미가 없다고 생각한다. 그렇기에 결국 '서빙'은 AI를 활용한 서비스가 의미를 갖게 되는 마지막 단계이다.

 그래서 이제부터 한 가지 상황을 가정해 Docker에 대해 알아보고자 한다. 이제부터 우리는 개인 프로젝트를 진행하면서 기깔나는 AI모델을 만들었고 서비스를 만들고 싶다. 그러기 위해서는 '서빙'을 해야 하는데, '서빙'을 위해서는 '서버'를 구축해야 하한다. 우리는 다음과 같이 Data, Model, API와 관련된 서버를 구성해야 한다고 판단을 했다.

서빙: 모델이나 애플리케이션을 사용자가 요청할 때마다 응답할 수 있도록 배포하고 제공하는 과정입니다.
서버: 사용자(클라이언트)로부터 요청을 받아 처리하고 응답을 보내는 역할을 하는 컴퓨터나 프로그램입니다.

 

 서버를 운영하는 비용이 1대 당 10만원이라고 가정하면, 서버 3대를 운영하고자 하니 30만원이 든다. 그런데 서버의 자원을 보니까 실제 30%만 사용할 것 같다. 한 대만 운영하면 비용을 3배로 줄일 수 있을 것 같은데, 3개의 서비스는 서로 의존성 문제 (패키지나 OS 등)가 있어 환경이 분리가 되어 있어야 한다는 제약조건이 있다. 이때 이러한 문제를 해결하고자 할 수 있도록 도와주는 게 '컨테이너'라는 기술이다. '컨테이너'는 하나의 서버에서 여러 서비스가 서빙 될 때, 각 서비스가 환경을 분리가 된 것처럼 생각할 수 있게 해준다. 그래서 우리는 다음과 같이 1대의 서버에 여러 서비스를 올려 10만원으로 서빙할 수 있다. 이를 통해 하나의 서버 자원을 탈탈 써서 비용적인 문제를 해결할 수 있다.
(물론, 이렇게 서버 자원을 탈탈 쓰는 것은 안정성 면에서 좋지 않을 수 있다...) 

이제 진짜 서비스 배포를 위해, MAC OS를 사용하는 내 컴퓨터(Local) 환경에서 API를 만들고 이제 서버에 올리고자 한다. 그런데, API를 올리려고 보니까 서버가 Linux OS를 쓰고 있기 때문에 OS 환경이 맞지 않아 에러를 발생시켰다. 하지만, '컨테이너'를 사용한다면 서비스를 Local에서 테스트한 환경 그대로 서버에서도 올릴 수 있다. 이를 통해 OS가 달라서 발생하는 의존성 문제도 해결할 수 있다.

 위에서 서빙 과정에서 '컨테이너'를 사용해 비용적인 문제나 의존성 문제를 해결할 수 있다고 이해했는데, 그러면 Docker는 언제 나오냐 할 것 같다. Docker는 바로 이런 '컨테이너'를 편하게 사용할 수 있게 도와주는 플랫폼이다.

정리해보면
- 모든 서비스는 서빙이 되어 사용자가 쓸 수 있어야 의미가 생긴다.
- 서빙을 위해 서버를 운영하며 겪을 수 있는 비용 문제나 의존성 문제를 '컨테이너'로 해결할 수 있다
- 이러한 컨테이너를 편하게 사용할 수 있게 도와주는 플랫이 Docker다. 

Docker를 어떻게 쓰는데요?

 Docker를 왜 쓰는 지 어느정도 이해했다면 이제 사용을 해보고 싶을 것이다. 그러나 어떤 식으로 사용하는지 모른다면 어디서부터 시작해야 조금은 어려울 수 있다. 그래서 간단하게 Docker를 사용함에 있어서 알아야 하는 기본적인 3단계의 과정만 짚어보겟다. Docker를 사용해서 컨테이너를 사용하고자 한하면 크게는 3단계만 이해하면 된다. (일단, Docker를 설치하는 것은 0단계로 생각하겠다)

 Docker를 사용하기 위해서는 'DockerFile 생성', '이미지 빌드', '컨테이너 배포'가 필요하다. DockerFile은 Docker '이미지'를 만들기 위해 작성하는 '명세서'라고 할 수 있다.  FROM, WORKDIR, RUN, ENTRYPOINT, ARG 등의 변수와 함께 작성된 파일로 Docker는 이미지를 만들 때 이를 참고해, '어떤 OS를 쓰고, 어떤 코드를 쓰고, 어떻게 실행하겠다'라고 이미지를 만든다. 이 파일을 통해 Docker '이미지'를 만드는 과정을 '빌드(build)'한다고 한다. 

 이렇게 만들어진 Docker '이미지'에는 서비스 배포에 필요한 OS, 코드, 라이브러리, 실행방법 등에 대한 정보가 포함되어 있다. 그러면 우리는 이 '이미지'를 가져다가 컨테이너를 '실행(run)' 시키면 Docker를 사용해 컨테이너를 배포할 수 있다. '생각보다 별 거 없네?'라는 생각을 할 수 있는데, 이 과정에서 여러가지 메모리,네트워크, 환경 설정 요소들을 추가해지면 복잡해질 수는 있다. 다만, 가장 기초적인 사용법은 간단한 게 맞다.

 추가적으로, 이러한 Docker '이미지'는 다른 사람이 만든 것을 갖다가 쓸 수 도 있는데, Docker Hub와 같은 곳에서 다른 사람들이 올린 이미지들을 확인할 수 있다. 이런 Docker Hub와 같은 곳을 '레지스트리 (Registry)'라고 한다. 

정리해보면
- Docker를 사용하기 위해서는 3단계만 기억하면 된다.
- Docker 컨테이너를 만들기 위해, 이미지를 만들어야 하고, 이미지를 만들기 위해 DockerFile을 작성헤야 한다. 
- 다른 사람들이 만든 이미지를 활용할 수 있게 모여 있는 곳이 있는데, 이를 '레지스트리'라고 한다.

정리

간단하게 Docker에 대해서 정리해보고자 했는데 이해가 됐으면 좋겠다. 지금은 Docker를 꽤 자주 또 유용하게 사용하지만, 처음에는 Docker를 사용하기 전에는 막연한 두려움이 있었고 접근하기 어렵다는 생각이 있었다. 그때 왜 그렇게 어려웠나 생각해보면, 개발자로서 당연히 알아야 하는 것이라고 듣기는 했지만, 왜 사용해야 하는 지나 어떻게 사용해야 하는 지에 사용하기 전까지 몰랐던 것 같다. 그래서 Docke를 처음 접하는 분들의 허들이 조금은 낮아졌으면 하는 마음에서 작성해봤다. 

 Docker를 조금 더 깊게 이해하기 위해서는 조금은 먼 곳(OS나 VM, 하이퍼바이저 등)에서부터 시작해야 할 수 있다.그러나 일단은 '지금의 나에게 왜 좋고, 왜 알아야 하는 지'를 먼저 이해하고 접할 수 있다면, 먼 곳에서 출발하는 그 과정이 조금은 수월하지 않을까 생각한다. 단순히 그런 먼 과정이 이해가 되지 않아서, 사용하지 않겠다고 하기에 Docker는 내가 만든 서비스가 가지게 될 가능성의 크기를 넓혀줄 수 있는 좋은 도구라고 생각한다. 
(위에 작성한 설명이 부족한 부분이나 오해의 소지가 있는 부분이 있다면 편하게 댓글 남겨주시기 바랍니다)

Comments