다들 도커에 대해서 많이 들어보셨을 것입니다.
도커 하면 컨테이너가 어떻다, 가상화보다 좋다 라고 하는데...
도대체 도커 하면 왜 자꾸 컨테이너가 나오고, 도커를 왜 쓰는지와 어떤 이점이 있는지 확실히 알아보겠습니다.
오늘도 공식문서를 기준으로 알아보도록 하겠습니다.
도커의 공식홈페이지를 가서 도커가 무엇인지 알아볼려면 신기하게도 컨테이너에 관한 설명이 먼저 나옵니다
그럼 컨테이너가 도대체 뭐길래 도커 사이트에서 먼저 설명이 나오는지 들어가 보겠습니다.
https://www.docker.com/resources/what-container/
컨테이너에 대한 설명을 들어가보면 다음과 같이 말합니다.
컨테이너를 이용해서 빌드하고, 공유하고, 당신의 프로그램을 동작시키세요!! 라고..
Use containers to Build, Share and Run your applications
-도커 공식사이트-
컨테이너에 대한 설명을 좀더 들어가 보면...
컨테이너는 코드(code)와 모든 관련있는 라이브러리의 종속성(dependencies)을 포함하여 만든 표준 단위입니다.
그래서 내가 프로그램(application)을 동작할 수 있도록 만든 환경에서 빠르고 신뢰성 있게 다른 환경으로 쉽게 이식할 수 있게 만든 것이라 할 수 있습니다.
(A container is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.)
즉, 프로그램을 만들고 배포하면 그에 따라서 환경이 변경되면 동작이 안될 때가 있습니다.
예를 들어 내가 만든 웹이 MySQL이나 Java의 버전이 업데이트 되면 뭔가 동작이 안되는 것처럼요...
특히 워드프레스 같은경우 Apache, PHP, MySQL이 하나의 셋트로 버전이 맞아야 동작하게 됩니다.
그러다가 새로 개발한 것은 PHP가 이전보다 올라간 버전이고, 같은 서버에 배포해야 할 경우 이제 딜레마가 생기게 됩니다.
이전에 개발한 것을 php를 올려야 하나... 아니면 그냥 새로 개발한 것도 이전 php 버전에 맞춰서 개발해야 하나.. 하고 말입니다.
Spring을 이용해 개발할 때도 마찬가지 입니다.
서버 환경의 Java가 무엇이 설치되어 있는지에 따라 내가 사용해야 할 Spring 버전이 결정되고 마는것이지요...
이러한 것을 해결하는 방법이 바로 컨테이너 입니다.
내가 개발한 프로그램이 필요한 다른 환경들을 묶어서 컨테이너로 만들고, 이 컨테이너는 다른 컨테이너와는 독립된 환경이 되도록 보장해 주는 것입니다.
-아과노트-
좀 더 예를 들어보면 위의 그림에서 App A의 컨테이너에는 Spring boot 2를 사용했습니다.
그러면 Java도 11이나 12 버전을 사용하게 되지요, MySQL도 사용했을 것입니다.
그리고 App B의 경우 최신의 Spring boot 3.1.1을 사용할려고 했더니, Java를 17 이상을 써야 한다고 하네요..
그러면 App B의 컨테이너에는 Java 17과 내가 만든 Spring boot 3.1.1 기반의 프로그램과 MySQL을 이용하여 컨테이너를 구성하는 것입니다.
이렇게 하나의 서버 안에서 두개의 컨테이너가 서로 격리되면서 동작을 하게 됩니다.
이러한 컨테이너환경을 만들기 위해 여러 패키지가 있는데 그중 대표적인 것은 여러분이 그렇게 듣고 들었던 도커 입니다.
https://www.docker.com/why-docker/
이렇게 내 프로그램과 주변의 의존성 있는 라이브러리들을 한데 묶은 것을 이미지라고 합니다.
그 중 도커 컨테이너 이미지는 가벼운 독립적인 실행 가능한 소프트웨어 패키지로, 애플리케이션을 실행하는 데 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정)이 포함되어 있다고 도커 사이트에서 말합니다.
즉, 우리는 도커를 이용해서 컨테이너 이미지를 만들고,
컨테이너 이미지는 실행 시 컨테이너로 변환됩니다.
컨테이너는 소프트웨어를 환경으로부터 격리시키고 개발 및 스테이징과 같은 환경 간의 차이로부터 동일하게 작동하도록 보장합니다. 도커 엔진에서 실행되는 도커 컨테이너들은 이와 같은 원칙을 따릅니다.
정리해 보겠습니다.
우리가 개발을 여러건 하다보면 서로간에 동작 환경이 달라질 수 있습니다.
그래서 내 어플리케이션과 주변 환경의 프로그램들을 모두 묶어서 컨테이너 이미지를 만들고,
이 컨테이너들 끼리는 완벽하게 격리하게 해주어(물론 필요할때는 서로 공유도 가능합니다) 서로 간섭받지 않게 하는것...
그것이 컨테이너의 장점이고, 이것을 가능하게 해주는 것중에 대표적인것이 도커입니다
그럼 앞으로 도커의 이미지는 어떻게 다운받고, 도커 컨테이너는 어떻게 실행하는지 알아보도록 하겠습니다.
참고로, 이제 점점 내가 어떤 리눅스를 다루냐 보다... 내가 도커를 어떻게 사용하느냐가 이제 중요해 졌다고 합니다.
모든 프로그램이 도커 위에서 동작하게 되고, 환경설정도 다 도커가 해주게 되어 있어서 그런것 같습니다.
오늘은 이만 마치도록 하겠습니다.
고생하셨습니다.