docker

[docker] Volume

수수한개발자 2023. 10. 23.
728x90

 

Volume 기술 이해

- Docker에서 제공하는 볼륨 기술은 컨테이너 애플리케이션에서 생성되고 사용되는 데이터를 유지, 보존하기 위한 메커니즘을 제공한다. 컨테이너가 삭제되어도 볼륨은 독립적으로 운영된다.

 

- 볼륨은 Docker HostOS와 컨테이너에서 직접 접근 가능하다.

 

- 일반적으로 컨테이너 내부의 데이터는 컨테이너의 생명주기와 연관되어 종료시 삭제되지만, 이를 지속적(persistent)으로 보존하기 위한 방법으로 volume 기술을 사용한다.

 

 

볼륨 방식은 3가지가 있다.

bind mount, volume, tmpfs mount

 

Bind Mount

- Bind Mount 기법은 디렉터리 뿐만 아니라 파일 mount도 가능하다.

   " 호스트 파일 시스템 절대 경로" : "컨테이너 내부 경로" 를 직접 마운트하여 사용한다,

사전에 연결할 파일 또는 디렉터리를 사용자가 생성하면 해당 호스트 파일 시스템의 소유가 권한으로 연결이 되고 존재하지 않는 경우 자동생성되지만 루트 사용자 소유가 된다.

 

- 사전 정의 없이 컨테이너 실행시 자동 생성되고 컨테이너 제거시 자동해제 되지만 생성된 호스트 디렉터리와 데이터는 보존된다.

- 데이터를 호스트의 지정된 디렉터리에서 관리한다.

 

 

Docker volume

- Docker에서 권장하는 방법으로 docker volumne create 볼륨명 으로 생성한다.

- docker vloume 명령은 docker root dir(/var/lib/docker)영역에 volume 영역을 만들어 컨테이너 내부 경로와 연결         (mount) 한다.

- 새 볼륨으로 지정될 영역에 데이터를 미리 채우고 컨테이너에 연결하면 컨테이너 내에서 바로 데이터 사용이 가능하다.

- docker vloume은 볼륨 데이터를 Docker(/var/lib/docker)가 관리한다.

 

 

tmpfs mount

- Docker hostOS의 memory에서만 지속되고 해당 컨테이너가 중지되면 tmpfs mount 연결 해제와 함께 기록된 데이터도 사라진다.

 

- 이 방식은 컨테이너 간의 공유 설정은 안되고, Linux 기반 도커에서만 지원된다.

- 임시로 사용하고 기록되지 않아야 되는 파일, 데이터 등을 사용할 경우 유용하다.

 

 

 

 

 

Docker volume 만들기

명시적 볼륨 생성

docker volume create mysql-data

docker volume ls

docker volume inspect mysql-data


docker volume inspect mysql-data
[
    {
        "CreatedAt": "2023-10-23T15:28:07+09:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/mysql-data/_data",
        "Name": "mysql-data",
        "Options": null,
        "Scope": "local"
    }
]

위와 같이 마운트 포인트를 확인할 수 있다.

 

 

mysql 이미지 다운 및 실행

docker run --platform linux/amd64 -d --name mysqldb \
-e MYSQL_ROOT_PASSWORD=1234 \ 
-e MYSQL_DATABASE=jisu \ 
-v mysql-data:/var/lib/mysql \ 
mysql:5.7-debian

 

맥에서의 문제점은 도커가 맥 OS 위의 vm 리눅스위에서 도커가 돌아가는것이다.

그렇기 때문에 볼륨 마운트포인트의 위치가 없다.

그래서 구글에 검색해봤고 다음과 같은 글을 발견하였다.

https://stackoverflow.com/questions/38532483/where-is-var-lib-docker-on-mac-os-x/65645462#65645462

 

Where is /var/lib/docker on Mac/OS X

I´m looking for the folder /var/lib/docker on my Mac after installing docker for Mac. With docker info I get Containers: 5 ... Server Version: 1.12.0-rc4 Storage Driver: aufs

stackoverflow.com

 

다음과 같은 명령어를 치면 된다고 한다.

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

모든권한을 준다는 --privileged 옵션과 host와 동일하게 한다는 의미로 vm 에 접속하여 볼륨을 확인할 수 있습니다.

 

 

그리고 mysql 에 접속해줍니다.

docker exec -it mysqldb bash

df -ha

 

 

마운팅 된것을 확인 할 수 있습니다.

 

 

암시적 볼륨 생성

docker run --platform linux/amd64 -d --name mysqldb \
-e MYSQL_ROOT_PASSWORD=1234 \
-e MYSQL_DATABASE=jisu \
-v /var/lib/mysql \
mysql:5.7-debian


docker inspect mysqldb
...

"Mounts": [
            {
                "Type": "volume",
                "Name": "2cf2c752f1d0a012737d0201caaa7a65c6629dc0308ea9477f1f51db666e4334",
                "Source": "/var/lib/docker/volumes/2cf2c752f1d0a012737d0201caaa7a65c6629dc0308ea9477f1f51db666e4334/_data",
                "Destination": "/var/lib/mysql",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        
...

 

위의 Name으로 값이 들어와있습니다.

docker volume ls
DRIVER    VOLUME NAME
local     2cf2c752f1d0a012737d0201caaa7a65c6629dc0308ea9477f1f51db666e4334

volume 에서도 똑같은 값이 확인 됩니다.

도커에서도 그렇고 기본적으로 이름이 너무 길기 때문에 1번 방법같이 명시적으로 볼륨을 생성하는것을 권장한다.

 

 

 

data container

여러 컨테이너에 데이터를 공유하고자 하는 경우 데이터 컨테이너 or 볼륨 컨테이너를 만들고 

"--volumes-form 공유 컨테이너명" 옵션을 사용하여 볼륨을 공유할 수 있다.

 

docker create -v /share-data --name=share-container ubuntu:14.04
docker ps -a | grep share

별도의 데이터 컨테이너이기 때문에 프로세스가 필요없어 우분투 컨테이너만 만들어줍니다.

 

docker run -it --volumes-from share-container --name=data-1 ubuntu:14.04 bash

위의 컨테이너와 볼륨을 공유하는 컨테이너를 만들어주면 공유하게 됩니다.

 

 

이제 위의 컨테이너를 삭제하고 data-2번의 컨테이너를 만들어 줍니다.

docker run -it --volumes-from share-container --name=data-2 ubuntu:14.04 bash

 

컨테이너를 삭제해도 호스트에서 데이터를 공유하고 컨테이너끼리 볼륨을 공유하고 있기때문에 파일을 읽을 수 있게 됩니다.

 

 

 

DB container의 데이터 지속성을 위한 Volume 구성

백업 및 데이터 공유를 위해 데이터베이스를 공유해야될 상황일때 사용하기 좋다.

동일한 이미지에 대한 태그, 즉 버전이 달라도 데이터 연결이 가능합니다.

mysql 컨테이너에 접속합니다.

컨테이너 생성
docker run --platform linux/amd64 -d --name mysqldb 
-e MYSQL_ROOT_PASSWORD=1234 
-e MYSQL_DATABASE=jisu 
-v ${PWD}/mysql-data:/var/lib/mysql 
mysql:5.7-debian

컨테이너 접속 
docker exec -it mysqldb bash
mysql -uroot -p
1234

 

create table dockerclass (classid int, classname varchar(50));
insert into dockerclass values (10,'docker container CI/CD');
select * from dockerclass;

 

이제 볼륨마운트 및 테이블을 생성했으니 컨테이너를 삭제해줍니다.

docker stop mysqldb
docker rm mysqldb

 

이제 다시 같은 볼륨 영역으로 DB컨테이너를 생성해줍니다.

docker run --platform linux/amd64 -d --name mysqldb 
-e MYSQL_ROOT_PASSWORD=1234 
-e MYSQL_DATABASE=jisu 
-v ${PWD}/mysql-data:/var/lib/mysql 
mysql:5.7-debian

이제 테이블 및 파일이 이전이 됩니다.

 

 

엄청 획기적인 기능이라고 생각합니다. 소프트웨어를 지우고 다시 깔았는데 모든 데이터가 이전되었습니다.

 

728x90

댓글