[docker] docker 볼륨 - 호스트 볼륨, tmpfs (2)

업데이트:     Updated:

카테고리:

태그:

🎯Docker에서 데이터 관리

Docker에서는 컨테이너가 호스트의 파일 시스템에 파일을 저장하는 두 가지 마운트 유형과 호스트의 메모리에 파일을 저장하는 한 가지 마운트 유형을 제공합니다.

  • 도커 볼륨 (볼륨) - >Dokcer에서 관리하는 호스트 파일 시스템의 일부에 데이터 저장 (Linux의 경우 /var/lib/docker/volumes/)
  • 호스트 볼륨 (바인드 마운트) - 호스트 시스템의 아무 곳에나 저장
  • tmpfs - 호스트 시스템의 메모리에만 저장, 호스트 시스템의 파일 시스템에는 저장하지 않음

1. 호스트 볼륨

  • 바인드 마운트를 사용하면 호스트 시스템의 파일 또는 디렉토리가 컨테이너에 마운트됩니다. 파일 또는 디렉토리는 호스트 시스템의 절대 경로로 참조됩니다.
  • 앞선 포스트에서 알아본 볼륨의 경우 호스트 시스템의 Docker 저장소 디렉터리 내에 새 디렉터리가 생성되고 Docker가 해당 디렉터리의 콘텐츠를 관리하는 것과는 차이가 있습니다.
  • 파일 또는 디렉터리가 Docker 호스트에 미리 존재할 필요는 없습니다. 아직 존재하지 않는 경우 요청 시 자동으로 생성됩니다. (-v 옵션으로 생성한 경우)

1.1 생성


도커 볼륨과 마찬가지로 컨테이너와 함께 호스트 볼륨을 생성하려면 -v 또는 --mount 플래그를 사용합니다.

  • -v 또는 --volume : 콜론 문자(:)로 구분된 세 개의 필드로 구성됩니다. 필드는 올바른 순서로 되어 있어야 합니다.
    • 호스트 볼륨의 경우 첫 번째 필드는 호스트 시스템의 파일 또는 디렉토리의 경로입니다.
    • 두 번째 필드는 파일 또는 디렉터리가 컨테이너에 마운트된 경로입니다.
    • 세 번째 필드는 쉼표로 구분된 옵션 목록입니다. (optional)
  • --mount <key>=<value> : 쉼표로 구분된 여러 키-값 쌍으로 구성됩니다. 키 순서는 중요하지 않습니다.
    • type 유형에는 bind, volume, tmpfs 값이 올 수 있습니다. 호스트 볼륨의 경우 bind 유형을 가집니다.
    • src 또는 source 옵션으로 호스트에 있는 파일 또는 디렉터리 경로를 지정합니다.
    • dst 또는 target 옵션으로 파일 또는 디렉터리가 컨테이너에 마운트된 경로를 지정합니다. (destination도 가능)
    • readonly 옵션이 있는 경우 호스트 볼륨은 컨테이너에 읽기 전용으로 마운트됩니다.
# --mount
docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx:latest

# -v
docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest

1.2 -v--mount 차이점


-v(–volume)

Docker 호스트에 아직 존재하지 않는 파일 또는 디렉터리를 바인드 마운트하기 위해 -v 또는 --volume을 사용하는 경우 항상 디렉터리를 자동으로 생성합니다.

--mount

Docker 호스트에 아직 존재하지 않는 파일 또는 디렉터리를 바인드 마운트하기 위해 --mount을 사용하는 경우 Docker는 디렉터리를 자동으로 생성하지 않고 오류를 생성합니다.

1.3 검사


docker inspect [container_name] 명령을 통해 바인드 마운트가 올바르게 생성되었는지 확인할 수 있습니다.

"Mounts": [
    {
        "Type": "bind",
        "Source": "/tmp/source/target",
        "Destination": "/app",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

이것은 마운트가 bind 유형이고 올바른 소스와 대상을 보여주며 마운트가 읽기-쓰기 가능함을 확인할 수 있습니다.

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

  • 컨테이너의 비어있지 않은 디렉터리에 호스트 시스템의 디렉터리를 바인드 마운트하면 컨테이너의 디렉터리의 기존 내용이 호스트 시스템의 디렉터리 내용으로 덮어쓰여집니다.
  • 다음의 예제는 컨테이너의 /usr 디렉터리를 호스트 시스템의 /tmp 디렉터리의 내용으로 덮어씁니다.
# --mount
docker run -d \
  -it \
  --name broken-container \
  --mount type=bind,source=/tmp,target=/usr \
  nginx:latest

# -v
docker run -d \
  -it \
  --name broken-container \
  -v /tmp:/usr \
  nginx:latest

1.5 읽기 전용 호스트 볼륨


디렉터리를 읽기 전용 바인드 마운트로 사용하려면 다음의 예제를 따릅니다.

# --mount
docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app,readonly \
  nginx:latest
# -v
docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:ro \
  nginx:latest

2. tmpfs 마운트

  • Linux에서 Docker를 실행하는 경우 tmpfs 라는 세 번째 마운트 옵션을 사용할 수 있습니다. tmpfs 마운트로 컨테이너를 생성하면 컨테이너는 쓰기 가능한 레이어 외부(호스트 메모리)에 파일을 생성할 수 있습니다.
  • 호스트 볼륨이나 도커 볼륨과는 달리 tmpfs 마운트는 일시적으로 호스트 메모리에서만 데이터가 지속됩니다. 컨테이너가 중지되면 tmpfs 마운트가 제거됨과 동시에 거기에 기록된 파일도 삭제됩니다.
  • 이는 호스트 또는 컨테이너 쓰기 가능 계층에 유지하지 않으려는 중요한 파일을 임시로 저장하는 데 유용합니다.

2.1 tmpfs 마운트의 한계


  • 호스트 볼륨 및 도커 볼륨과 달리 tmpfs는 컨테이너 간에 마운트를 공유할 수 없습니다.
  • 이 기능은 Linux에서 Docker를 실행하는 경우에만 사용할 수 있습니다.

2.2 생성


컨테이너와 함께 tmpfs 볼륨을 생성하려면 --tmpfs 또는 --mount 플래그를 사용합니다.

  • --tmpfs : tmpfs에서 구성 가능한 옵션을 지정하지 않고 마운트합니다.
  • --mount <key>=<value> : 쉼표로 구분된 여러 키-값 쌍으로 구성됩니다.
    • type 옵션에는 tmpfs을 사용합니다.
    • dst 또는 target 으로 컨테이너에 마운트될 경로를 지정합니다. (destination도 가능)
    • tmpfs-size, tmpfs-mode 옵션을 사용할 수 있습니다.
# --mount
docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app \
  nginx:latest
# --tmpfs
docker run -d \
  -it \
  --name tmptest \
  --tmpfs /app \
  nginx:latest

2.2.1 tmpfs 옵션

tmpfs 마운트는 두 가지의 구성 옵션을 허용하며 두 가지 옵션은 반드시 필요하진 않습니다. 옵션을 지정해야 하는 경우 --tmpfs 플래그 대신 --mount 플래그를 사용 해야합니다.

  • tmpfs-size : tmpfs 마운트 크기(바이트)입니다. 기본적으로 제한이 없습니다.
  • tmpfs-mode : tmpfs 파일 모드는 8진수로 표현합니다. 예를 들어, 700 또는 0770 으로 쓸 수 있습니다. 기본 값은 1777 입니다.
  • 소유자와 소유그룹 외에 다른 사용자가 컨테이너 내에 읽거나 쓸 수 없도록 하려면 다음의 예제를 따릅니다.
docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app,tmpfs-mode=1770 \
  nginx:latest

2.3 --tmpfs--mount의 차이점


  • tmpfs 플래그를 사용하면 구성 가능한 옵션을 지정할 수 없습니다.
  • tmpfs 플래그는 swarm 서비스와 함께 사용할 수 없습니다.

📌출처

Docker Docs


👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

docker 카테고리 내 다른 글 보러가기

댓글남기기