
도커 이미지로 컨테이너를 생성하면 이미지는 읽기전용이 된다. 오직 컨테이너의 변경사항만 별도로 저장해서 각 컨테이너의 정보를 보존하는 것이다. 한번 생성된 이미지는 어떤 상황에서라도 변경되지 않는다.
실습을 진행하면서 느낄 수 있듯이, 컨테이너는 생성과 삭제가 매우 쉬운데 한번 삭제되면 복구할 수 없다는 단점이 있다. 예를 들어 위의 mysql컨테이너가 삭제되면 데이터베이스의 정보가 삭제되는 심각한 문제가 발생한다. 이를 방지하기 위해 컨테이너의 데이터를 영구적인 데이터로 활용하기 위한 방법이 있는데, 이것이 바로 볼륨을 활용하는 방법이다.
볼륨을 활용하는 방법은 대표적으로 3가지가 있다.
실습으로 mysql데이터베이스 컨테이너와 워드프레스 웹 서버 컨테이너를 생성한다.
//DB컨테이너 생성
$ docker run -d --name wordpressdb_hostvolume -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=wordpress -v /home/wordpress_db:/var/lib/mysql mysql:5.7
위에서 작성한 -v옵션은 호스트의 /home/wordpress_db 디렉토리와 컨테이너의 /var/lib/mysql 디렉토리를 공유한다는 뜻이다. 컨테이너의 /var/lib/mysql 디렉토리는 MYSQL이 기본적으로 데이터를 저장하는 디폴트 디렉토리다. 호스트의 /home/wordpress_db 디렉토리가 원래 없어도 도커에서 자동으로 생성한다.
워드프레스 웹 서버 컨테이너 생성
~$ docker run -d -e WORDPRESS_DB_PASSWORD=password --name wordpress_hostvolume --link wordpressdb_hostvolume:mysql -p 80 wordpress
컨테이너를 삭제해도 데이터베이스의 데이터가 보존되는지 확인해보자!

mysql 컨테이너가 사용한 데이터가 호스트의 /home/wordpress_db에 그대로 남아있는걸 확인할 수 있다.
-v 옵션으로 파일단위도 공유할 수 있고, 한번에 여러개의 옵션도 적용할 수 있다.
-v 옵션으로 볼륨을 사용하는 컨테이너를 다른 컨테이너와 공유하는 방법!
컨테이너 생성시 --volumes-from 옵션을 설정하면 -v 옵션을 적용한 컨테이너의 볼륨 디렉토리를 공유할 수 있다.
--volumes-from (-v옵션을 적용한 컨테이너 이름)
도커 자체에서 제공하는 볼륨기능을 활용해 데이터를 보존하기
볼륨 생성하기
docker volume create --name myvolume(이름)
볼륨 확인하기
docker volume ls
생성한 myvolume 볼륨을 사용하는 컨테이너를 아래와 같은 옵션으로 생성
[볼륨의 이름]:[컨테이너의 공유 디렉토리]
docker run -i -t --name myvolume_1 -v myvolume:/root/ ubuntu:14.04
위와 같이 컨테이너를 생성하면, /root/디렉터리에 myvolume이 공유되므로, /root/ 디렉토리에서 파일을 생성하면 해당 파일이 myvolume 파일에 저장된다. 만약에 myvolume_1 컨테이너의 /root/디렉토리에 volume파일을 생성했다고 하자. 그리고 나서 아래와 같이 myvolume을 쓰는 또다른 컨테이너를 하나 더 생성한 다음 /root/ 디렉토리를 확인해보면 volume파일이 있을 것이다.

도커 볼륨을 사용하고 있는 컨테이너를 삭제해도 볼륨은 삭제되지 않는다. 사용되지 않는 볼륨을 한꺼번에 삭제하려면 docker volume prune를 사용한다.
위와 같은 3가지 방법으로 컨테이너가 아닌 외부에 데이터를 저장하고, 컨테이너는 그 데이터로 동작하도록 설계하는 것을 stateless 하다고 말한다. 이와 반대로 컨테이너가 데이터를 저장하고 있어 상태가 있는 경우는 stateful 하다고 한다. 바람직한 설계는 stateless한 설계이다.