Docker 시리즈 - 1. 도커, 왜 써요?
도커는 왜 쓰는 거에요? 2020-09-17

아 ㅋㅋ 왜 여기선 되는데 거기선 안되는데

여러분들도 많이 경험 해 봤을 이슈입니다. "아! 왜 여기선 되는데 거기선 터지는거야!"

한 번 우리가 다른 사람이 작업 한 서버를 구동 할 때, 어떻게 하는지 다시 한번 되세겨 볼까요? 새 컴퓨터에 Node.js 서버를 한번 실행해 본다고 가정 하겠습니다.

  1. Linux를 설치 한다.
  2. MySQL, nginx를 설치 한다.
  3. Node.js를 설치 한다.
  4. 환경 변수를 설정 한다.
  5. 기타 등등...

우리는 새 컴퓨터에 서버를 실행 할 때 이러한 과정들을 거칩니다. 여기서 문제가 있습니다. 사전에 서버 사양에 대한 완벽한 인수인계가 없다면, 저 위에 있는 것들이 원래 서버가 있던 컴퓨터와 완전히 똑같이 행해 질 수 있을까요?

그래서 나왔어요, 컨테이너(Container)

컨테이너의 특징, 규격화 됨, 일정함

컨테이너 전에는 가상화

일단 Docker를 사용 하기 전에 컨테이너에 대한 설명이 선행 되어야 할 것 같습니다. 여러분, 가상화라는 개념을 들어 보셨나요? 가상화는 단순하게 말하면 "물리적인 컴퓨터 리소스논리적인 객체추상화" 하는 것입니다. 우리는 호스트 컴퓨터에서 다수의 운영체제를 동시에 실행 하게 해주는 논리적 플랫폼인 Hypervisor를 이용하여, 하나의 하드웨어를 통해, 여러 개의 운영체제가 접근하여 사용 할 수 있도록 할 수 있습니다. 하지만, 이는 각 운영체제에 대한 메모리, 커널 등을 따로 할당 함으로써, 속도 이슈가 발생합니다.

출처: Docker 홈페이지

컨테이너의 등장

그래서 우리에게 컨테이너(Container) 라는 것이 등장했습니다. 컨테이너는 코드와 종속성을 한 곳에 묶은 애플리케이션의 추상화라고 볼 수 있으며, 프로세스를 격리함으로써 동일한 시스템에서 OS 커널만을 공유합니다. 그리하여 추가적으로 컨테이너를 생성할 때, 더 필요한 CPU와 메모리를 딱 필요한 만큼만 사용하여 속도는 빠르게, 용량은 적게, 하지만 프로세스 독립성은 여러 개의 운영체제를 실행 하는 수준으로 확실히 하는 획기적인 기술입니다.

출처: Docker 홈페이지

컨테이너의 근본이 되는 Image

컨테이너와 동시에 우리는 이미지(Image) 라는 개념을 알아두어야 합니다. 이미지는 컨테이너 실행에 필요한 파일, 의존성, 설정 값 등을 담고 있습니다. 쉽게 이야기 하면, 컨테이너를 실행하기 위한 정보들을 담고 있다고 할 수 있습니다. 컨테이너이미지를 기반으로 실행 되며, Docker Hub를 통해 우리가 원하는 Image를 찾아서 쉽게 사용 할 수 있습니다. Docker Image는 대충 수백 MB에 이르는데, 만약, 우리가 nginx, Node.js, Python, MySQL 등, 많은 이미지를 다운 받게 되면 기가 단위 까지 올라가 부담이 될 수 있겠죠? 그래서 Docker에서는 이 문제를 해결 하기 위해 Layer라는 개념을 사용 합니다. 위에 언급한 모든 이미지는 Linux를 사용 합니다. 일단 리눅스 레이어A 라고 하겠습니다. 그럼 그 위에 nginx 실행 파일에 해당하는 것을 B, Node.js 실행 파일에 해당하는 것을 C 라고 하면, nginx ImageA + B, Node.js ImageA + C 라고 할 수 있습니다. 이러한 방식으로 용량을 최소화 할 수 있습니다.

출처: Docker 홈페이지

그래서, 처음에 이야기 한 문제는 어떻게 해결 하는 건데요?

자자, 들어보세요, 그러면 코드를 Docker 환경에서 실행 한 후에, 실행에 성공한 Image를 다른 사람들이 사용하게 하면 됩니다. 아니, 애초에 Docker 환경에서 개발을 하는 것이 베스트입니다. 이제, 우리는 Docker 환경에서 개발을 할 수 있도록, Image를 가져 오는 법, Image를 이용하여 Container를 실행하는 방법, Dockerfile를 이용해 Image를 만드는 방법, ImageDocker Hub에 커밋하는 방법 등을 배워 볼 것입니다.

세줄 요약

  1. Docker컨테이너를 이용해 외부와 완전히 독립된 프로세스를 실행하게 해준다!
  2. 컨테이너는 실행에 필요한 파일, 의존성, 설정값을 담고 있는 이미지를 기반으로 실행된다.
  3. 독립된 프로세스를 가상화를 통해 실행하여 느릴 것 같지만, OS 커널을 공유하여 Docker는 빠르고 가볍다!

※ 군 복무중인 관계로 다음 Docker 관련 포스팅은 2달 후에 올리겠습니다..!

Docker 시리즈의 다른 글