최근 개발환경을 구성하는데 있어서 빠질 수 없는것으로 꼽히는 것 중 하나가 바로 도커(Docker)이다. 도커는 어떤 플랫폼이기에 많은 개발자들의 사랑을 받는 플랫폼이 되었을까?
도커는 컨테이너 기술 기반의 가상화 플랫폼이다. 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 것들이 포함되어 있다. 즉, 도커를 사용하면 환경에 구애받지 않고 코드가 문제없이 실행될 것임을 확신할 수 있게 되는 것이다.
가상화란 하나의 하드웨어를 여러개로 가상으로 분할하여 효율적으로 사용할 수 있게 해주는 기술이다. 이렇게 분리된 가상머신들은 각각 독립된 환경으로 구동되게 된다. 가상머신을 생성하기 위해서는 하이퍼바이저라고 불리는 소프트웨어를 이용하는데, 이 하이퍼바이저는 호스트 하드웨어에 설치되어 호스트와 게스트를 나누게 되고, 각각의 게스트는 하이퍼바이저에 의해 자원을 할당받게 된다. 이렇게 가상머신을 사용해서 하드웨어가 여러개 있는 것처럼 사용할 수 있다.
하지만 가상머신을 사용하기 위해서는 반드시 하이퍼바이저를 거쳐야 하기때문에 성능저하가 반드시 나타나게 된다. 또 가상머신은 해당 환경을 구동하기 위해 필요한 모든 자원을 포함해야하기 때문에 이미지의 크기가 커지며, 물리적 컴퓨터보다 효율성도 떨어지고 속도도 느려지게 된다.
이에반해, 컨테이너는 가상의 OS(게스트 OS)를 만드는 것이 아니라, 기존 환경의 OS를 공유하며 필요한 프로세스만 격리하는 방식이다. 커널자체를 공유하고 있기때문에 OS의 많은 자원들을 컨테이너들끼리 공유할 수 있게 된다. 때문에 기존의 가상머신 방식과는 다르게 이미지의 용량도 상대적으로 매우 작으며, 실행속도도 훨씬 빨라지게 된다.
장단점을 비교하면 다음과 같다.
가상머신
컨테이너
도커는 컨테이너 기술을 채용함으로써, 컨테이너 기반 기술의 장점을 적극 활용하기 위한 플랫폼인 것이다.
앞선 단락에서 이미지라는 단어가 여러번 나왔다. 이미지라는 단어는 알고 있겠지만, 과연 도커 생태계에서 이미지는 어떤 의미로 쓰일까? 이미지는 컨테이너와 함께 도커에서 가장 중요한 개념이다. 이미지란 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값이 없으며, 변하지 않는다(Immutable).
앞서 설명한 컨테이너는 즉, 이미지를 실행한 상태이며 추가되거나 변하는 값들은 컨테이너에 저장되게 된다. 때문에 같은 이미지에서 여러개의 컨테이너를 생성할 수 있으며, 컨테이너의 상태가 변하거나 컨테이너가 삭제되더라도 이미지는 그대로 남아있게 된다.
한마디로 이미지는 컨테이너 실행에 필요한 모든 정보를 가지고 있기 때문에, 의존성을 위해서 이것저것 설치하거나 충돌을 해결할 필요가 없는 것이다.
앞서 말했듯이, 도커란 컨테이너 기반의 가상화 플랫폼이다. 이미지를 실행시켜 컨테이너로 만들거나, 컨테이너를 관리하거나, 컨테이너를 이미지로 만드는 작업을 쉽게 할 수 있게 해준다.
이를 이용하여 개발자는 라이브러리간의 충돌을 방지하기 위해 환격을 격리시켜야 할 때, 완성된 서비스를 배포할 때, 혹은 배포받은 서비스를 받아 실행해볼 때 유용하게 도커를 사용할 수 있다. 특히 배포 과정에서 도커를 사용하게 된다면, 종속성이슈를 해결하는데 큰 도움이 된다.