개발을 하면 도커를 쓸 일이 종종 생기고, 도커는 거의 git 만큼 많이 쓰이는 도구이다.
도커가 뭔지 설명하기 전에 도커를 사용하지 않을 때의 상황을 알아보자. 개발자라면 자기가 만든 프로그램이 자신의 컴퓨터에서 작동하는 것처럼 어느 환경에서나 동작하기를 바랄것이다. 하지만 개발자가 개발한 어플리케이션은 개발자가 직접 작성한 코드만으로 돌아가는 것이 아니다. 여러가지 디펜던시와 프로그램 구동 환경 등이 다 완벽히 갖춰졌을 때가 돼서야 개발자가 의도한대로 프로그램이 잘 돌아가게 된다.
하지만, 사용자마다 다른 운영 체제를 사용하고 있고, 모두 다 설치되어 있는 프로그램이 제각기 다를 것이다. 이 때 어플리케이션을 구동하는데 필요한 디펜던시 중 일부가 설치되어 있을 수도 있고 없을 수도 있고, 어떤 경우 설치되어 있긴 한데 버전이 다를 수도 있다. 따라서 윈도우에서는 돌아가는 프로그램이 맥에서는 안돌아가는 등의 현상이 나타날 수 있다. 이 때 맥에서도 돌아가게 하려면 개발자는 맥에서 돌아가게 하기 위한 추가적인 작업을 해야될 것이다. 하지만 환경이 제각기 다 다르기 때문에 추가적인 작업을 했다고 해서 모든 사용자가 그 어플리케이션을 사용할 수 있을 것이라는 장담을 하기 쉽지 않다.
도커는 개발한 어플리케이션이 환경에 따라 돌아가지 않을 수 있는 문제를 해결해줄 수 있다. 도커는 어떤 환경에서든 프로그램이 동일하게 작동하도록 도와주는 좋은 도구이기 때문이다. 도커를 사용하면 컨테이너를 만들고 배포하고 다른 곳에서 쉽게 구동할 수 있게 된다.
도커에는 크게 세 가지 요소가 있다. 1. Dockerfile 2. image 3. container 프로그램을 image로 만들어 두면 image만 있으면 개발한 상태 그대로 어디서든 실행할 수 있게 된다. 즉, image는 실행 가능한 어플리케이션의 스냅샷이다. 따라서 프로그램을 image로 만들어야 한다.
image는 크게 두 가지 방식으로 만들 수 있다. 1. 도커파일로 만들기 Dockerfile은 image를 만들기 위한 설명서이다. 컨테이너를 어떻게 만들어야 하는지, 어플리케이션 파일 의존성, 구동방식 등에 대한 내용이 Dockerfile에 들어있다. Dockerfile을 작성하고 docker build를 이용하면 이미지를 만들 수 있다. 2. 컨테이너를 이미지로 만들기 docker commit명령어를 통해 실행 중인 상태를 이미지로 만들 수 만들 수 있다.
어플리케이션은 컨테이너 안에서 실행된다. 한 컨테이너는 다른 컨테이너와 격리되어 있기 때문에 컨테이너에서의 작업은 다른 컨테이너에 영향을 주지 않는다. 따라서 node의 여러 버전을 한 서버의 여러 컨테이너에서 동시에 구동한다거나 하는 등 도커를 이용하면 여러 가지의 환경을 동시에 구동할 수도 있다.
도커와 항상 같이 언급되는 것이 VM인데, VM은 컴퓨터 하나를 통째로 소프트웨어로 만든 것이라고 생각하면 된다. VM 소프트웨어에는 CPU, RAM, OS 등등이 모두 포함되어 있기 때문에 VM을 띄우면 그냥 또 다른 컴퓨터를 컴퓨터 위에서 띄운 것이라고 보면 된다.
하지만 컨테이너에는 운영체제가 없다. 도커파일을 작성할 때 base image에 보통 우분투 같은 이미지를 넣어주기 때문에 컨테이너도 OS를 포함하는 게 아닌가 생각할 수 있지만, 컨테이너들은 각각이 OS의 핵심인 OS 커널을 갖고 있는 것이 아니고 모두 도커 호스트 OS의 커널을 이용한다. base image는 OS를 추가적으로 설치하는 이미지가 아니고, OS를 실행하기 위한 라이브러리와 도구들이 들어있는 이미지이다. 따라서 도커가 VM보다 훨씬 빠르고 가볍다.
하지만, VM은 모두 격리되어 있어서 호스트 OS가 멀웨어에 감염되어도 VM에 영향이 없지만, 컨테이너들은 호스트 OS의 커널을 이용하기 때문에 도커 호스트 OS에 멀웨어가 감염되거나 하는 등 문제가 생겼을 때 호스트 OS 상태가 컨테이너들에 영향을 미칠 수 있게 된다. 따라서 도커가 무조건 VM보다 좋다고 신봉하기 보다는 상황에 맞게 더 적합한 도구를 사용해야 한다.
잘 모를 때는 도커가 짱이라는 말이 너무 많아서 도커가 무조건 짱인 줄 알았는데 알아보니 VM이 더 적합한 경우도 있었다! 무조건 장점만 있는 도구는 거의 없는 것 같다. 도구마다의 장점과 단점을 인지하고 어떤 경우에 사용하면 좋은지를 인지해두자.