홍카나의 공부방

[Docker] Docker Volume 본문

Data Engineering/Docker

[Docker] Docker Volume

홍문관카페나무 2023. 6. 27. 16:25

Docker Volume이란?

 

Docker Container가 실행되었다가 중단이되면, 그 안에 쌓여있던 데이터들은 모두 유실된다.

그런데 컨테이너가 버그로 인해 중단되는 등 의도치 않게 종료될 수 있고,

다시 실행을 했을 때 데이터들이 유지되기를 원할 수도 있다.

 

혹은 데이터베이스를 Docker Container 안에서 동작 시킨다면

컨테이너 실행 중지 이후, 다시 실행시킬 때 데이터가 유지되어야 할 것이다.

 

이럴 때 사용하는 것이 Docker Volume이다.

데이터를 영구적으로 보관하기 위해 Docker Volume이란게 사용된다.

 

 

대표적인 방법으로는 Docker Container내의 가상 파일 시스템과 호스트 시스템의 파일 시스템을 맵핑하는 것이다.

ex) host 파일 시스템의 /home/hongcana/logs를 Docker Container의 /var/lib/ariflow/logs로 맵핑하는 것이다.

이 경우, Docker Container가 중단되더라도 모든 Airflow logs는 기록(데이터)이 남게 된다.

 

Mount한다고 하는데, File System에서 Mount는 USB와 같은 물리 장치를 파일 시스템의 특정 위치에 연결하는 것이다.

Mount되면, Host쪽에서 내용을 바꾸면 Docker Container쪽에도 적용된다. ( 읽기 전용으로 이 로직을 바꿀 순 있다. )


Docker Volume 유형

 

1. Host Volumes

docker run -v /home/hongcana/logs:/var/lib/airflow/logs

콜론 앞이 호스트 파일 시스템 Path, 콜론 뒤가 컨테이너 파일 시스템 Path이다.

경로를 둘 다 직접 지정해주는 방식이다.

 

2. Anonymous Volumes

docker run -v /var/lib/mysql/data

콜론이 없이 path하나만 지정되는데,

Host 시스템마다 다르게 Docker engine이 특정 폴더를 랜덤하게 Path로 지정해서 Mount 해준다.

잘 안쓴다. 이름이 따로 지정되지 않고 컨테이너 패스만 지정되기 때문이다.

Dockerfile의 VOLUME 명령으로는 anonymous volume 밖에 지정하지 못한다.

 

 

3. Named Volumes

docker run -v name:/var/lib/mysql/data

가장 선호되는 방식이다. 이름과 컨테이너 패스를 각각 콜론 앞뒤로 지정해주는 방식이다.

이 방식은 하나의 Volume을 다수의 컨테이너에서 공유하는 것도 가능하게 해준다.

뒤이어 살펴볼 docker-compose에서도 사용된다.

 

dockerfile과 다르게 docker-compose로는 Host Volume, Named Volume을 사용할 수 있다.

그래서 docker-compose로 Docker Volume을 관리한다.

 


Docker Volume 사용 예시

 

웹 서버의 일종이고, 로드밸런서로도 사용하는 Nginx를 실행해보겠다.

dockerhub에서 nginx image를 다운받고, host 포트번호를 8081, 컨테이너 포트번호는 80으로 할당하여 실행하겠다.

docker run -d --name=nginx -p 8081:80 nginx

위 명령어를 실행하면 local에 nginx라는 image가 존재하지 않을 경우

dockerhub에서 이미지를 가져온다.

run 실행이 정상적으로 되었으면, localhost:8081 주소로 들어가면 nginx 페이지가 나올 것이다.

그리고 docker exec --user=root -it nginx sh

nano /usr/share/nginx/html/index.html에 들어가서 h1태그 내용을 수정하고, 저장했다.

 

 

그리고 docker restart nginx를 해봐서 다시 저 html에 들어가면... 변경한 내용이 원상복귀 된것을 알 수 있다.

docker container를 중지하고 재실행했기 때문에 변경 내용이 유실된 것이다.

 

변경 내용 유실을 막기 위해서 Docker Volume을 사용해야 한다.

docker-compose 내용에서 이를 함께 알아보겠다.

반응형