[개발 환경] 도커 (Docker)
도커란?
도커는 컨테이너 기반의 플랫폼이다.
화물선에 짐을 실을 때 규격화된 컨테이너 박스를 사용하면, 내용물이 자동차이든 과일이든 똑같은 방식으로 배에 싣고 내릴 수 있다.
이와 마찬가지로, 도커에서의 컨테이너는 특정 애플리케이션을 실행하는 데 필요한 모든 것들을 모은 독립적인 환경을 의미한다.
이렇게 격리된 환경을 제공하기 때문에, 다른 서버나 클라우드에서 작성한 코드라도 내 노트북에서 환경의 제약 없이 동일하게 프로그램을 실행할 수 있다.
AI 모델을 내 컴퓨터나 서버에서 직접 실행하려면 파이썬 버전 맞추기, 라이브러리 설치 등 이른바 의존성 지옥을 겪어야 한다.
흔히 ‘도커에 어떤 모델을 올려놨다’라는 말은, 누군가 해당 모델과 그것을 실행하는 데 필요한 모든 복잡한 설정들을 하나의 상자 안에 미리 다 조립해 두었다는 뜻이다.
즉 도커만 설치되어 있다면, 복잡한 환경 설정 없이 명령어 한두 줄만 입력해서 해당 모델을 실행할 수 있는 상태가 되었다는 의미이다.
도커 구성요소
도커 구성요소들은 도커파일 작성 → 이미지 빌드 → 컨테이너 실행이라는 흐름으로 연결된다.
도커파일 (Dockerfile)
도커파일은 컨테이너를 어떻게 만들어야 하는지 적어둔 텍스트 파일이다.
쉽게 말해 어떤 운영체제를 바탕으로 할지, 어떤 프로그래밍 언어와 라이브러리를 설치할 것인지 등 이미지를 만들기 위한 모든 명령어와 순서가 기록되어 있는 텍스트이다.
도커파일만 있으면 언제든 동일한 환경을 다시 만들어낼 수 있다.
도커 이미지 (Image)
도커 이미지는 도커파일의 내용을 바탕으로 만들어진 읽기 전용 (Read-only) 템플릿이다.
쉽게 말해 도커파일의 내용대로 필요한 라이브러리 등이 모두 설치되어 하나로 묶인 스냅샷이다.
.tar 파일과 같은 압축된 형태의 파일 시스템으로 존재
한 번 만들어진 이미지는 변하지 않으며, 다른 사람이 만들어둔 이미지를 다운로드하여 그대로 사용할 수도 있다.
컨테이너 (Container)
컨테이너는 도커 이미지를 바탕으로 실제로 실행되고 있는 프로세스이다.
애플리케이션이 실제로 동작하는 환경으로, 격리된 공간이기 때문에 하나의 서버 안에 여러 개의 컨테이너를 띄워도 서로 간섭하지 않는다.
하나의 이미지를 사용해 여러 개의 똑같은 컨테이너를 만들 수도 있으며, 컨테이너를 삭제하더라도 원본 이미지는 그대로 남아있다.
쉬운 비유
도커 개념들을 아래와 같이 비유하면 이해하기 편하다.
| 도커파일 | 붕어빵 레시피 |
| 도커 이미지 | 붕어빵 밀키트 |
| 컨테이너 | 실제로 구워진 붕어빵 |
붕어빵 레시피에는 붕어빵을 만들기 위한 재료와 방법이 적혀 있다. 이 레시피를 바탕으로 필요한 모든 재료를 모아 준비해 둔 것이 붕어빵 밀키트이다. 그리고 이 밀키트를 이용해 최종적으로 완성한 것이 붕어빵이다.
마찬가지로, 도커파일에는 컨테이너를 만들기 위한 운영체제와 환경 설정 등이 명시되어 있다. 이 내용을 바탕으로 애플리케이션 실행에 필요한 모든 것을 하나로 묶어 만들어낸 템플릿이 도커 이미지이다. 최종적으로 이 이미지를 실행하여 실제로 구동시킨 환경이 컨테이너이다.
가상머신과 도커의 차이
가상머신 (Virtual Machine, VM)
가상머신은 내 컴퓨터 (호스트 OS) 위에 하드웨어를 가상으로 쪼갠 뒤, 그 위에 새로운 운영체제 (게스트 OS)를 통째로 설치하는 방식이다.
OS 위에 또 다른 OS가 통째로 올라가기 때문에 매우 무겁고 부팅하는데 오래 걸린다.
예를 들어, 윈도우 환경에서 리눅스를 사용하고 싶을 때 VirtualBox같은 프로그램을 이용해 리눅스 OS를 새로 설치하는 것이 대표적인 경우이다.
도커
반면 도커는 OS를 새로 설치하지 않고, 호스트 OS의 커널을 그대로 공유한다.
OS를 통째로 올리는 대신 단순히 소프트웨어가 실행되는 환경만 격리하며, 호스트 OS의 CPU나 메모리 등의 하드웨어을 빌려 사용하는 것이기 때문에 매우 가볍다.


