왜냐하면 Docker는 아주 특정한 문제점을 해결해주기 때문이라고.. 그 특정한 문제는 바로
Environment Disparity
Docker가 해결할 수 있는 특정한 문제는 바로 "Environment Disparity". 즉, 개발 환경이 맞지 않는 상태를 Docker를 해결 할 수 있습니다.
예를 들어, 윈도우에서 개발하였고 모든 개발을 완료한 상황인데, 서버가 리눅스라서 코드가 동작하지 않을때.. 이와 같은 상황을 environment disparity라고 합니다.
Docker를 왜 쓰는가
Docker가 environment disparity를 해결할 수 있는 이유는, Docker를 통해 다른 머신에서도 같은 환경을 구현할 수 있기 때문인데요.
아까 예를 든 개발환경은 윈도우이고 서버가 리눅스일때, Docker를 사용하려고 한다면, 일단 윈도우와 리눅스에 Docker를 설치합니다. 그리고 docker파일이라는 것을 생성하고, 구현하고 싶은 환경을 설정하면 됩니다. 우분투, 파이썬, 깃 등등.. 개발에 필요한 환경을 모두 docker파일에 설정합니다. 그리고 이렇게 환경을 설정한 docker파일을 서버와 개발컴퓨터에 나누어줍니다. docker는 그 파일을 읽고, 필요한 모든 환경을 다운로드 받게됩니다. docker는 해당 설정한 환경과 같은 가상환경(Virtual Machine) 컨테이너를 컴퓨터에 만들게 됩니다. 그래서 윈도우에서 개발한 코드를 docker파일과 함께 서버로 업로드를 한다면 환경이 맞지 않아 코드가 동작하지 않는 일은 없을 것입니다. 그리고 이 docker파일들을 깃허브처럼 저장하고 관리할 수 있는 Docker Hub도 존재합니다.
또한, docker 컨테이너들은 각기 분리되어 있다고 생각하고 독립적이라고 생각할 수 있는데 바로 이 특징 때문에 한개의 서버에 각기 다른 컨테이너를 가질 수 있습니다. 예를들어 딥러닝을 돌리기 위한 컨테이너, 장고로 웹개발을 하기 위한 컨테이너 등등... 각기 다른 컨테이너들이 독립적으로 존재할 수 있습니다.
예를 들어 하나의 프로젝트는 자바7에서 다른 프로젝트는 자바8에서 개발하였다고 해도 docker를 이용하면 자바7의 서버, 자바8의 서버를 따로 생성할 필요 없이 컨테이너를 통해 관리할 수 있게되는 것입니다.
docker 덕분에 다양한 개발환경을 가진 컨테이너들을 독립적으로 관리할 수 있게 되는데 만약 하나의 서버 컴퓨터에서 자바앱, 장고웹 등등을 위한 여러개의 컨테이너를 가지고 있다고 가정합니다. 갑자기 자바앱이 인기가 많아져 사용자가 늘어나면, 자바앱 관리를 위한 컨테이너의 수를 늘리거나 줄일 수 있습니다.
즉, Docker로 인해 매번 새로운 서비스를 만들때마다 새로운 서버를 사고, 설정할 필요가 없는 것입니다.
하나의 같은 서버에서 각기 다른 환경의 컨테이너를 설정할 수 있고,
게다가 이 컨테이너들은 각기 분리, 독립되어 있으니 여러 환경에서 개발하고 서버를 관리해야 하는 개발자라면 docker의 이러한 장점이 크게 와닿겠죠?
Docker의 장점
원하는 개발 환경을 파일에 저장하면 docker는 이를 원하는 어떤 머신에든 해당 환경을 시뮬레이션 해준다.
이러한 환경은 각기 독립적으로 존재하기 때문에 원하는 무슨 환경이든 모듈식으로 관리가 가능하다.
Docker와 가상환경(VM)의 차이
가상 컴퓨팅은 한 물리적 컴퓨터 안에 각각 OS를 돌리는 가상 컴퓨터들이 물리적 자원을 분할해서 쓰기 때문에 성능에 한계가 생기게 됩니다.
하지만, Docker는 OS단까지 내려가는 것이 아니라 실행환경만 독립적으로 돌리는 것이라 컴퓨터에 직접 요소들을 설치한 것과 별 차이 없는 성능을 낼 수 있습니다. 가상 컴퓨팅보다 훨씬 가볍고 빠르게 각각을 설치하고 실행하고 켜고 끄고 연동할 수 있습니다.
그래서 서버에 뭔가 잘못되어 고쳐야 하거나, 일부를 업그레이드해야 하거나 할 때는 일일이 요소들을 정지하고 지우거나 새로 깔 필요 없이 docker를 통해 그냥 컨테이너들을 통째로 교체하여 새로 실행하면 됩니다.