[도커] - 도커의 데이터 지속(바인드 마운트, 볼륨)

yeom yaloo·2024년 2월 14일
0

FISA

목록 보기
54/61
post-thumbnail

데이터 지속

[컨테이너 특징]

1. 소멸성

  • 도커의 컨테이너는 삭제할 때 데이터가 같이 소멸되는 현상이 일어난다.
    • 이때 컨테이너의 삭제에도 해당 데이터가 소멸되지 않게 하기 위해서 마운트라는 기술을 쓴다.

[마운트]

1. 마운트란?

  • 컨테이너 변경에도 손실되면 안 되는 정보를 보존할 있게 하는 방법이 마운트이다.
  • 데이터 유지를 위한 기술이 마운트이다.
  • 데이터베이스의 데이터 디렉토리나 서버의 첨부 파일 디렉터리처럼 컨테이너 변경에도 없이지면 안 되는 자료를 보존할 때 사용하는 방법으로 쓰인다.

2. 종류

  • 바인드 마운트
  • 볼륨 마운트
  • 마운트의 저장 방식에 따라서 바인드 마운트와 볼륨 마운트로 나뉜다. (영역을 먼저 만들어두고 마운트를 하면 볼륨 방식이고 그냥 바로 마운트 작업을 진행하면 바인드 마운트이다.)

바인드 마운트

[호스트와 컨테이너의 데이터 연결]

1. 바인드 마운트?

  • 데이터 삭제, 수정, 생성이 모두 연결되어 있어서 컨테이너와 연결된 호스트에 있는 파일의 생성, 수정, 삭제 모두 같이 진행된다.
  • 또한 볼륨과 달리 해당 작업은 Docker area라고 불리는 도커 내부의 공간에 따로 해당 바인드 작업이 진행되는 공간을 확보하지 않고 진행하기 때문에 -v 플래그를 사용하더라도 바인드 마운트가 된다.

[데이터를 유지하는 기술]

1. 바인드 마운트가 필요한 이유

  • 컨테이너가 외부에 있는 데이터를 다룰 수 이게 하기 위한 기술이다.
  • 컨테이너가 종료되어도 데이터를 유지할 수 있다.
  • 실시간 파일 수정동기화할 때 사용한다.
    • 이를 데이터 퍼시스턴스(data persistency)라고 한다.
    • 컨테이너 생성 시 스토리지의 특정 영역을 컨테이너와 연결할 수 있고 이를 스토리지 마운트라고 하는데 컨테이너와 스토리지 영역이 연결되면 컨테이너에 스토리지가 마운트 됐다고 한다.

2. 바인드 마운트 컨테이너 생성

  • -v 또는 --mount 플래그 사용해서 해당 마운트 컨테이너 생성

마운트 컨테이너 생성명령어

  • docker run --name <컨테이너이름> -d -p <포트포워딩:포트포워딩> -v <호스트디렉토리경로><컨테이너디렉토리경로> <이미지명 or 이미지아이디>

2-1. 이미지 다운로드

  • docker pull <다운받으려는 이미지>: 이미지 다운로드
  • docker images: 다운로드 받은 이미지 목록 확인

2-2. 테스트 경로 생성

  • mkdir dirName: 원하는 디렉토리명 설정 후 생성
  • cd dirName: 해당 이름을 가진 디렉토리로 이동

2-3. host 폴더와 container 폴더를 마운트하여 컨테이너 생성

  • docker rub --name mynginxserver -d -p 80:80 -v /home/username/myHostStorage:/usr/share/nginx/html nginx
  • mynginxserver라는 이름으로 받아온 이미지를 이용해서 도커 컨테이너를 구동시키고 이때 포트 매핑과 함께 이미 저장되어 호스트 내부에 있는 파일과 도커 내부에 저장할 위치를 정해서 바인드 마운트 작업을 진행한다.

2-4. 컨테이너 내부의 파일 존재 여부 확인

  • docker exec <container id> sh -c 'ls /usr/share/nginx/html
  • 해당 명령어를 사용하면 직접 컨테이너 내부로 들어가지 않고도 확인 할수 있다.

2-5. curl 명령어로 확인

  • curl localhost:8080/index.html

[정리]

1. 바인드 마운트에 대해서..

바인드 마운트 작업의 경우엔 생성, 수정, 삭제 등의 라이프사이클을 함께 하기 때문에 호스트 내부에 저장한 파일의 변동이 있을 때 이를 컨테이너 내부에서도 같이 따라간다.


볼륨

[도커가 직접 관리하는 볼륨]

1. 바인드와 볼륨 방법의 차이

  • 이때 볼륨과 바인드 작업 둘다 컨테이너를 생성할 때 -v라는 명령어를 사용함을 알수 있다.
  • 이때 둘의 차이점은 미리 저장 공간을 생성하는지 여부 차이다. -v 명령어를 이용해서 컨테이너를 생성하면 바인드로, volume을 생성해두고 해당 volume 공간을(host의 /var/lib/docker/volumes/nginx-volume 위치에 있다.(해당 volumes/다음 디렉토리명은 내가 생성한 볼륨명을 따라간다.)) 이용해서 컨테이너를 생성하면 볼륨으로 칭한다.
  • 이때 -v 플래그가 아닌 -mount를 사용하면 더 자세하게 마운트 작업이 가능하다.
  • 또한 바인드는 생성, 삭제, 수정이 함께 이뤄지는 방법이라면 볼륨의 경우엔 그렇지 않다.

1. 볼륨이란?

  • 도커가 직접 관리하며 컨테이너에 호스트 공간을 제공한다.
    • 그림을 살펴보면 Docker area에 해당 공간을 할당해서 컨테이너를 생성할 때 해당 위치(=host 위치)와 컨테이너 위치를 설정해주는 것을 살펴볼 수 있다.
  • 해당 볼륨은 컨테이너와 연결해서 사용한다.
  • 여러개의 컨테이너가 하나의 볼륨을 공유한다.

[볼륨 생성 순서]

  • 볼륨 확인 명령어 docker volume ls
  • 볼륨 삭제 명령어 docker rm <볼륨아이디>

0. 호스트 폴더 생성

  • mkdir volstorage

1. 볼륨 생성

  • docker volume create nginx-volume
    • nginx-volume 이라는 이름을 가진 볼륨 생성4
    • 생성된 볼륨의 위치는 host 내부의 /var/lib/docker/volumes/nginx-volume
    • 생성된 볼륨이 있는 공간에서 사용해서 해당 컨테이너를 생성하기 때문에 -v 플래그를 사용하더라도 볼륨을 이용한 컨테이너 생성에 해당한다.

1-1. 볼륨 생성 확인

  • docker volume ls
  • docker volume inspect nginx-volume: 자세하게 확인

1-2. 도커 파일 내부의 볼륨 데이터 확인

  • sudo ls -l /var/lib/docker/volumes
  • sudo ls -l /var/lib/docker/volumes/nginx-volume/_data: 볼륨 생성 후 도커 내부에 생성된 볼륨 데이터 확인 (처음엔 데이터가 없다.)

1-3. 호스트 내부의 볼륨 저장소에 파일 복제

  • sudo cp fisa.html /var/lib/docker/volumes/nginx-volume/_data/html
  • 해당 작업을 진행하면 nginx에도 해당 html 파일이 복제됨을 알수 있다.

1-4. 도커 컨테이너 실행과 볼륨 마운트 진행

-docker run --name mynginxserver -d -v nginx-volume:/usr/share/nginx/html -p 8080:80 nginx

[데이터를 유지하는 기술]

1. 볼륨 마운트가 필요한 이유

  • 컨테이너의 종료, 삭제에도 데이터가 사라지지 않게 해주는 역할을 한다.
  • 컨테이너간의 데이터 교환에도 도움을 준다.
  • 컨테이너와 호스트간 파일 교환이 가능해진다.

2. 볼륨 마운트와 바인드 마운트의 차이점

  • 볼륨 마운트의 경우엔 미리 저장할 공간을 도커 내부 공간에 만들고 이 공간을 이용해서
profile
즐겁고 괴로운 개발😎

0개의 댓글