최근에 와서는 거의 다 AWS 등 클라우드 환경을 이용해 배포를 하고 있죠. 서버리스도 점차 그 빈도가 늘고 있다고는 하나, 대부분의 경우에는 클라우드 서버가 주를 이루고 있습니다. 그리고 거기에 지대한 공헌을 하는 것 중 한 기술이 바로 Docker인데요. 도대체 뭐길래 이렇게까지 개발자들의 사랑을 받고 있을까요?

간단히 정의하자면, Docker는 컨테이너 기반 가상화 플랫폼입니다. (*가상화 : 컴퓨터 리소스의 추상화)
Docker는 아래와 같은 일을 할 수 있습니다.
Docker에 대해 더 자세히 이해하기 위해서는 컨테이너에 대한 이해가 필요해요.
컨테이너는 어플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행될 수 있도록 코드와 종속성을 패키징하는 표준 S/W 단위입니다.
한 마디로, 어떤 환경에서 실행하던 관계없이 빠르고 안정적으로 실행되도록 묶은 거에요.
이 컨테이너는 가상 머신과 비교했을 때 무엇이 다르고, 어떤 점이 더 좋을까요?

왼쪽이 VM의 구조, 오른쪽이 Container의 구조입니다.
VM은 각자 독립적인 OS를 갖고 있기 때문에 기본적으로 용량이 많습니다.
추가로 HyperVisor가 컴퓨터의 리소스를 VM별로, 물리적으로 분배하기 때문에 메모리의 유동적 관리가 어려워요.
다만 각 VM이 OS마저 따로 갖고 있으므로 격리성만 따진다면 우수합니다.
반면 컨테이너의 경우 하나의 호스트OS 위에서 커널을 공유하며 실행됩니다. 리소스를 공유할 수 있기 때문에 확장성과 효율성이 우수하죠.
최근에는 격리가 심하게 필요한 편이 아니고, 컨테이너 내부에서 어느 정도의 격리성이 보장되기 때문에 대부분 컨테이너 기반 가상화를 선택합니다.
컨테이너는 사실 도커 이외에도 LXC (Linux Container) 등이 있으나 도커의 대규모 커뮤니티 등의 장점으로 인해 대부분 도커를 사용합니다.

컨테이너를 만들려면 이미지가 필수입니다.
Dockerfile이 설계도이고 Container가 결과물이라면 Image는 예시 모형이라고 생각할 수 있어요.
이미지는 불변하기 때문에 Dockerfile에 변경점이 생길 때마다 새로 빌드가 필요한데, 이를 통해 버전 관리가 가능하죠.
도커는 컨테이너가 종료될 경우 안에 들어있던 데이터도 모두 함께 사라집니다.
데이터를 영속화하기 위해서는 별도로 외부에 저장할 필요가 있는데, 이 때 사용하는 것이 volume mount와 directory mount입니다.
마운트를 할 때는 특히나 경로 등을 잘 봐두어서 데이터를 분명 저장했는데 사라지는 참사가 나지 않도록 조심해야 합니다... (경험담입니다)
도커에서 volume을 따로 생성해 연결, 해당 볼륨에 데이터를 저장할 수 있도록 합니다.
따로 볼륨을 생성하지 않고 호스트OS의 파일에 직접적으로 액세스, 저장합니다.
컨테이너가 저장한 파일을 컨테이너에 접속하지 않고서도 호스트에서 편집 및 저장이 가능합니다.

기본적으로 docker [대상] [동작]의 형태를 띄고, 써야 할 명령어나 파라미터, 옵션 등을 모를 경우 --help를 통해 설명을 확인할 수 있습니다.
대상 부분에는 container(생략 가능), image, volume, network 등을 사용할 수 있으며 동작 부분에는 ls, inspect, start, run 등의 명령어를 사용할 수 있습니다 (대상마다 다르니 확인하실 것을 권장드립니다).