docker volume create {볼륨 이름}
을 통해 볼륨을 생성한다.# 볼륨 생성
$ docker volume create my-appvol-1
# 생성된 볼륨 조회
$ docker volume ls
DRIVER VOLUME NAME
...
local my-appvol-1
# 볼륨 검사, 볼륨이 올바르게 생성되고 마운트 되었는지 확인하는 데 사용
$ docker volume inspect my-appvol-1
# 생성 시간, 드라이버, 라벨, 마운트 포인트, 이름, 옵션, 스코프 등등 확인 가능
# --mount 옵션을 이용한 볼륨 지정
$ docker run -d --name vol-test1 \
> --mount source=my-appvol-1, target=/app \
> ubuntu:20.04
# -v 옵션을 이용한 볼륨 지정
$ docker run -d --name vol-test2 \
> -v my-appvol-1:/var/log \
> ubuntu:20.04
# 사전에 volume을 create하지 않아도 호스트 볼륨 이름으로 자동 생성 가능
$ docker run -d --name vol-test3 \
> -v my-appvol-2:/var/log \
> ubuntu:20.04
# 마운트 정보 확인
# docker inspect vol-test1
...
"Mounts": [
{
"Type": "volume",
"Name: "my-appvol-1"
"Source": "/var/lib/docker/volumes/my-appvol-1/_data
...
# 볼륨 제거, 연결된 컨테이너가 있으면 에러 발생
$ docker volume rm my-appvol-1
$ docker stop vol-test1 vol-test2
$ docker rm vol-test1 vol-test2
$ docker volume rm my-appvol-1
컨테이너 장애로 인해 DB가 중단되어도 새로운 컨테이너에 동일 볼륨을 연결하면 DB의 Table, Data 모두 동일하게 가져갈 수 있다.
# 볼륨 생성
$ docker volume create mysql-data-vol
mysql-data-vol
# 볼륨을 포함한 MySQL 컨테이너 실행
$ docker run -it --name=mysql-vtest \
> -e MYSQL_ROOT_PASSWORD=mhylee \
> -e MYSQL_DATABASE=dockertest \
> -v mysql-data-vol:/var/lib/mysql -d \
> mysql:5.7
$ docker exec -it mysql-vtest bash
bash-4.4# mysql -uroot -p # mhylee 입력
...
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| dockertest |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> use dockertest;
Database changed
mysql> create table mytab (c1 int, c2 char);
mysql> insert into mytabl values (1, 'a');
mysql> exit
bash-4.4# exit
# DB 장애를 가정하여 컨테이너 제거 뒤 동일 볼륨 지정 후 데이터 확인
$ docker stop mysql-vtest
mysql-vtest
$ docker rm mysql-vtest
mysql-vtest
$ docker run -it --name=mysql-vtest2 \
> -e MYSQL_ROOT_PASSWORD=mhylee \
> -e MYSQL_DATABASE=dockertest \
> -v mysql-data-vol:/var/lib/mysql -d \
> mysql:5.7
bash-4.4# mysql -u root -p
mysql> use dockertest;
Database changed
# 데이터 보존 확인
mysql> show tables;
+----------------------+
| Tables_in_dockertest |
+----------------------+
| mytab |
+----------------------+
1 row in set (0.00 sec)
mysql> select * from mytab;
+------+------+
| c1 | c2 |
+------+------+
| 1 | a |
+------+------+
1 row in set (0.00 sec)