여러분들도 많이 경험 해 봤을 이슈입니다. "아! 왜 여기선 되는데 거기선 터지는거야!"
한 번 우리가 다른 사람이 작업 한 서버를 구동 할 때, 어떻게 하는지 다시 한번 되세겨 볼까요? 새 컴퓨터에 Node.js 서버를 한번 실행해 본다고 가정 하겠습니다.
우리는 새 컴퓨터에 서버를 실행 할 때 이러한 과정들을 거칩니다. 여기서 문제가 있습니다. 사전에 서버 사양에 대한 완벽한 인수인계가 없다면, 저 위에 있는 것들이 원래 서버가 있던 컴퓨터와 완전히 똑같이 행해 질 수 있을까요?
컨테이너의 특징, 규격화 됨, 일정함
일단 Docker를 사용 하기 전에 컨테이너에 대한 설명이 선행 되어야 할 것 같습니다. 여러분, 가상화라는 개념을 들어 보셨나요? 가상화는 단순하게 말하면 "물리적인 컴퓨터 리소스를 논리적인 객체로 추상화" 하는 것입니다. 우리는 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행 하게 해주는 논리적 플랫폼인 Hypervisor를 이용하여, 하나의 하드웨어를 통해, 여러 개의 운영체제가 접근하여 사용 할 수 있도록 할 수 있습니다. 하지만, 이는 각 운영체제에 대한 메모리, 커널 등을 따로 할당 함으로써, 속도 이슈가 발생합니다.
출처: Docker 홈페이지
그래서 우리에게 컨테이너(Container) 라는 것이 등장했습니다. 컨테이너는 코드와 종속성을 한 곳에 묶은 애플리케이션의 추상화라고 볼 수 있으며, 프로세스를 격리함으로써 동일한 시스템에서 OS 커널만을 공유합니다. 그리하여 추가적으로 컨테이너를 생성할 때, 더 필요한 CPU와 메모리를 딱 필요한 만큼만 사용하여 속도는 빠르게, 용량은 적게, 하지만 프로세스 독립성은 여러 개의 운영체제를 실행 하는 수준으로 확실히 하는 획기적인 기술입니다.
출처: Docker 홈페이지
컨테이너와 동시에 우리는 이미지(Image) 라는 개념을 알아두어야 합니다. 이미지는 컨테이너 실행에 필요한 파일, 의존성, 설정 값 등을 담고 있습니다. 쉽게 이야기 하면, 컨테이너를 실행하기 위한 정보들을 담고 있다고 할 수 있습니다. 컨테이너는 이미지를 기반으로 실행 되며, Docker Hub를 통해 우리가 원하는 Image를 찾아서 쉽게 사용 할 수 있습니다. Docker Image는 대충 수백 MB에 이르는데, 만약, 우리가 nginx, Node.js, Python, MySQL 등, 많은 이미지를 다운 받게 되면 기가 단위 까지 올라가 부담이 될 수 있겠죠? 그래서 Docker에서는 이 문제를 해결 하기 위해 Layer라는 개념을 사용 합니다. 위에 언급한 모든 이미지는 Linux를 사용 합니다. 일단 리눅스 레이어를 A
라고 하겠습니다. 그럼 그 위에 nginx 실행 파일에 해당하는 것을 B
, Node.js 실행 파일에 해당하는 것을 C
라고 하면, nginx Image는 A
+ B
, Node.js Image는 A
+ C
라고 할 수 있습니다. 이러한 방식으로 용량을 최소화 할 수 있습니다.
출처: Docker 홈페이지
자자, 들어보세요, 그러면 코드를 Docker 환경에서 실행 한 후에, 실행에 성공한 Image를 다른 사람들이 사용하게 하면 됩니다. 아니, 애초에 Docker 환경에서 개발을 하는 것이 베스트입니다. 이제, 우리는 Docker 환경에서 개발을 할 수 있도록, Image를 가져 오는 법, Image를 이용하여 Container를 실행하는 방법, Dockerfile를 이용해 Image를 만드는 방법, Image를 Docker Hub에 커밋하는 방법 등을 배워 볼 것입니다.
※ 군 복무중인 관계로 다음 Docker 관련 포스팅은 2달 후에 올리겠습니다..!