TIL

3.2.3도커 볼륨 활용

3.2.3 도커 볼륨 활용

도커 볼륨 타입 - volume

# 볼륨 생성
$ 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

도커 볼륨 타입 - bind mount

도커 볼륨 타입 - tmpfs mount

도커 볼륨 활용 - DB 데이터 지속성 유지

컨테이너 장애로 인해 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)