이전 포스트에서 컨테이너는 stateless하기 때문에 컨테이너가 삭제 또는 변경으로 인해 재시작되면 모든 데이터가 이미지 상태로 초기화된다는 것을 알 수 있었다. 하지만 서버를 운영하다보면 당연히 데이터를 유지해야 하는 경우가 있다.
도커에서는 볼륨이라는 기능으로 데이터의 영속성을 보장한다.
데이터베이스 서버는 특히 저장되는 데이터들이 DB 서버의 특정 디텍터리에 저장되는데, 이런 데이터들이 컨테이너가 삭제 또는 재생성될 때마다 초기화되면 운영이 어려워진다.
또한 일시적으로 컨테이너를 운영하는 환경에서는 같은 역할을 하는 서버가 여러 개로 운영된다. 서버가 두 대 이상 있어야 한 서버에 문제가 생겼을 경우를 방지할 수 있고, 트래픽이 증가할 때마다 서버의 대수를 증가시켜 트래픽을 처리할 수 있다.

보통 엔터프라이즈 환경에서 클라이언트의 요청은 로드밸런싱을 거쳐 데이터베이스 컨테이너에 랜덤하게 전달되는데, 만약 각 컨테이너에서의 응답이 다른 경우에는 정상적인 서비스가 불가능할것이다.
그렇기 때문에 데이터에 대한 영속성이 필요한 경우는 모든 컨테이너가 함께 공유할 저장 공간이 필요하다. 이렇게 영속성이 필요한 데이터를 위해 도커 볼륨이라는 기능을 제공한다.
도커 볼륨은 영속성이 필요한 데이터에 대한 외부 공유 저장소이다. 이를 통해 컨테이너가 데이터를 외부에 저장하고 컨테이너들과 동일한 데이터를 공유할 수 있다.
이는 마치 USB와 같이 외부 저장소를 PC에 연결하기만 하면 모든 PC에서 USB에 있는 데이터를 사용할 수 있는 기능을 제공한다.

컨테이너들은 도커 볼륨을 특정 경로에 마운트하여 사용할 수 있다.
마운트 : 특정 티렉토리를 외부 저장소로 대체하는 것
이미지에서는 /var/lib/postgresql/data 경로에 실제 데이터가 저장되며 이 경로를 도커의 볼륨에 마운트한다면 이제부터 컨테이너가 실행될 때 이 경로에 저장하는 파일들은 컨테이너 레이어에 저장되는 것이 아니라 해당 경로가 마운트 되어있는 외부 볼륨에 저장되는 것이다.
볼륨은 1개이고 컨테이너는 3개인데 1개의 볼륨을 3개의 컨테이너에서 동일한 경로에 마운트 했기 때문에 모든 컨테이너는 동일한 데이터를 제공할 수 있게된다.
덕분에 컨테이너의 삭제 또는 재생성 후에도 동일한 경로가 다시 마운트 되고 볼륨의 데이터는 그대로 남아있기 때문에 데이터의 영속성을 보장할 수 있는 것이다.