[Docker] 1. 왜 Docker를 사용하는가?
안녕하세요.
저는 지금까지 AI프로젝트를 할 때 가상 환경 특히 anaconda를 사용했었어요.
근데, 클라우드나 협업에서는 Docker를 많이 사용하시더라구요..?
Docker란 무엇이고 왜 사용하는 걸까요?
아래 블로그에서 정리를 잘 해주셔서 참고해보겠습니다.
https://89douner.tistory.com/95
6-1. 가상환경 대신에 도커(Docker)를 쓰자구요!
안녕하세요~ 이번글에서는 Docker라는 개념에 대해서 알아보도록 할게요! 지난번에 아나콘다를 이용해서 가상환경을 구축하는 이유에 대해서 알아보았어요. 그런데, 아래 구조를 보면 아나콘다
89douner.tistory.com
1) 가상환경(VM)의 구조
가상 환경은 제가 많이 사용하는 anaconda를 예로 들어볼게요.
(anaconda는 데이터분석 등에서 많이 쓰이는 python 가상 환경을 생성을 도와주는 toolkit이에요.)
먼저 anaconda의 구조입니다.
PC의 OS(Linux, Window, Macos등..)위에 anaconda가 설치가 됩니다.
로컬에 가상 환경을 각각 생성하고 이 환경으로 프로그램을 실행을 합니다.
2. Docker의 구조
Docker의 구조입니다.
Infrastructure - 개인 PC혹은 데이터센터 서버, 클라우드 서비스
Host Operating System - Linux, Window, macOS 등
Docker - 컨테이너라는 환경을 실행할 수 있게 하는 플랫폼(가상환경 비교: Anaconda라는 toolkit)
AppA / B/ C ... - 컨테이너(가상환경 비교: 가상환경A/B/C...)
언뜻 보면 가상 환경이랑 비슷해 보이죠?
3. Docker의 이점
3-1. 편리하다
"협업"을 예로 들어볼게요.
그런데, 내가 진행하는 프로젝트를 친구와 같이 협업하고 싶다!!
그렇다면 친구의 PC에 내 가상환경 세팅을 동일하게 설치해야합니다.
물론, requirements.txt 같은 pip 패키지를 쉽게 설치하는 방법이 있지만
cuda같은 세팅은 직접 해줘야하죠.
상당히 번거롭습니다.
Docker는 이미지를 생성해서 공유함으로서
cuda(Linux에서 가능)버전 공유, 라이브러리 패키징을 한 번에 공유할 수 있습니다.
이로 인해 개인 PC뿐 아니라 서버, 클라우드에서도 이점이 되는 부분이죠.
개발, 배포도 빠르게 할 수 있는 장점이 있습니다.
또한, github같은 docker hub라는 개발 환경 공유서비스도 제공합니다.
github는 코드를 공유한다면, dockerhub에서는 프로젝트의 docker 이미지를 공유해요.
Docker Hub를 이용해서 개발 환경을 공유하는 모습.
코드와 개발환경을 한번에 동기화 가능.
3-2. 시스템 효율이 좋다
설명 전에 PC의 작업 처리 방식에 대해서 설명하자면
CPU는 메모리(RAM)에서 데이터를 읽어들여 계산 작업을 처리하고,
I/O 작업(입출력 작업, 예: 하드 디스크, 프린터)을 관리합니다. CPU는 주로 계산 작업을 처리하지만,
동시에 I/O 요청(예: 파일 읽기/쓰기)이 들어오면 해당 작업도 처리해야 합니다.
I/O 작업이 발생하면, CPU가 직접 처리하기보다는 운영체제(OS)에 요청을 전달하여 I/O 작업을 처리하게 합니다.
이 과정에서 CPU는 계산 작업을 계속할 수 있고,
운영체제는 I/O 디바이스와 상호작용하여 작업을 처리합니다.
하지만 I/O 작업이 길어지면 운영체제가 해당 리소스를 독점하게 되고,
다른 프로세스가 해당 리소스에 접근하지 못할 수 있습니다.
이로 인해 전체 시스템 성능이 느려질 수 있습니다.
특히 I/O 장치가 병목을 일으키면, 다른 작업이 지연되면서
시스템 전체 성능에 영향을 미칠 수 있습니다.
가상 환경의 실행 방식을 보겠습니다.
가상 환경에서 하이퍼바이저(Hypervisor)는 물리적 하드웨어 자원을 가상화하여 여러 가상 머신(VM)을 실행합니다.
이때, 가상 머신(Guest OS)은 호스트 운영체제(Host OS)의 하드웨어 자원을 나누어 사용합니다.
하이퍼바이저는 가상 머신이 CPU, 메모리, I/O 디바이스 등을 사용할 수 있도록 중간에서 자원을 관리하고 배분합니다.
따라서 Guest OS(가상 환경)는 Host OS의 자원을 하이퍼바이저를 통해 나눠서 사용하기 때문에,
호스트 시스템의 성능이 떨어지거나 특정 I/O 작업이 지연되면,
가상 머신의 성능도 영향을 받을 수 있습니다.
예를 들어, 하드 디스크 성능이 떨어지면 가상 환경 내에서 파일 읽기/쓰기 작업이 느려지게 되고,
결국 가상 머신에서 실행 중인 애플리케이션도 느려집니다.
Docker의 실행 방식입니다.
Docker 컨테이너는 운영체제를 가상화하지 않고, 호스트 OS의 커널을 직접 사용합니다.
즉, 각 컨테이너가 독립된 OS를 실행하지 않고, 호스트 커널 위에서 독립된 프로세스처럼 실행됩니다.
따라서 가상 머신보다 더 가볍고 빠릅니다.
또한, VM처럼 운영체제의 전체 복제를 필요로 하지 않기 때문에 메모리와 CPU 자원을 적게 사용합니다.
즉, Docker는 호스트 운영체제의 커널을 공유하기 때문에
더 가볍고 효율적으로 자원을 사용하며, I/O 성능에서도 이점을 제공합니다.
요약.. 가상머신은 한번 실행 할 때마다 전체적인 OS 구조와 자원을 가져옴
Docker는 하나의 OS를 두고 독립적 프로세스 진행. 빠름!
3. Docker의 제한
Linux에서는 Nvidia Container Toolkit라는 툴킷을 제공해서
GPU를 사용하는(tensorflow-gpu, pytorch-gpu같은...)
docker 이미지 파일을 다운받고 설정할 수 있지만
Window나 macOS 에서는 불가합니다.
(다만, Window에서는 WSL2라는 추가 설정을 통한 GPU기반 이미지를 실행 가능하다고 합니다.)