개발자는 Docker를 좋아하고, 기업은 Docker를 신뢰한다.
Docker란 Go언어로 작성된 리눅스 컨테이너 기반
으로 하는 오픈소스 가상화 플랫폼이다.
일단 컨테이너는 제껴두자. 오픈소스 가상화 플랫폼을 생각하면 떠오르는 것이 VMware이다. VMware안에 우분투를 설치해서 돌렸던 경험이 있지만, 왜 가상화 플랫폼을 사용하고 가상화가 작동하는 원리에 대해선 모르고 무작정 따라했었다. 그 때는 위 질문들을 답할 필요가 없었지만, 도커의 핵심인 컨테이너를 알기 위해선 가상플랫폼의 원리를 알아야 하고, 도커(Docker)가 과거보다 얼마나 편리하기에 많은 개발자들에게 사랑을 받는지 알려면 짚고 넘어가야 할 필요가 있을 것 같다.
가상화란 전통적으로 하드웨어에 종속된 리소스를 사용해 유용한 IT 서비스를 만들 수 있는 기술이다. 좀 더 간단하게 말하면 OS 내에 가상 머신을 생성하는 것
을 말한다.
옛날에는 OS를 전용 물리서버에서 실행해야 했었다. OS 1개당 물리적 서버가 한 대가 필요하기 때문에 여러 OS를 사용하는 경우에는 전부 실행할 수 있도록 여러 대의 서버가 필요하다. 일단 서버를 사는 비용부터 구입한 서버의 운영 및 유지보수 비용, 24시간 전기요금.. 규모가 작은 기업들은 감당할 수 없을 것이다. 이를 해결하기 위해 가상화가 생겨났다.
가상화를 사용하면 OS를 하드웨어, 즉 물리적머신과 분리할 수 있어 여러 운영체제를 하나의 물리적 머신에 돌릴 수 있다. 이러한 운영체제를 게스트 OS
라고 부른다. 나중에 많이 언급되니 기억하자.
가상머신을 쓰면 하드웨어를 안써도 되는 것은 아니다. 대신 하드웨어에 OS를 직접 설치하는 대신 하이퍼바이저 소프트웨어를 설치해서 물리적머신을 가상머신이라는 분리된 여러 가상 환경으로 분활하는 방식을 사용한다.
하이퍼바이저를 이용하면 한개의 물리적머신에서 여러 OS를 돌릴 수 있다. 하지만 실제론 물리적머신 안에 다수의 가상머신이 존재하고, 그 안에서 OS를 설치해 실행하기 때문에 상당히 무겁고 느리다.
그래서 등장한 것이 바로 컨테이너
이다.
컨테이너는 가상화 기술 중 하나로, 기존 OS를 가상화시켰던 방법과 다르게 프로세스를 격리시켜 동작하는 방식
이다. 한 서버안에서 여러 OS를 가상화 시켰던 방법이랑 프로세스를 격리시켜 동작하는 방식은 어떤 차이점이 있을까 ?
위 사진은 두 가상화의 동작방식이다. 왼쪽은 VM, 오른쪽은 컨테이너 동작방식이다. VM사진을 보면, 호스트 OS, 즉 기존의 OS 위에 Hypervisor엔진이 있다. 그리고 그 위에 게스트 OS를 올려 동작하는 방식이다. 사진을 봐도 알겠지만 가상화된 하드웨어 위에 OS를 돌리는 형태기 때문에 완벽하게 호스트와 분리된다고 봐도 무방하다. 하지만 컨테이너는 조금 다르다. 호스트 OS 위에 Doker엔진이 있고, 그 위에 에플리케이션을 실행할 때 필요한 바이너리들을 올릴 수 있다.
앞서 말했듯이, 기존 가상화 동작은 OS 위에 OS를 돌리기 때문에 무겁고 느리다. 그에 비해 컨테이너 기반 가상화는 Doker위에 OS를 돌리며 호스트의 커널을 공유한다. 커널을 공유하게 되면 io처리가 쉽게 되어 컴퓨터 성능의 효율을 높일 수 있다.
io처리 : 입출력 연산
컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 호스트 OS가 사용하는 자원을 분리해서 여러 환경을 만들 수 있도록 하는 것이다.
개발자들은 편리한 것을 좋아한다. 대표적으로 엄청나게 다양한 단축키를 생각할 수 있다. 사람들이 도커를 좋아하고 많이 쓰는 이유는 컴퓨터 성능을 효율적으로 높이고 Docker Image를 통해 쉽고 신속하게 에플리케이션을 구축, 테스트를 하고 배포할 수 있기 때문이다. 그럼 Docker Image가 왜 쉽고 빠르게 구축하고 배포할 수 있는지 알아보자.
Docker Image란 컨테이너를 실행할 수 있는 실행파일, 설정 값 등을 가지고 있는 것이다.
위 그림과 같이 Image를 컨테이너에 담고 실행시키면 해당 프로세스들이 동작하게 된다.
컨테이넌는 실행하기 위한 모든 것을 가지고 있기 때문에 의존성 파일을 컴파일하고 서버환경을 위한 설치를 하지 않아도 된다. 그냥 Docker Hub
에 있는 이미지를 pull 받아 컨테이너에 실행시키기만 하면 된다.
만약 내가 사용하고 싶은 이미지가 존재하지 않거나 이미 만들어져 있는 이미지가 맘에 들지 않다면 (내가 더 추가하거나 보완) Docker File
을 이용하면 된다. 만들기 위해선 파일안에 Docker Image를 만들기 위한 설정파일을 해줘야 하는데, 생략하겠다.
- 옛날에는 여러 OS를 실행시키기 위해 물리적머신을 사용함
- 물리적머신의 비용문제를 해결하기 위해 하이퍼바이저 엔진을 사용한 가상머신이 생겨남
- 쓰지 않는 서버의 비용, 무겁고 느린 OS 가상화를 대체하는 컨테이너 기반 가상화가 생겨남