개인 프로젝트에서를 완성하여 EC2에 배포를 해야했는데, 처음 배포를 경험해 보는 나에게 웹 앱 실행 환경을 구성하는 것이란 쉽지 않았다. 도커가 이러한 환경을 가상화하여 편리하게 제공해 주었기 때문에, 경험도 할 겸 좋다고 사용했던 기억이 있다. 다만 지금 생각해 보면 도커가 정확하게 어떻게 동작하여 그런 환경을 제공해 주는 지에 대해 잘 모른 채 사용했던 것 같다. 대략적인 내용은 알고 있었지만 조금 더 구체적으로 정리할 필요가 있다고 생각하여 정리해 보고자 한다.
도커는 리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다.
쉽게 생각하면 도커는 프로세스 격리 기술이라는 것을 이용해서 프로그램을 독립적으로 실행시켜 주는 프로그램이라고 볼 수 있을 것 같다.
그리고 위의 강조된 설명에서도 알 수 있듯이 도커는 리눅스 운영체제에서만 실행되는 응용 프로그램만을 관리해 준다.
도커 자체도 리눅스에서만 실행될 수 있도록 만들어졌고, 도커를 통해서 격리되어 실행되는 프로세스들도 모두 리눅스 환경에서 실행되는 프로그램들이어야만 한다는 것이다.
따라서 도커를 실행하기 위해서는 VirtualBox나 VMware 등을 이용해 리눅스 가상환경 위에서 실행하거나 WSL를 이용하는 등 어떻게든 리눅스 환경을 만들어 주어야 한다.
보통 도커와 가상머신을 비교하면 도커가 더 가볍고 빠르다는 얘기를 많이 들었던 것 같다.
도커가 어떻게 동작하길래 기존에 있던 가상화 방식 보다 가벼울 수 있는 것일까?
하지만 도커처럼 컨테이너 기반의 가상화 방식은 기존 가상화 방식과 다르게 같은 운영체제의 가상화만 지원한다.
그리고 이러한 방식이 기존의 가상화 방식 보다 가벼움을 만들어 낼 수 있는 차별점이 아닐까 싶다.
이 때, Window 환경의 경우 기존의 Host OS와 운영체제 자체가 다르기 때문에 어떻게 할 방법이 없다.
Linux 환경에서 Window를 쓰고 싶다면 위 방법을 사용하는 것이 맞다.
( 이것도 근데 어떻게 중간 프로그램을 잘 만들면 어떻게든 되지 않을까 싶긴 하다..? )
다만, Linux 환경에서 Linux 가상 환경을 하나 더 만드는 일은 어떻게 보면 조금 비효율적인 것 처럼 보인다.
어차피 같은 컴퓨터에서 구동되니까 사용하는 물리적인 하드웨어도 같을 것이고
같은 리눅스 운영체제인데 ( 버전은 다를 수 있겠지만.. ), 굳이 같은 환경을 또 만든다는 뜻이기 때문이다.
그렇다면 리눅스에서 실행되는 프로그램들을 또 다시 리눅스 체계의 가상화 환경을 만들고 그 위에서 실행시킬 필요가 있을까?
도커는 이러한 부분을 캐치하고 공통분모를 제거하고자 나왔다. 위처럼 겹치는 부분들을 도커 엔진이 중간에서 다리 역할을 해서 가상화 환경의 운영체제 비슷하게 동작해 주는 것이다. ( 마치 JVM이나 Interface 같다.. )
이렇게 되면 가상 환경을 만들기 위한 고유한 OS + 하드웨어 프로그램 등을 새롭게 구동할 필요가 없어지기 때문에 훨씬 속도가 빨라진다.
( OS를 구동하는 것 자체만으로도 자원적으로 엄청난 비용이 드는 듯 하다. )
이게 도커가 기존의 가상화 방식 보다 빠르고 가벼울 수 있는 이유이다.
물론 위에서 말한 것처럼 컨테이너 기반의 가상화 방식은 같은 OS체계를 사용하는 가상 환경을 만들 때 나타나는 공통 분모만을 제거한 것이기 때문에, 기존의 가상화 방식에 비해 단점도 존재한다.
여러 가지가 있지만 가장 직관적으로 이해하기 쉬운 단점 두 가지만 적어보면 아래와 같다.
지금까지 정리한 내용을 보니 조금 의문이 들 수 있다.
"어차피 같은 운영체제 환경만 지원되고, 공통분모만 제거해 주는 거면 그냥 가상화 없이 쓰면 안 되나? 그게 더 빠를 것 같은데.."
맞는 말인 것 같다.
위의 내용들을 잘 보면 사실 그냥 기존 환경에서 프로그램을 돌리는 게 굳이 도커라는 프로그램을 안 거치기 때문에 오버헤드도 없고 빠를 거라는 생각이 들었다.
환경을 구축하는 방식을 실행 가능한 형태로 기록할 수 있도록 추상화해 준 이미지라는 개념과 그렇게 실행되어 구현된 컨테이너라는 개념 등 도커 자체에서 가상화와 함께 제공하는 여러 기능들도 있다.
물론 기존의 가상화 방식에서도 이미지와 같은 기능은 있다. 하지만 이미지에 OS가 자체적으로 포함되기 때문에 매우 용량도 크고 무거운 반면 도커는 좀 더 프로그램에 중점을 두어 단일 애플리케이션을 실행하는 데 필요한 리소스만 패키징하기 때문에 가볍고 빠르다는 특징이 있었다.
이러한 장점 덕분에 앱이 자주 변경되고 배포가 잦은 요즘같은 개발 환경에서 빠른 앱 실행 환경 구축과 관리의 편의성을 가져갈 수가 있다.
심지어 쿠퍼네티스와 같은 기술들과 함께 사용하면 더더욱 편리한 점들이 늘어나니 성능상 엄청나게 나쁜 게 아니라면 굳이 사용하지 않을 이유도 없다고 생각한다.
도커의 원리에 대해 간단하게 정리해 보았는데, 이제는 도커의 사용법에 대해서도 공부할 필요가 있을 것 같다.
기존에 프로젝트에 적용한 건 단순히 EC2에서 database와 Java 앱 실행 환경을 가져온 것이 전부였다.
기회가 된다면 도커에 대해 더 공부해서 다른 기능들도 사용해 봐야겠다.
틀린 내용을 지적해 주시면 너무나 감사하겠습니다. 항상 적극 반영합니다!