이번에 파이썬 서버를 설계하는 프로젝트를 진행하면서 종속성, 컨테이너 등의 개념에 대해 필요성을 절실히 느끼면서 Docker에 대해 공부하게 되었다. Docker 기본 개념을 설명하는 게시물들은 기본적으로 Udemy의 Docker & Kubernetes 실전가이드 by Maximilian Schwarzmüller 강의를 참고하여 작성하게 되었다.
도커는 컨테이너를 생성하고 관리하는 컨테이너 기술이다.
컨테이너, 이미지, 도커와 같은 것들에 알기 전에는 도커라는 기술이 어려운 것처럼 느껴졌지만 사실은 컨테이너에 관련된 작업을 수월하게 해주는 오히려 편리한 툴인 것을 알게 되었다. 도커를 통해 컨테이너를 생성하고, 이를 관리하고 공유할 수 있다. 리눅스와 같은 OS에서 자체적으로 컨테이너를 생성할 수 있는 것으로 알고 있다. ( 최근 카카오 개발 컨퍼런스 영상을 보았는 데, 도커를 사용하지 않고 컨테이너를 만드는 과정을 진행해보았다는 영상을 봤다.. 그만큼 도커를 거치지 않고 컨테이너 생성을 하는 일이 많지 않다는 게 아닐까 싶다. )
컨테이너는 소프트웨어 개발에서 표준화된 소프트웨어 유닛이다.
한 줄로는 이해하기 어려울 수 있다. 컨테이너는 비유적으로는 여행 가방과 같다. 여행을 가기 위해서는 여러가지 품목들이 필요한 데, 이를 충족시키는 여행 가방이 있다면 여행을 갈 수 있다. 이를 애플리케이션 관점에서 바라보면 코드 패키지, 종속성, 도구들을 포함한다. 즉, 컨테이너를 통해 정확히 동일한 애플리케이션을 실행할 수 있는 환경을 구축할 수 있다는 의미이다.
이미지는 컨테이너의 블루프린트이다.
이미지를 설명할 수 있는 가장 짧은 한 줄이 아닐까 싶다. 이미지는 컨테이너의 도면, 템플릿이 된다. 코드와 코드를 실행하는 데 필요한 도구를 포함하고 있다. 따라서 이미지를 기반으로 하는 여러 컨테이너를 생성할 수 잇다. 다른 시스템과 다른 서버에서 여러 번 실행이 가능하다. 사전에 빌드된 이미지를 가지고 같은 개발 환경을 구축할 수 있다.
DockerHub라는 사이트를 통해 공식 이미지 혹은 개인이 만든 이미지를 구할 수 있다. DockerHub는 누구나 사용이 가능하며 공식 개발팀에서 배포 생성, 유지, 관리하기 때문에 믿고 사용할 수 있다는 장점이 있다.
왜 도커와 컨테이너를 사용하는 가? 그것은 왜 우리가 독립적인 표준화된 애플리케이션 패키지를 원하는 가에 대한 의문과 같다.
여러 명이 협업을 하거나 한 명이 여러 장비를 사용하여 같은 애플리케이션을 개발하는 경우를 생각해보면, 각각 다른 제품 생산 환경을 갖게 된다. 만약 어떤 환경에서는 NodeJS 14.3 이상의 버전을 사용하여 개발한 애플리케이션이 있다면, 그 아래 버전에서는 작동하지 않는 코드가 발생할 것이다.
또한 로컬에서는 환경 구축이 되어있지만 서버에는 되어있지 않다면?? -> ( 클라우드 서비스를 이용하면 ) -> 서버에서는 정상 작동하지 않을 것이다.
이를 컨테이너를 이용하여 해결할 수 있다. 코드가 항상 정확한 버전으로 작동하도록, 같은 환경에서 작동하도록 만든다. 이는 버전이나 기타 도구들을 걱정하지 않고 Product 생산에만 몰두할 수 있다.
프로젝트의 규모가 커져서 많은 종속성을 가지고 있는 프로젝트라면 컨테이너는 더욱 더 필요해진다.