도커에서 데이터 관리
- 기본적으로 컨테이너에 생성되는 모든 파일은 컨테이너 레이어에 저장된다.
- 이 데이터들은 컨테이너와 함께 삭제되는 런타임 데이터인데, 이 데이터를 영구적으로 저장하려면 반드시 볼륨을 사용해야 한다.
- 도커에서 볼륨을 사용하는 방법은 Bind Mount 와 볼륨(Volume) 두 가지 방법이 있다.
Bind Mount 소개
- 초기 도커부터 사용했던 방식
- 호스트의 특정 디렉토리와 컨테이너의 디렉토리를 연결하는 방식
- Bind Mount 는 쉽게 사용할 수 있지만 도커에 의해 관리되지 않기 때문에 따로 기록하지 않으면 관리하기가 쉽지 않음
- 성능이 뛰어나지만, 호스트의 파일 시스템에 대한 의존도가 높음
- 만약 애플리케이션을 개발한다면 Bind Mount 보다 볼륨을 사용하는 것을 권장
- Bind Mount 는 호스트의 민감한 파일까지 접근할 수 있으므로 보안 측면에 문제가 발생할 수 있음
Bind Mount 관한 사용 사례
- 호스트와 컨테이너가 /etc/reslov.conf 와 같은 설정 파일을 공유할 때
- 호스트와 컨테이너가 개발환경 사이에서 소스 코드나 빌드 아티팩트를 공유할 때
- 호스트와 파일 또는 디렉토리 구조가 컨테이너의 Bind Mount와 일치하도록 보장된 경우
볼륨(Volume) 소개
- 도커에 의해 관리되는 스토리지
- docker 명령을 사용하여 생성할 수 있고 사용하지 않으면 한꺼번에 삭제할 수 있음
- 이미지의 Volumes 부분에 어떤 값이 지정되어 있으면 컨테이너로 실행할 때 볼륨을 지정해야 함
- 그렇지 않으면 임의의 이름으로 볼륨을 생성하고 이런 볼륨은 어떤 데이터를 저장하는지 저장하고 있는지 모르기 때문에 관리가 어려움
- 볼륨 Bind Mount 와 다르게 다양한 드라이버를 지원
볼륨 관한 사용 사례
- 다수의 실행 중인 컨테이너 사이에 데이터를 공유할 때
- 컨테이너에서 호스트 구성을 분리할 때
- 컨테이너 데이터를 원격의 호스트 또는 클아우드 업체를 저장하고 싶을 때
- 다른 호스트로 데이터를 백업하거나 복원할 때
Bind Mount 사용
[root@docker ~]# mkdir ~/bm1 ; touch ~/bm1/fileA.txt
[root@docker ~]# docker run -itd --name os3 -v /root/bm1:/tmp/mount centos
f99b3ded428321c27eaa31bb60200121c9101953717f61d8984251d67dc7159b
[root@docker ~]# docker exec os3 ls /tmp/mount
fileA.txt
- Bind Mount를 사용하기 위해 먼저 디렉토리와 파일을 생성
- 실핼 중인 컨테이너에는 Bind Mount를 연결할 수 없고, 반드시 컨테이너를 실행하거나 생성하면서 연결해야 함.
- 컨테이너에 Bind Mount를 사용하려면 docker run 명령 중 -v 옵션을 사용
- 마운트 할 로컬 디렉토리를 컨테이너에 덮어쓰게 됌.
- 로컬:/bindMount 비어있음
- centos 이미지 컨테이너 /tmp/mount/ 마운트함
- 컨테이너 tmp/mount/ 는 로컬의 빈 디렉토리로 초기화 됌.
볼륨(volume) 사용
[root@docker ~]# docker volume create --help
Usage: docker volume create [OPTIONS] [VOLUME]
- 볼륨은 docker volume 명령으로 생성할 수 있음
- 이 볼륨들은 /var/lib/docker/volumes 에 저장되며, 이 위치는 호스트에서 접근하는 것을 권장하지 않음
- Bind Mount와 마찬가지로 도커 볼륨도 컨테이너를 실행하거나 생성하면서 볼륨을 연결해야 함, 옵션은 -v 동일
vol1 볼륨을 생성하고 확인
[root@docker ~]# docker volume create vol1
vol1
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
...
local vol1
[root@docker ~]# docker inspect vol1
[
{
"CreatedAt": "2021-06-02T05:13:48+09:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/vol1/_data",
"Name": "vol1",
"Options": {},
"Scope": "local"
}
]
centos 이미지로 os4 컨테이너를 실행하면서 vol1 볼륨을 os4 /tmp/volume 에 연결
[root@docker ~]# docker run --name os4 -itd -v vol1:/tmp/volume centos
dbbaa0c18d296bf0af110a5f6694c30dfd56fe78706573fc97bca160ff58e47a
- 현재는 vol1에 아무런 데이터가 없기 떄문에 os4 컨테이너의 /tmp/volume 의 내용을 확인해도 아무것도 없음
http 이미지로 web3 컨테이너를 생성하면서 vol1 을 연결
[root@docker ~]# docker run --name web4 -itd -v vol1:/usr/local/apache2/htdocs:ro httpd
a875bb8d36b231a96c4ed1a8ef9d8c346de750f857ab91d3902b253777eb6829
[root@docker ~]# docker exec os4 cat /tmp/volume/index.html
<html><body><h1>It works!</h1></body></html>
- httpd 이미지로 생성된 모든 컨테이너는 /usr/local/apache2/htdocs 디렉토리에 index.html 파일이 존재
- 만약 web3 컨테이너가 vol1 볼륨에 성공적으로 연결되었다면 os4 컨테이너의 /tmp/volume 에서도 index.html 파일을 확인할 수 있어야 함.
'도커 > 개념 및 실습' 카테고리의 다른 글
05장-2, 컨테이너의 통신 (0) | 2021.06.02 |
---|---|
05장-1, 도커 네트워크 유형 (0) | 2021.06.02 |
1, 2, 3장 연습문제 (0) | 2021.06.02 |
03장-3, 컨테이너 관리 (0) | 2021.06.02 |
03장-2, 컨테이너 실행 (0) | 2021.06.01 |