Docker Volume

yjbenkang·2024년 11월 19일

Docker Container가 무슨 이유로건 중단되고 재실행된다면 그전의 데이터는 어떻게 되는걸까

이 문제를 해결하는 것이 Docker Volume

Docker Volume의 필요성

  • Docker Container가 실행되었다가 중단되면 데이터들은 어떻게 될까?
  • 특정 소프트웨어가 Docker Container를 통해 일회성으로 동작하는 것이 아니라 계속해서 동작해야 한다면 데이터가 영구적으로 보관되어야함
    • 예) 데이터베이스가 Docker Container안에서 동작한다면 ?
  • 이를 보장하는 기능이 Docker Volumes => Data Persistence
  • Docker Container내의 가상 파일 시스템과 호스트 시스템의 파일 시스템을 맵핑
    • 예) 호스트 파일 시스템의 /home/yjbenkang/logs를 Docker Container의 /var/lib/airflow/logs로 맵핑
    • 이 경우 Docker Container가 중단되더라도 모든 Airflow logs는 기록이 남게 됨

Docker Volume 예

  • Container와 Host 시스템이 특정 폴더를 공유
    • Container가 사라지더라도 데이터는 남게 하는 것

Container로 MySQL을 실행하는 경우 데이터가 저장되는 공간을 Docker Volume으로 설정

Docker Volume 정의

  • 호스트 파일 시스템 폴더를 Docker Container 파일 시스템의 폴더로 마운트하는 것
    • 호스트쪽에서 내용을 바꾸면 바로 Docker Container쪽에도 반영됨
      • 반대도 사실이지만 Volume의 속성을 잡기 나름임 (예를 들면 읽기 전용)
    • 이를 통해 Docker Container의 상태와 관계없이 데이터를 영구적으로 보관
  • 파일 시스템에서 마운트란 ?
    • 원래 마운트란 디스크와 같은 물리적 장치를 파일 시스템의 특정 위치(폴더)에 연결해주는 것을 말함
    • 예를 들어 윈도우에서 USB를 꼽으면 내 컴퓨터에 새로운 :D 혹은 :E와 같은 식으로 새로운 폴더가 생기는 것이 바로 마운트임

Docker Volume 타입

  1. Host Volumes : docker run -v를 실행할 때 쌍으로 지정한다.
  • docker run -v /home/yjbenkang/logs:/var/lib/airflow/logs
  • :앞이 호스트 파일 시스템 패스이고 뒤가 컨테이너 파일 시스템 패스
  1. Anonymous Volumes : docker run -v를 실행할 때 컨테이너 패스만 지정 (거의 안쓰임)
  • docker run -v /var/lib/mysql/data
  • 이 방식이 Dockerfile에서 사용되는 방식으로 호스트쪽에 액세스되지는 않지만 재시작해도 유지됨
  • 도커엔진이 알아서 host 시스템내에 랜덤한 이름으로 만들어서 마운트해준다.
  1. Named Volumes : docker run -v를 실행할 때 이름과 컨테이너 패스를 지정(위의 개선판)
  • docker run -v name:/var/lib/mysql/data
  • 가장 선호되는 방식임. 이 방식이 하나의 Volume을 다수의 컨테이너에서 공유하는 것도 가능하게 해준다.
  • 이 포맷으로 뒤에서 살펴볼 docker-compose에서도 사용됨
  • Volume을 Readonly로 지정하고 싶다면 ? (컨테이너가 Readonly)
    • name:/var/lib/mysql/data:ro
      default는 rw(read and write)

이미지 생성시 Docker Volume 사용법

  1. Dockerfile
  • VOLUME 명령을 통해 anonymous volume만 지정 가능 (id를 알아야만 하므로 관리가 까다롭)
  1. docker-compose
  • Host Volume이나 Named Volume을 사용하는 것이 일반적

Docker Volume 사용 예: nginx 실행

-v 옵션 없이 nginx 실행

docker run -d --name=nginx -p 8081:80 nginx
#브라우저 방문:https://localhost:8081/
docker exec --user=root -it nginx sh
#apt update
#apt install nano
#nano /usr/share/nginx/html/index.html (내용 편집: Welcome to Docker Volume)
#exit
docker restart nginx
#위의 과정을 반복해 /usr/share/nginx/html/index.html 내용 확인 시 원상복구된 것을 볼 수 있음


nginx 컨테이너를 구동해준다. name으로 별칭을 지정해주고 -p 태그로 포트를 열어준다.

접속해보면 화면이 잘뜬다.

실행된 nginx 컨테이너 안에서 쉘스크립트를 실행한다.

파일 수정에 필요한 절차를 수행해준다.(nano 설치를 위한)

title부분을 Docker Volume으로 수정했다.

다시 원상복구된 것을 확인할 수 있다. volume 설정을 안하면 이렇게 영구적이지 못하다.

-v 옵션과 함께 nginx 실행

ls -tl /Users/Documents/yjbenkang/nginx/html
#index.html
#test.html
docker run -p 8081:80 -d --name nginx_demo -v /Users/Documents/yjbenkang/nginx/html:/usr/share/nginx/html nginx

#https://localhost:8081/
#index.html 내용 수정하고 브라우저에서 재방문
#nginx를 재시작하고 내용이 유지되는지 확인


호스트 파일 경로에 nginx/html 폴더밑에 index.html와 test.html 파일을 생성한다.

v태그에 콜론 기준으로 호스트 파일 경로를 앞에, 컨테이너 파일 경로를 뒤에 입력하고 nginx 컨테이너를 실행한다.


위와 같이 호스트 파일 경로 내에서 만든 파일이 정상적으로 잘반영되었다.

호스트쪽에서 파일을 수정하고 확인을 해보자.

수정한 것이 도커내 파일에 바로 잘 반영이 된다.

이번엔 도커 컨테이너를 멈추고 지운다음에 다시 재실행했을 때도 볼륨이 유지되는지 확인해보자.


호스트 파일 경로의 파일들이 정상적으로 유지됨을 확인할 수 있다 !

Docker Volume을 docker-compose.yml에서 사용한 예

  • Airflow 예)
    volumes:
    • ${AIRFLOW_PROJ_DIR:-.}/dags/:/opt/airflow/dags
    • ${AIRFLOW_PROJ_DIR:-.}/logs/:/opt/airflow/logs
    • ${AIRFLOW_PROJ_DIR:-.}/plugins/:/opt/airflow/plugins

- 호스트 파일 시스템 : airflow-setup/dags

  • MySQL_to_Redshift_v2.py
  • UpdateSymbol_v3.py
  • UpdateSymbol.py

둘의 내용이 동일해야함

- Docker Container 파일 시스템 : /opt/airflow/dags

docker exec **** ls -tl /opt/airflow/dags
#MySQL_to_Redshift_v2.py
#UpdateSymbol_v3.py
#UpdateSymbol.py

Docker Volume 명령들

docker volume ls
#어떤 볼륨있는지 확인
docker volume rm
#특정 볼륨 확인
docker volume prune
#사용되지 않는 볼륨 삭제
docker volume inspect
#특정 볼륨 깊게 살펴볼 때
profile
keep growing

0개의 댓글