Docker

[공부] Docker 정리 - 3. Docker Volume(도커 볼륨) 개념 이해

썸머a 2024. 7. 24. 16:53

도커 볼륨(Docker Volume)

컨테이너 내에 데이터를 저장하지 않고 호스트의 저장공간을 사용하여

여러 컨테이너가 해당 공간의 데이터를 공유하는 것


⭐ 도커 컨테이너의 특징

도커 컨테이너는 이미지가 변경되면 해당 이미지로 기존에 실행하던 컨테이너를 수정하는 것이 아니라 새로운 이미지로 새로운 컨테이너를 띄워 교체하는 방식을 사용한다.

이 경우 컨테이너 내부에 저장되어있던 데이터들이 같이 삭제되는 현상이 발생하는데 저장공간이 필요한 프로그램이 아니라면 상관없을지 모르나 데이터를 저장하는 것이 주 목적인 데이터베이스 프로그램들의 경우 기존의 데이터가 날아가면 여러 불상사가 날 수 있다.

 

🔍 실제 cmd에서 확인해보기

1. mysql 실행 후 정상 실행 확인

제대로 입력했다면 위와 같이 마지막 cmd 라인이 mysql> 로 시작하게 된다 (^C 는 캡쳐하다 중간에 잘못 눌러 오타이므로 무시)

 

2. mysql에서 데이터베이스 생성

 

3. 현재 해당 컨테이너 삭제 후 컨테이너 재생성

 

4. 해당 컨테이너 내부에서 db 확인

 

위와 같이 컨테이너 내에서 생성한 데이터는 컨테이너 내부에 저장되기 때문에

컨테이너를 삭제하는 경우 같이 삭제되며, 같은 이미지를 사용하는 다른 컨테이너와도 연동되지 않는다.

 

그냥 간단하게 내 로컬 PC에 저장한 데이터를 친구 로컬 PC에서 확인하거나 접근할 수 없고

내 PC가 망가지면 해당 데이터를 더이상 찾을 수 없게 되는 것과 마찬가지라고 보면 된다.

 

근데 이제 우리가 생각하는 컴퓨터에서는 mysql의 새로운 버전이 생겼을 때 mysql만 업데이트 하면 되지만

도커에서는 mysql이 업데이트 되었을 때(mysql 이미지에 변경사항이 생겼을 때)

낮은 버전이 깔려 있던 기존 컴퓨터(기존 컨테이너)를 사용하지 않고

높은 버전이 깔린 새로운 컴퓨터(새로운 컨테이너)를 들여오는 것과 비슷하다고 보면 되는 것 같다.

그냥 생각해도 프로그램 업데이트했다고 기존에 내가 저장해둔 데이터를 전부 날렸다고 생각하면....

상상만 해도..........ㅎ...........😇

 

아무튼 이런 도커 컨테이너의 문제점을 해결하기 위한 볼륨 개념이 존재한다.

컨테이너 내부에 데이터를 저장하는것이 아니라 호스트의 저장공간을 공유해서 사용하는 형태로

컨테이너를 삭제해도 호스트의 저장공간에 데이터가 남아있어,

새로운 컨테이너에서도 호스트의 저장공간에 있는 데이터를 사용할 수 있는 방식이다.

 

이미지 출처 : 비전공자도 이해할 수 있는 Docker 입문/실전 교재

 

🌠 볼륨 사용 명령어

docker run -v [호스트 절대경로]:[컨테이너 절대경로] [이미지명]:[태그명]

 

-v 옵션을 사용하여 내 컴퓨터의 폴더와 컨테이너 내부의 폴더를 연동시킬 수 있다.

양쪽의 폴더를 지정하여 연동하면 컨테이너에서 데이터 저장시 내 컴퓨터 폴더에서 같은 데이터가 저장된다.

(개인적으로 폴더를 연동한다는 개념이 내가 이해하기 편한 건 것 같아서 그렇게 작성함. 실제 현업에서 연동한다고 표현하진 않을 것이다.)

 

🌠 볼륨 사용 규칙

1. 호스트의 경로에 디렉토리나 파일이 존재하지 않는 경우 호스트의 경로에 새로 디렉토리를 만들고 컨테이너 내부의 디렉토리와 파일들을 호스트의 경로에 복사한다

이미지 출처 : 비전공자도 이해할 수 있는 Docker 입문/실전 교재

내가 지정한 호스트 경로(내 컴퓨터 경로)에 파일이 존재하지 않는 경우 컨테이너 내부의 파일들이 호스트 컴퓨터로 복사된다.

주로 새로운 컨테이너를 볼륨을 이용하여 띄울때 초기 설정 파일들이 넘어가게 된다.

 

🔍 실제 cmd에서 확인해보기

1) 일단 볼륨으로 연동시킬 디렉토리를 내 컴퓨터에서 만들어 준다.

경로 복잡하게 하기 귀찮아서.. 그냥 c드라이브에 dockertest 폴더 하나 생성해둠

 

2) 폴더 만들었으면 cmd에서 해당 경로로 이동한 다음 mysql을 -v 옵션을 이용해 실행해준다.

이전에 혹시 띄워놓은 컨테이너가 있다면 종료하거나 해당 컨테이너 삭제 이후 진행해야함

내가 실행한 명령어는 다음과 같다.

docker run -e MYSQL_ROOT_PASSWORD=password123 -p 3306:3306 -d -v c:\dockertest\mysqltest:/var/lib/mysql mysql

 

방금 만든 폴더 하위에 mysqltest라는 디렉토리를 호스트 경로로 지정했다.

해당경로에 mysqltest라는 폴더가 없으면 해당이름으로 폴더를 자동생성하며, 폴더가 존재하는 경우 해당 폴더를 찾아가게 된다.

 

3) 새로 실행된 컨테이너에서 동일하게 mysql 실행 후 mydb 생성

 

4) 해당 컨테이너 삭제한 뒤 새로운 컨테이너를 생성하고 데이터를 확인

단 이때 새로 생성하는 컨테이너의 볼륨 경로는 동일하게 설정

 

신규생성한 컨테이너에서 이전에 생성해둔 mydb가 남아있는 모습을 확인할 수 있음.

그리고 내가 볼륨을 설정하기 위해 만들어둔 폴더에 가보면

 

내가 지정했던 이름 mysqltest로 폴더가 만들어진걸 확인할 수 있고 해당 폴더 안에

뭔가 데이터가 쌓여있는 모습을 볼 수 있다.

 

이는 위에 1번 설명처럼 내가 지정한 내 컴퓨터의 경로(호스트경로)에 디렉토리나 파일이 존재하지 않아

컨테이너 내부의 경로(/var/lib/mysql)에 있던 데이터들이 복사되어 저장된 것이다.

 

별도로 스샷을 찍진 않지만 컨테이너 내부 해당 경로를 찾아가보면

내 컴퓨터의 경로에 있는 내용과 동일한 파일들이 있는 것을 확인할 수 있다.

 

2. 호스트의 경로에 이미 디렉토리나 파일이 존재하는 경우 호스트의 디렉토리가 컨테이너의 디렉토리를 덮어씌운다.

이미지 출처 : 비전공자도 이해할 수 있는 Docker 입문/실전 교재

내가 지정한 호스트 경로(내 컴퓨터 경로)에 파일이 존재하는 경우 컨테이너 내부의 폴더로 파일이 덮어씌워지며 복사된다.

이때 주의해야 할 점은 만일 이전의 초기설정파일이 내 컴퓨터에 있는 경우 해당 설정이 그대로 복사되기 때문에

만일 초기설정값을 바꿔서 컨테이너를 새로 띄워야 한다면 다른 방식으로 실행해야 한다.

 

🔍 실제 cmd에서 확인해보기

1) 위에서 실습한 것과 같이 기존 컨테이너를 삭제하고 볼륨 경로를 동일하게 신규 컨테이너 생성한다.

단, 이번에는 MY_ROOT_PASSWORD 환경변수 값을 1234로 변경한 뒤 실행

 

2) 비밀번호 환경변수를 1234로 설정하여 실행하였으므로 mysql에서 1234로 접속해본다.


그러면 접근할 수 없다면서 오류가 나는데 이는 패스워드가 맞지 않기 때문이다.

분명히 컨테이너를 생성할때 MY_ROOT_PASSWORD 패스워드 환경변수를 1234로 설정했음에도 불구하고 접속이 안 된다.

근데 mysql은 또 정상적으로 실행이 되고 있다.

그럼 이전에 컨테이너 만들때 썼던 password123으로 접속을 시도하면

정상적으로 잘 접속되는 것을 볼 수 있다

(비밀번호는 cmd창에서 보이지 않으니 차례대로 입력해보는 것 추천)

 

왜 이런 현상이 발생하느냐 하면

위에서 볼륨에 데이터가 저장되고, 새로운 컨테이너도 이 데이터에 접근할 수 있다는 것을 테스트하면서

[c:\dockertest\mysqltest] 경로에 데이터가 컨테이너에서 복사되어 생성된 것을 확인했다.

여기 저장된 내용 중에는 mysql의 초기 설정값(root계정의 password값 포함)이 존재하는데

이는 맨 처음 컨테이너에서 복사된 값이다. (가장 먼저 만들었던 컨테이너의 root 비밀번호 : password123)

 

컨테이너를 생성할 때 볼륨 규칙이 호스트경로[c:\dockertest\mysqltest]에 디렉토리나 파일이 존재하는 경우

호스트 경로를 컨테이너의 경로로 덮어씌운다는 말이 바로 이 뜻이다.

호스트에 기존에 존재하던 비밀번호값(password123)컨테이너의 비밀번호값(1234)를 덮어씌우면서

현재 컨테이너의 mysql 설정값이 호스트의 비밀번호값을 따라가게 된 것.

이렇듯 볼륨을 사용하는 경우 프로그램의 초기설정값 역시 맨 처음 생성된 값(호스트에 최초 저장된 값)을 따라가기 때문에

만일 초기 설정이 변경되어야 하는 경우라면 다른볼륨 경로를 지정하거나, 호스트 경로의 초기설정 파일을 조정해야 한다.

 

사실 위에서 실습한 내용 중 mydb가 새로운 컨테이너에 떠있는 경우도 마찬가지이다.

첫 컨테이너에서 호스트 경로로 데이터를 복사한 뒤 mydb를 저장해두었고

해당 데이터를 이후에 만든 컨테이너들의 경로에 호스트의 데이터들이 그대로 덮어씌워지면서 mydb가 존재했던 것.

 

사실 개념을 이해하는 것 자체는 어렵지 않은데 말로 쓰려니 더 헷갈리는 것 같다 ㅋㅋㅋ

그래도 호스트와 컨테이너간의 데이터 교환에 대한 개념을 서로 헷갈리지 않아야 할 것 같아서

내 머리속 정리하는 겸 블로그로도 정리하기.