본문 바로가기
Docker

Volume / bind mount ( Container Data 공유)

by Nirah 2022. 12. 9.

Volume   /   bind mount

 

원래 컨테이너의 생명주기와 컨테이너 안의 데이터는 생명주기가 똑같다.

컨테이너를 삭제하면 내부 데이터는 사라지게 된다는 뜻이다.

이를 막기 위해 Docker에서 관리하는 Volume 기능을 통해 외부에 데이터를 따로 저장한다.

이렇게 외부에 저장되는 데이터는 다른 컨테이너에 갖다 붙일 수도 있고,

여러 컨테이너가 데이터를 공유할 수도 있다.

 

 

1. Container Data 공유의 필요성

 - Docker의 Life Cycle과는 관계없이 Container의 Data를 보관

 - Host의 Data를 Container와 공유해야 경우

 

2. Docker에서는 두 가지 방법을 제공한다.

 - Volume  : docker가 직접 volume을 관리함

 - bind-mount : Host File System이 직접 관리함

 

 

 

 

 

Volume 사용

 

도움말

docker volume --help

volume

 

볼륨 생성

docker volume create test

 

볼륨 확인

docker volume ls

 

container내의 디렉토리와 연결

( Volume  /   Bind-mount )

 

1. Volume: File System내에 존재하는 Docker Area과 Container의 디렉토리를 Mount

                  (File System내의 Docker Area =  /var/lib/docker/volumes/)

2. bind-mount : 지정한 디렉토리와 Container의 디렉토리를 직접 연결

 

아무 이미지로 컨테이너를 실행할 때 Volume 지정을 해 보겠다.

주의할 점은 볼륨을 지정할 때에 절대 경로로 선언해야 로컬/도커 구분하여 정확한 볼륨 지정이 가능하다!

두 가지 방법 중에 필요한 것을 선택해서 한다. 필자는 두 가지 다 진행 해보겠다.

 

 

1. Volume:

Docker Area경로 내에 test라는 디렉토리가 따로 생성된다.

docker run -itd -v test:/test --name a11 alpine

 

2. bind-mount :

리눅스에 만든 디렉토리에 컨테이너 내부 디렉토리를 연결해 줄 수도 있다.

mkdir /root/test1

docker run -itd -v /root/test1:/test1 --name a1 alpine

 

 

방금 생성한 도커 컨테이너로 접속해서 텍스트 파일을 생성하고 내용도 넣어보겠다.

도커 컨테이너 내부에 방금 지정한 test라는 디렉토리가 존재함을 확인할 수 있다.

docker attach a11

ls

cat > /test/test.txt
hello docker

 

 

Linux Data 저장 경로

밖의 리눅스로 나와서 다음 경로를 확인해 보면 도커 안에서 만든 데이터가 그대로 존재한다.

(컨테이너 내부의 경로와 다르게 중간에 _data가 들어있다)

 

1.  Volume:  cat /var/lib/docker/volumes/test/_data/test.txt

2. bind-mount :   cat test1/baka.txt

 

이제 컨테이너를 삭제해보겠다!

그래도 데이터가 그대로 존재하는 것을 볼 수 있다.

 

 

 

다른 Container가 Data 공유하기

 

우선 방금전 실습과 같이 리눅스 test1 디렉토리에 컨테이너의 babo1 디렉토리와 연결해서 a3 컨테이너를 실행한다. 

컨테이너에 접속하여 babo1 디렉토리 안에 baka.txt 를 만들고 다시 리눅스로 나온다.

 

docker run -itd -v /root/test1:/babo1 --name a3 alpine

docker attach a3

cat babo1/baka.txt

babo

 

방금 만든 a3 컨테이너의 Data를 공유받을 a4 컨테이너를 실행한다.

실행할 때 아까와 같은 리눅스의 test1 디렉토리에 연결한다.

 docker run -itd -v /root/test1/:/babo2 --name a4 alpine

 

a4에 접속해서 확인해보면 만들어준 babo2가 있다. 

docker attach a4

 

들어가서 확인해 보면 아까 a3 컨테이너 내부에서 만들어 준 baka.txt 가 그대로 있다.

컨테이너 a3의 babo1 디렉토리와 a4의 babo2 디렉토리는

리눅스의test1 디렉토리를 통해 서로 data를 공유하는 상태이다.

 

 

 

 

MySQL 에 Volume 적용

 

mkdir /mysql

 

docker run -itd -v /mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=It12345! --name m1 mysql:5.7

 

(inspect로 먼저 ip를 확인해와서 친다.

근데 보통 컨테이너 순서대로 할당되니까 지금같이 컨테이너가 하나인 상황은 172.17.0.2 부터 시작할게 뻔하다.)

 mysql -uroot -p -h 172.17.0.2

 

> show databases;

 

 

대략 아래와 같이 MySQL 안에 database와 table Data를 만든다.

 

그다음 다음과 같이 m1 컨테이너를 삭제해버린다.

그래도 m1 컨테이너를 실행할 때 지정한 /mysql 디렉토리 아래에 관련 데이터가 다 남아있다.

 

이제 이 데이터를 다른 MySQL 컨테이너에서 읽어들일 수 있는 지 확인해볼 것이다.

똑같이 /mysql/ 디렉토리를 지정해 보자.

docker run -itd -v /mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=It12345! --name mm1 mysql:5.7

 

 

다음과 같이 새 컨테이너에서도 잘 돌아간다.

 mysql -uroot -pIt12345! -h 172.17.0.2

 

 

 

 

volume과 bind-mount를 구분해야 하는 이유

 

aaa : docker에서 관리하는 볼륨으로 새로 생성 됨

docker run -itd -b aaa:/aaa --name a1 alpine

 

Volume은 docker에서 관리하기때문에 로컬에 생성이 안 된다.

 

Volume은 docker가 관리하기 때문에 여기 출력 된다.

docker volume ls

docker attach a1

aaa가 보인다.

'Docker' 카테고리의 다른 글

Docker : Link  (0) 2022.12.09
Docker : Network  (0) 2022.12.09
Docker : MySQL:5.7 +php 설치  (0) 2022.12.09
다른 container로 image 옮기기 (export, import, 환경변수)  (0) 2022.12.08
HAProxy - WEB 연습  (0) 2022.12.08