[Docker] 데이터 관리(1) Volume 과 Bind mounts

haeny-dev·2021년 7월 23일
2

Docker

목록 보기
1/2
post-thumbnail

🐳 Docker의 데이터 관리

도커는 기본적으로 컨테이너 내부에서 생성된 모든 파일은 writable container layer 에 저장되며, 다음과 같은 특징을 가집니다.

  • 해당 컨테이너가 존재하지 않으면 데이터가 유지되지 않으며, 다른 프로세스에서 필요로 하는 경우 컨테이너에서 데이터를 가져오기가 어려울 수 있습니다.
  • 컨테이너의 writable layer는 컨테이너가 실행 중인 호스트 시스템과 밀접하게 연결되어 있어, 데이터를 다른 곳으로 쉽게 이동할 수 없습니다.
  • 컨테이너의 writable layer에 쓰기 위해서는 파일 시스템을 관리 하기 위한 스토리지 드라이버가 필요한데, 리눅스 커널을 사용하여 통합 파일 시스템을 제공합니다. 이는 호스트 파일 시스템에 직접 쓰는 Volume을 사용 하는 것과 비교해서 성능을 감소시킵니다.

💾 Volume 과 Bind mounts

도커에는 컨테이너가 호스트 시스템에 파일을 저장할 수 있는 두 가지 옵션이 있습니다. 바로, volumebind mounts 입니다. 이 옵션들은 컨테이너가 중지된 이후에도 파일이 유지됩니다.

➕ Volume

1. Volume 특징

  • 볼륨을 생성하면 /var/lib/docker/volumes/~ 과 같이 호스트 파일 시스템의 일부에 도커에서 관리하는 영역에 저장됩니다. Non-Docker 프로세스는 호스트 파일 시스템의 도커영역을 수정하지 않아야 한다.
  • 볼륨을 컨테이너에 탑재하면 이 디렉터리가 컨테이너에 탑재되며, 도커에 의해 관리되고 호스트 시스템의 핵심 기능과 분리됩니다.
  • 주어진 볼륨은 여러 컨테이너에 동시에 탑재할 수 있으며, 실행 중인 컨테이너가 볼륨을 사용하지 않는 경우에도 해당 볼륨은 사라지지 않고 도커에서 계속 사용할 수 있습니다. 명령어를 사용하여 사용하지 않는 볼륨을 제거할 수 있습니다.
  • 이름이 지정되지 않은 익명 볼륨의 경우 컨테이너에 마운트될 때 도커가 도커 내에서 고유하도록 보장되는 임의의 이름을 지정해줍니다.

2. Volume 사용방법

(1) Volume 생성

$ docker volume create {볼륨명}

(2) Volume 목록

$ docker volume ls

(3) Volume 검사

$ docker volume inspect {볼륨명}

(4) Volume 제거

$ docker volume rm {볼륨명}

(5) 사용하지 않는 Volume 삭제

$ docker volume prune

(6) Volume이 있는 컨테이너 시작

nginx:lastest이미지test 라는 이름의 컨테이너의 /app/myvol2 라는 볼륨을 마운트 시킬 경우

$ docker run -d -name test -v myvol2:/app nginx:latest

➕ Bind mounts

1. Bind mounts 특징

Bind mounts allow access to sensitive files

One side effect of using bind mounts, for better or for worse, is that you can change the host filesystem via processes running in a container, including creating, modifying, or deleting important system files or directories. This is a powerful ability which can have security implications, including impacting non-Docker processes on the host system.

  • 호스트 시스템의 어느 곳에나 저장할 수 있으며, 저장되는 대상들은 중요한 시스템 파일이나 디렉터리일 수도 있음에도 불구하고 Non-Docker 프로세스나 도커 컨테이너에서 언제든지 수정이 가능합니다.
  • 바인드 마운트를 사용하면 호스트 시스템의 파일 또는 디렉토리가 컨테이너에 마운트되며, 파일 또는 디렉토리는 호스트 시스템의 전체 경로로 참조됩니다.
  • 바인드 마운트는 성능이 매우 우수하지만 특정 디렉토리 구조를 사용할 수 있는 호스트의 파일 시스템에 의존합니다.

2. Bind mounts 사용방법

Bind mounts 로 컨테이너 시작하기

test 컨테이너의 /app/${pwd}/target 라는 디렉터리를 마운트 하고자 할 경우

$ docker run -d -it --name test -v "${pwd}"/target:/app nginx:latest

컨테이너의 비어 있지 않은 디렉토리에 마운트

컨테이너의 비어 있지 않은 디렉토리에 바인드 마운트하면 디렉토리의 기족 내용이 바인드 마운트에 의해 가려집니다.

컨테이너 /usr/ 디렉토리의 내용을 /tmp/ 호스트 시스템의 디렉토리로 대체 하는 경우 컨테이너가 생성은 되지만 시작되지 않습니다.

$ docker run -d -it --name test -v /tmp:/usr nginx:latest
docker: Error response from daemon: oci runtime error: container_linux.go:262:
starting container process caused "exec: \"nginx\": executable file not found in $PATH".

읽기 전용 bind mounts 사용

일반적인 경우 컨테이너가 바인드 마운트에 기록해야 하므로 변경사항이 Docker 호스트로 다시 전파됩니다. 하지만, 읽기 권한만 필요한 경우 ro 를 이용하여 읽기 전용 바인드 마운트로 마운트 할 수 있습니다.

$ docker run -d -it --name test -v "${pwd}"/target:/app:ro nginx:latest

➕ Volume 좋은 이유

  • 볼륨은 바이드 마운트보다 백업 또는 마이그레이션이 더 쉽습니다.
  • Docker CLI 명령 또는 Docker API를 사용하여 볼륨을 관리할 수 있습니다.
  • 볼륨은 Linux 및 Windows 컨테이너 모두에서 작동합니다.
  • 여러 컨테이너 간에 볼륨을 더 안전하게 공유할 수 있습니다.
  • 볼륨 드라이버를 사용하면 원격 호스트 또는 클라우드 공급자에 볼륨을 저장하여 볼륨의 내용을 암호화하거나 다른 기능을 추가할 수 있습니다.
  • Docker Desktop의 볼륨은 Mac 및 Windows 호스트의 바인드 마운트보다 성능이 훨씬 높습니다.

📖 REFERENCE

Manage data in Docker

0개의 댓글