Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.
다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐 등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립 PC, AWS, Azure, Google cloud 등 어디에서든 실행할 수 있습니다.
docker는 'environment disparity'라는 문제점을 해결해줍니다. 컴퓨터는 윈도우고 서버는 리눅스여서 발생하는 environment disparity를 docker가 해결해줍니다. docker를 통해 다른 머신에서도 같은 환경을 구현할 수 있습니다.
윈도우이고 서버가 리눅스일때, Docker를 사용하려고 한다면, 일단 윈도우와 리눅스에 Docker를 설치합니다. 그리고 docker파일이라는 것을 생성하고, 구현하고 싶은 환경을 설정하면 됩니다. 우분투, 파이썬, 깃 등등.. 개발에 필요한 환경을 모두 docker파일에 설정합니다. 그리고 이렇게 환경을 설정한 docker파일을 서버와 개발컴퓨터에 나누어줍니다. docker는 그 파일을 읽고, 필요한 모든 환경을 다운로드 받게됩니다. docker는 해당 설정한 환경과 같은 가상환경(Virtual Machine) 컨테이너를 컴퓨터에 만들게 됩니다. 그래서 윈도우에서 개발한 코드를 docker파일과 함께 서버로 업로드를 한다면 환경이 맞지 않아 코드가 동작하지 않는 일은 없을 것입니다.
또한, docker 컨테이너들은 각기 분리되어 있습니다. 바로 이 특징 덕분에 한개의 서버에 각기 다른 많은 수의 컨테이너를 갖을 수 있습니다. 예를 들면 한개는 파이썬, 장고 컨테이너, 다른 컨테이너는 node js... 혹은 java 컨테이너 이렇게 각기 다른 컨테이너들이 독립적으로 존재할 수 있는 것입니다.
docker 덕분에 이렇게 다양한 컨테이너들을 관리할 수 있습니다. 예를 들면 java앱이 인기가 갑자기 많으면 그냥 java 컨테이너의 갯수를 늘리면 되는 것입니다. 다시 트래픽이 줄면 해당 컨테이너 수를 다시 줄일 수 있습니다. 즉 docker 덕분에 매번 새로운 서비스를 만들때마다 새로운 서버를 사고, 설정할 필요가 없는 것입니다. 원할때마다 docker를 통해 새로운 환경을 생성할 수 있습니다.
또 다시 서버를 사고 환경을 설정하고.. 시작하고.. 이럴 필요가 없는 것입니다.
그냥 컨테이너를 생성하고 복제하면 됩니다. 원하는 수 만큼.
하나의 같은 서버에서 각기 다른 환경의 컨테이너를 설정할 수 있고 게다가 이 컨테이너들은 각기 분리, 독립되어있으니 더더욱 좋습니다.
이미지는 컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다(Immutable). 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 추가되거나 변하는 값은 컨테이너에 저장됩니다. 같은 이미지에서 여러개의 컨테이너를 생성할 수 있고 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.