본문 바로가기
개발 공부/CS

Docker

by 느림보어른 2021. 6. 23.

서문

CS를 공부하다가 가상화와 관련하여 가상 머신과 컨테이너에 대한 글을 읽게 되었고 Docker에 대해 좀 더 찾아본 정보를 정리한 글이다.

가상화

컴퓨터 시스템에서 물리적 자원을 추상화하는 것이라 정의할 수 있다.

 

좋은 예시를 들자면 OS(운영체제)도 가상화 기술 중 하나라고 볼 수 있다.

OS의 커널에 의해 하드웨어가 추상화되면서, 컴퓨터에 연결된 기억 장치나 네트워트를 통한 데이터 교환이 하드웨어를 의식하지 않고 이루어지고 있다. 거기에 OS는 가상 메모리를 사용해 프로세스 및 OS 커널의 메모리 공간을 분하므로, 하나의 프로그램이 실패한다고 시스템 전체에 영향을 끼치지 않는다.

가상화가 해결한 문제

모든 기술은 필요하기 때문에 개발된다. 즉, 가상화 또한 어떤 문제를 해결하기 위해 개발된 기술이란 것이다. 가상화는 다양한 소프트웨어를 안정적으로 실행하기 위해 개발되었다. 만약에 한 머신에 하나의 소프트웨어만 실행된다면 어떻게 될까? 아주 좋은 예시로 스마트폰을 생각해보자. 스마트폰에는 다양한 기능이  있는데 이 기능들 하나하나가 딱 하나의 기기에서만 실행된다면 전혀 스마트하지 못한 많은 기기들을 들고 다녀야 할 것이다. 즉, 가상화를 통해서 전자기기의 자원을 분리시켜 실행하여 서로의 간섭을 받지 않고 독립적인 기능을 실행할 수 있게 되었다.

가상화의 단점

가상화가 완벽한 기술이라면 Docker가 세상에 나올 일은 없었을 것이다. 그렇다면 가상화는 어떤 문제를 갖고 있는걸까? 우선 가상화의 정의를 다시 보자면 컴퓨터 시스템에서 물리적 자원을 추상화하는 것이다. 여기서 컴퓨터 물리적 자원은 분명한 한계가 있다. 예를 들어, 이미 한계까지 끌어올린 컴퓨터에서 더 큰 가상 환경을 사용하려면 컴퓨터 자체의 성능을 확장하거나 다른 가상 환경을 처리하여 컴퓨터 물리적 자원을 확보하는 방법, 또는 새로운 컴퓨터를 구매하여 거기에 새로운 가상 환경을 설치하는 방법도 있다. 어떻게든 가상화는 컴퓨터 자체의 물리적 성능에 큰 영향을 받는다.

Docker

Docker가 해결한 문제 - environment disparity

말그대로 환경 차이이다. 개발자에게 환경 차이는 크게 사용하는 OS 그리고 개발 언어 버전의 차이가 있다. 구체적인 예시를 들자면 내가 개발할 때 사용하는 OS는 window이지만 개발한 애플리케이션을 올린 서버는 리눅스인 경우가 있다.

 

Docker가 이 문제를 해결한다는 것은 곧, Docker를 사용하면 다른 머신에서도 내가 개발한 환경을 그대로 적용할 수 있다는 것을 의미한다.

Docker

Docker는 명사 부두[항만] 노동자를 말한다.

한 번 거대한 컨테이너들이 밀집한 항구를 상상해보자. 각 컨테이너들 안에는 다양한 물품들이 실려있고 이것들을 화물선에 옮겨 다른 지역 또는 더 멀리 있는 국가로 운송된다. 이 과정을 위의 예시(개인 컴퓨터, 서버)와 연관 지어 생각해보자. 우선 두 머신에 Docker를 설치하여 컨테이너가 운송될 수 있도록 해주어야 한다. 그다음에 컨테이너에 내가 사용할 개발 환경들을 담아 서버의 Docker에 넘겨주면 서버의 Docker가 해당 컨테이너에 담긴 내역을 토대로 내 컴퓨터와 일치한 환경을 생성해준다. 이것이 Docker의 역할이다.

컨테이너

위의 Docker의 기능에 대해 알아봤다. 하지만 가상화의 문제점인 컴퓨터 자체의 물리적 성능의 한계를 해결한 부분이 없다. 이를 해결한 건 Docker에서 사용하는 컨테이너 기술이다.

 

Container는 그릇, 용기 등의 의미로 컴퓨터에서는 '리소스가 격리된 프로세스'라고 정의한다.

 

컨테이너는 Docker만이 사용하는 것이 아니다. 이미 오래전부터 컨테이너의 초기 기술들이 개발되어 왔으며 Docker가 서비스화된 이후로 크게 각광받는 기술이 된 것이다.

 

그럼 컨테이너는 가상화와 어떤 차이점이 있기에 가상화의 문제를 해결할 수 있었을까?

가장 큰 차이점은 가상화는 컴퓨터의 물리적 자원을 분활해 거기에 새로운 OS를 각각 설치하여 사용한다. 쉽게 설명하여 컴퓨터 안에 또 다른 컴퓨터를 만든다고 보면 된다. 하지만 컨테이너는 실행 환경만 독립적으로 돌리는 것이기에 컴퓨터의 물리적 자원을 분할하지 않고 서로 공유하기에 가상화보다 컴퓨터의 물리적 자원에 영향을 덜 받는다.

 

그리고 위에서 언급한 Docker의 역할은 이 컨테이너를 다른 머신으로 옮길 수 있기에 environment disparity를 해결할 수 있는 것이다. 또 Docker는 애플리케이션 실행 환경을 자동 구축해주는 '도커 이미지'라는 기술을 다양한 환경에서 사용할 수 있게 해 주어 개인 컴퓨터에서 개발한 애플리케이션을 서버로 쉽게 옮겨 구축할 수 있도록 해주었다.

 

컨테이너의 장점을 정리하면 다음과 같다.

  • 컨테이너는 호스트 OS와 OS 커널을 공유하므로 컨테이너 실행이나 정지 속도가 빠르다.
  • 호스트 OS의 커널을 공유하므로 VM만 사용하는 경우와 비교해 한 대의 호스트 머신상에서 훨씬 많은 컨테이너를 실행할 수 있다. 이를 통해 리소스를 한 곳에서 쉽게 관리할 수 있다.
  • Docker는 라이브러리나 프러엠워크 등을 도커 이미지로 묶어서 공유할 수 있는 것으로, 특정 환경에서는 재현되지만 자신의 개발 환경에서는 재현되지 않는 문제가 발생하기 어렵다. 따라서 버그를 효율적으로 수정할 수 있다.

출처

http://www.kyobobook.co.kr/product/detailViewKor.laf?mallGb=KOR&ejkGb=KOR&barcode=9791190665209 

 

그림으로 공부하는 IT 인프라 구조 - 교보문고

IT에 몸담은 이들을 위한 필독서 | IT에 종사하는 사람이라면 반드시 읽어야 할 책!IT 인프라 전반에 대한 상식을 그림으로 쉽게 이해한다!이 책은 ‘IT 인프라’ 전반을 충실히, 그리고 이해하기

www.kyobobook.co.kr

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

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

https://www.youtube.com/watch?v=hWPv9LMlme8&t=27s 

 

'개발 공부 > CS' 카테고리의 다른 글

인터넷  (0) 2021.08.18
Internet protocol suite (TCP/IP updated)  (0) 2021.07.21
Heroku VS AWS EC2 뭐가 다른 걸까?  (0) 2021.07.19
Nginx  (0) 2021.07.03
Web socket  (0) 2021.06.29