과거의 내가 미래의 나에게
자유롭게 CI/CD에 대해 공부해볼래(4) - Docker 본문
저번 시간에 git action에 대해서 공부했다. 아직 적용시켜보진 못했지만 동작하는 메커니즘을 공부하고나니 좀 더 시야가 트인 기분이라 이번에 공부할 Docker도 저번에 학습했던 방향과 비슷하게 해보려고 한다.
Docker 란?
Docker가 무엇인지 검색해보면 컨테이너 기반의 가상화 플랫폼이라고 한다. 단어 하나하나가 낯선 모습이니 늘 하듯 한 단어 한 단어 분석해보도록 하자.
가상화
가장 먼저 가상화의 뜻이 무엇인지 알고 들어가야 전체적인 의미를 이해하기가 수월해진다.
가상화는 물리적인 자원을 논리적, 추상적으로 분할함으로써 더욱 효율적으로 자원을 사용할 수 있게끔 하는 개념이다.
이러한 개념을 이용하여 컴퓨터라는 하나의 물리적 요소를 이용하여 여러 개의 가상환경을 만들어 한대의 컴퓨터로 여러 컴퓨터를 사용하는 것처럼 사용할 수 있는 기술이 등장하였는데 이것이 하이퍼바이저라는 소프트웨어이다.
하나의 물리적 머신을 다수의 가상 머신으로 분할할 수 있도록 해주는데 예를 들어 기본적으로 하나의 하드웨어에 하나의 OS가 설치되어 실행되는 컴퓨터를 하이퍼바이저를 이용하면 가상으로 환경을 구축해줘서 하나의 OS가 아니라 여러 OS를 한 컴퓨터에서 사용가능하도록 하는 것이다.
< 하이퍼바이저 종류 >
하이퍼바이저는 하나의 컴퓨터에서 다수의 OS를 동시에 실행시키게 할 수 있는 소프트웨어이다.여기에는 두 가지 타입이 있는데, 하나는 하드웨어 위에 바로 설치하는 유형과 하드웨어 위에 OS를 설치하고 그 위에 소프트웨어의 형식으로 설치하는 형식이다.
후자의 경우가 우리가 자주 사용하는 VM웨어같은 것이 속하게 된다.
이를 사용함으로써 실질적으로 컴퓨터는 한 대지만 하이퍼바이저를 통해 컴퓨터 내의 가상컴퓨터들도 HOST 컴퓨터의 자원을 똑같이 이용함으로써 물리적 자원의 사용을 최대한으로 뽑을 수 있고 또 컴퓨터 여러 대 살 것을 한 대만 사서 운영가능하게 해주며 한 가상컴퓨터가 꺼져도 다른 가상컴퓨터는 별도로 돌아가기에 안전성을 확보할 수도 있는 등 가상화가 환영받고 발전을 이룩한 이유는 이 밖에도 많을 것이다.
Docker 그리고 컨테이너
오늘의 주인공인 Docker 또한 이러한 가상화의 원리를 이용했지만 컴퓨터의 모든 것을 가상화 시키는 하이퍼바이저와는 조금 다른 느낌이다. 하이퍼바이저로 생성되는 가상환경은 독립적인 환경으로 거의 완벽하게 기존 OS와는 구분된다. 즉, OS 전체를 가상화하는 것인데, 이렇게 되면 아무래도 무겁고 느릴 수 밖에 없다는 것이다. 컴퓨터 위에 컴퓨터를 또 돌리니 당연할 수 밖에 없는 것이다.
Docker는 하이퍼바이저의 가상화의 원리를 이용하여 좀 더 라이트한 형태의 가상화를 만들어냈다. OS 전체가 아닌 애플리케이션과 이를 실행시킬 수 있는 환경만을 패키징하여 가상화한 공간에 넣어 하이퍼바이저가 아닌 도커엔진이라는 것을 통해 HOST OS를 활용하여 기동 가능하도록 구성한 것이다. 즉, Docker는 가상화수준을 OS전체로 잡은 것이 아닌 프로세스 수준만 가상화를 한 것이다.
하이퍼바이저가 가상화시킨 것을 가상머신이라는 곳에 넣었듯이, Docker는 가상화 시킨 애플리케이션 패키징을 컨테이너라는 곳에 넣은 것이고 그렇기에 컨테이너 기반이라는 용어가 나온 것이다.
Docker의 의의
이로써 Docker가 무엇인가에 대한 답변으로 "컨테이너 기반의 가상화 플랫폼"의 말이 무슨 뜻인지 명확히 알아보았다. Docker란 결국 애플리케이션 단위로 가상화하여 컨테이너에 넣어 애플리케이션이 실행될 수 있도록 도와주는 플랫폼이다.
그런데 왜 하이퍼바이저같은 가상화를 내비두고 Docker와 같이 라이트한 가상화 방법이 나오게 된 것일까?
애플리케이션, 즉 소프트웨어가 실행되기 위해서는 컴퓨터의 운영체제와도 호환되어야 하고 실행에 필요한 라이브러리도 설치되어있어야 한다. 내가 개발한 컴퓨터에서는 이미 모든 것이 구축되어있지만 다른 컴퓨터에서는 그렇지 않으니 이를 실행하기 위해서는 별도로 환경 구축을 해야 하는 것이다. 게다가 각 컴퓨터의 환경은 다 다르기에 소프트웨어를 실행하려면 매번 환경을 새로 맞춰줘야 해 여간 번거로운 것이 아니었다.
그렇기에 이러한 환경을 한 곳에서 미리 다 구축해놓고 애플리케이션을 넣어서 가상화시킨 다음에 이 가상화 묶음, 즉 컨테이너를 다른 컴퓨터에서 실행시키면 되지않나? 라는 생각에 나온 것이 Docker인 것이다.
기존의 OS고 뭐고 복잡하고 무거운 메인 기능들까지 건드릴 필요는 없고 그저 내가 만든 애플리케이션 묶음을 넣기만 하면 위와 같은 번거로움은 획기적으로 줄어들게 되고 또 기존의 HOST OS를 사용하기에 가벼우면서 빠르기까지 하니 사람들이 Docker에 눈이 번쩍 뜨이게 된 것이다.
이러한 Docker를 통해 개발자들은 환경 설정에 들이는 시간을 획기적으로 줄이고 소프트웨어를 더 쉽게 배포하고 관리할 수 있게 되었다.
즉, Docker를 통해 내 컴퓨터에서는 되는데 니 컴퓨터에서는 왜 안돼? 의 상황을 개선시켜주는 것으로, 좀 더 가공해서 표현하자면 소프트웨어를 실행하기 위한 환경의 패키지화를 통해 소프트웨어의 이식성을 향상시켜주는 데에 Docker가 큰 기여를 하고 있다.
참고 문서
- 20분 만에 전공자처럼 도커, 가상화 이해하기! - https://www.youtube.com/watch?v=zh0OMXg2Kog&ab_channel=%EB%84%90%EB%84%90%ED%95%9C%EA%B0%9C%EB%B0%9C%EC%9E%90TV
- 가상화란? - https://born-dev.tistory.com/37
'데브옵스' 카테고리의 다른 글
webpack에 대하여 (0) | 2023.01.01 |
---|