데이터 지속
[컨테이너 특징]
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. 호스트 폴더 생성
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. 볼륨 마운트와 바인드 마운트의 차이점
- 볼륨 마운트의 경우엔 미리 저장할 공간을 도커 내부 공간에 만들고 이 공간을 이용해서