안녕하세요~


이번글에서는 Docker라는 개념에 대해서 알아보도록 할게요!



지난번에 아나콘다를 이용해서 가상환경을 구축하는 이유에 대해서 알아보았어요. 그런데, 아래 구조를 보면 아나콘다는 PC computer에 종속되어 있는걸 볼 수 있어요. 



예를들어, 내 PC에서 아나콘다를 설치해 가장환경을 구축했으면, 내 옆자리의 PC에서 (내 PC에서 만든) 가상환경을 사용할 수 없어요. 이때 내 PC를 로컬이라고 하는데요. 이러한 아나콘다 가상환경의 문제점은 로컬에 종속된다는거에요.


<사진1>


그래서 내 PC에서 하던 작업을 친구 PC에서 해야하는 경우에는 친구 PC에 똑같이 패키지들을 설치해줘야해요. "아.. 그냥 내 PC에 있는 개발환경들을 사진(이미지)로 만들어서 친구PC에 옮겨 그대로 사용하고 싶다..." 이런 생각을 하실텐데요. 이것을 가능하게 한것이 바로 'Docker'란 녀석이에요. 









<1. Docker>



1) 내가 직접 설치할 필요가 없어요!


아나콘다 가상환경에서는 내가 직접 가상환경을 구성해주고 패키지들을 설치해주었죠? 하지만, Docker를 사용하면 이런 불편함을 없앨 수 있어요.


내 PC에서 가상환경 A, B, C를 만들었다고 가정해볼게요. 가상환경A에는 파이토치 개발환경, B에는 텐서플로우 개발환경, C에는 케라스 개발환경으로 설정되어 있는데요. 이걸 다른 PC에서도 사용하기 위해 이러한 가상환경을 하나의 도커 파일(이미지)로 만들어 Docker hub라는 곳으로 보내요. (이때 이미지라는 용어는 '사진'이라는 개념으로 이해하면 좋을텐데요. 그냥 내가 우분투라는 OS를 설치를해서 "설치가 마무리 된 상태"를 하나의 사진으로 찍어서 파일로 만들어주면, 다른 사람들은 내가 만들어 놓은 이미지만 실행시키면 내가 OS를 설치 할때 여러 설정들을 해주었던 귀찮은 작업을 할 필요가 없어져요) 


그럼 친구 PC에서 파이토치 개발환경을 세팅하고 싶으면 Docker hub라는 곳으로가 내가 올려놓은 가상환경A에 해당하는 도커파일(이미지)을 다운받으면 자동으로 설치가되요. 간단하죠? 



<사진2>


아래 사이트에 접속하시면 좀 더 직관적으로 이해가 가능하실거에요!

http://taewan.kim/post/python_env_for_machine_learning/


그런데 보통은 개발자들이 '파이토치', '텐서플로우' 이러한 개발환경들을 도커파일(이미지)로 Docker hub에 올려놓는데요. 우리는 그 도커파일(이미지)만 다운받으면 따로 패키지 설치할 필요없이 간편하게 파이토치를 바로 사용할 수 있게되요~


 


또한 도커파일(이미지)는 OS 따로, 머신러닝에 필요한 패키지 따로 만들어져서 docker hub에 올려져 있는 경우도 있어서, 자신이 원하는 도커파일을 다운 받아서 개발환경을 구성할 수 도 있어요. 




2) Docker도 독립된 환경을 구축할 수 있어요!


앞서 Docker hub에서 이미지 파일을 다운받아 개발환경을 구축할 수 있다고 말씀드렸죠? Docker 역시 아나콘다 가상환경처럼 하나의 PC에 컨테이너라(아래그림의 App A)는 독립된 공간을 제공해줘요.  



           

<사진3>






3) Docker VS VM


우리가 사용하고 있는 운영체제가 우분투인데 레드헷, CentOS, 윈도우와 같은 운영체제 기반에서 개발을 하고 싶을때 보통 Virtual Machine을 사용하는데요. 가상머신 또한 배포해서 사용할 수 있기 때문에 내PC에서 작업했던 것을 다른 PC에서 다운받아 사용할 수 있어요. 


도커도 컨테이너 내에서 배포된 OS 이미지를 다운받아 설치할 수 있기 때문에 A라는 컨테이너에서는 윈도우를 B라는 컨테이너라는 곳에서는 우분투를 사용할 수 있다고 했어요. 그렇다면 VM과 Docker의 차이는 무엇일까요? 




보통 컴퓨터가 실행이되면 Memory에서 정보를 읽어들어와 CPU에서 처리해줍니다. 


<사진4>


CPU가 process단위로 작업을 하다보면 프린터와 같은 I/O 디바이스를 실행시켜야 할때가 있는데요. 이런 경우에는 I/O 디바이스를 처리하는데 CPU가 너무 많은 시간을 잡아먹기 때문에 운영체제 한테 권한을 넘겨줘서 처리하게 해줍니다. 그러면 운영체제는 I/O 같은 물리적 device를 독점해서 사용하게되죠. 이러한 작업이 끝나기 전까지는 어떤 process도 현재 I/O에서 수행하고 있는 process를 방해하지 못해요.


<사진5>



VM은 Hypervisor라는 기반 위에 Guest OS가 실행되는 개념이에요. 이러한 Guest OS는 Host Operating System의 메모리와 물리적 장치를 직접 접근하여 사용합니다.


<사진6>


OS라는건 용량이 많아 메모리를 굉장히 많이 차지하게 되고 이러다 보면 실제 프로그램을 위해 할당되는 메모리 양이 부족하다보니 프로그램 속도가 굉장히 느려지는 단점이 있어요. 또한 OS별로 물리적 장치를 나누어 쓰기 때문에 더욱 문제가 심화될거에요.


<사진7>


<사진8>


하지만 도커를 사용하게되면 컨테이너 내부에서 실행하기 때문에 따로 Host Operating System에 접근할 필요가 없어 조금 더 효율적으로 컴퓨터 시스템(메모리)을 사용할 수 있게 됩니다.


<사진9>








<2. Docker 단점>


이렇게 장점이 많다면 모든 개발자들이 Docker를 써야하는거 아닌가?라고 반문할 수 있을거에요. 사실 많은 개발자들이 Docker를 이용하고 있지만 Docker 역시 몇몇 단점들을 갖고 있어요.


1) 윈도우에서 GPU docker 이미지 파일은 제공이 안되요 


딥러닝 개발환경을 구축할 때 빠지지 않는 것이 GPU 설치에요. 그래서 도커에서 tensorflow 설치환경을 다운받으면 당연히 GPU 관련 패키지나 파일들이 설치되어야 하는데요. 아직까지는 윈도우 환경에서 GPU 도커 이미지파일이 제공되지 않기 때문에, 윈도우에서는 도커 컨테이너에 tensorflow-gpu가 설치되지 않는다고 해요ㅜㅜ


하지만 리눅스에서는 Nvidia-Docker를 제공해주기 때문에 관련 이미지를 다운받고 설정해줄 수 있다고 합니다. Docker의 가상환경은 실제 GPU와 연결될 수 없는데, 리눅스 운영체제에서 Nvidia-docker를 이용하면 Docker에서도 GPU를 인식할 수 있도록 해줍니다. 


<사진10>




지금까지 Docker에 대해서 알아보았어요.

다음장에서는 Docker를 통해 Pytorch, Tensorflow 개발환경을 구축하는 방법을 알아보도록 할게요!















[글 래퍼런스]

https://www.youtube.com/watch?v=tPjpcsgxgWc


[사진 래퍼런스]

사진1

https://m.gettyimagesbank.com/view/computer-monitor-icon-vector-illustration-on-isolated-background-business-concept-computer-pictogram/921163788

사진2

https://www.javainuse.com/devOps/docker/docker-hub

사진3

https://gist.github.com/qpzm/f25ac49cc7568cbc084a6b2c10288d59

사진4

http://bimresources.blogspot.com/2011/09/normal-0-false-false-false-en-us-x-none_29.html

사진5

https://googler700.blogspot.com/2015/03/os-memory-management.html

사진6

https://medium.com/@darkrasid/docker%EC%99%80-vm-d95d60e56fdd

사진7

https://www.vembu.com/blog/vmware-memory-metrics/

사진8

https://www.youtube.com/watch?v=tPjpcsgxgWc

사진9

https://tech.peoplefund.co.kr/2017/04/03/what-is-docker-ko.html

사진10

https://github.com/NVIDIA/nvidia-docker

+ Recent posts