컨테이너의 영구 스토리지

앱이 컨테이너의 데이터를 유지할 수 있어야 하거나 컨테이너를 빌드할 때 포함되지 않은 파일을 컨테이너에 표시하려는 경우가 있을 수 있습니다. 다음과 같은 몇 가지 방법으로 컨테이너에 영구 스토리지를 제공할 수 있습니다.

  • 탑재 바인딩
  • 명명된 볼륨

Docker에는 볼륨을 사용하는 방법에 대한 훌륭한 개요가 있으므로 먼저 읽는 것이 가장 좋습니다. 이 페이지의 나머지 부분에는 Linux와 Windows 간의 차이점에 중점을 두고 Windows에서 예제를 제공합니다.

탑재 바인딩

바인딩 탑재를 사용하면 컨테이너가 호스트와 디렉터리를 공유할 수 있습니다. 이는 컨테이너를 다시 시작하거나 여러 컨테이너와 공유하려는 경우 사용할 수 있는 파일을 로컬 컴퓨터에 저장하려는 경우에 유용합니다. 여러 대의 컴퓨터에서 동일한 파일에 액세스하여 컨테이너를 실행하려는 경우 명명된 볼륨 또는 SMB 마운트를 대신 사용해야 합니다.

참고 항목

CSV(클러스터 공유 볼륨)에 직접 바인딩 마운트할 수 없으며 컨테이너 호스트 역할을 하는 가상 머신은 CSV 볼륨에서 실행할 수 있습니다.

사용 권한

바인딩 탑재에 사용되는 권한 모델은 컨테이너의 격리 수준에 따라 달라집니다.

Hyper-V 격리를 사용하는 컨테이너는 단순 읽기 전용 또는 읽기-쓰기 권한 모델을 사용합니다. 계정을 사용하여 호스트에서 파일에 액세스합니다 LocalSystem . 컨테이너에서 액세스가 거부된 경우 호스트의 해당 디렉터리에 대한 액세스 권한이 있는지 확인 LocalSystem 합니다. 읽기 전용 플래그를 사용하는 경우 컨테이너 내의 볼륨에 대한 변경 내용이 표시되거나 호스트의 디렉터리에 유지되지 않습니다.

프로세스 격리를 사용하는 Windows 컨테이너는 데이터에 액세스하기 위해 컨테이너 내에 있는 프로세스 ID를 사용하기 때문에(파일 ACL이 적용됨을 의미함) 약간 다릅니다. 컨테이너에서 실행되는 프로세스의 ID(Windows Server Core의 "컨테이너관리istrator"와 Nano Server 컨테이너의 "ContainerUser")는 기본적으로 탑재된 볼륨의 LocalSystem파일 및 디렉터리에 액세스하는 데 사용되며 데이터를 사용하려면 액세스 권한을 부여해야 합니다.

이러한 ID는 파일이 저장되는 호스트가 아닌 컨테이너의 컨텍스트 내에만 존재하기 때문에 컨테이너에 대한 액세스 권한을 부여하기 위해 ACL을 구성할 때 Authenticated Users와 같은 잘 알려진 보안 그룹을 사용해야 합니다.

Warning

신뢰할 수 없는 컨테이너와 같은 C:\ 중요한 디렉터리를 바인딩하지 마세요. 이렇게 하면 일반적으로 액세스할 수 없는 호스트의 파일을 변경할 수 있으며 보안 위반이 발생할 수 있습니다.

예제 사용법:

  • 읽기 전용 액세스에 대한 docker run -v c:\ContainerData:c:\data:RO
  • 읽기-쓰기 액세스에 대한 docker run -v c:\ContainerData:c:\data:RW
  • 읽기-쓰기 액세스(기본값)에 대한 docker run -v c:\ContainerData:c:\data

Symlink는 컨테이너에서 확인됩니다. symlink이거나 symlink를 포함하는 컨테이너에 호스트 경로를 바인딩하여 탑재하는 경우 컨테이너는 해당 경로에 액세스할 수 없습니다.

SMB 탑재

Windows Server 버전 1709 이상에서 "SMB 글로벌 매핑"이라는 새로운 기능을 통해 호스트에서 SMB 공유를 마운트한 다음, 이 공유에 있는 디렉터리를 컨테이너에 전달할 수 있습니다. 컨테이너는 특정 서버, 공유, 사용자 이름 또는 암호로 구성할 필요가 없습니다. 이 모든 것이 호스트에서 대신 처리됩니다. 컨테이너는 로컬 스토리지가 있는 경우와 동일하게 작동합니다.

구성 단계

  1. 다음과 같이 컨테이너 호스트에서 원격 SMB 공유를 전역적으로 매핑합니다.

    $creds = Get-Credential
    New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:
    

    이 명령은 자격 증명을 사용하여 원격 SMB 서버에 인증합니다. 그런 다음 원격 공유 경로를 G: 드라이브 문자에 매핑합니다(사용 가능한 다른 드라이브 문자일 수 있음). 이 컨테이너 호스트에서 만든 컨테이너는 이제 G: 드라이브의 경로에 매핑된 데이터 볼륨을 가질 수 있습니다.

    참고 항목

    컨테이너에 SMB 글로벌 매핑을 사용하면 컨테이너 호스트의 모든 사용자가 원격 공유에 액세스할 수 있습니다. 컨테이너 호스트에서 실행되는 모든 애플리케이션도 매핑된 원격 공유에 액세스할 수 있습니다.

  2. 전역적으로 마운트된 SMB 공유에 매핑된 데이터 볼륨이 있는 컨테이너를 만듭니다(docker run -it --name demo -v g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe).

    컨테이너 내에서 c:\AppData1은 원격 공유의 "ContainerData" 디렉터리에 매핑됩니다. 전역적으로 매핑된 원격 공유에 저장된 모든 데이터는 컨테이너 내의 애플리케이션에서 사용할 수 있습니다. 여러 컨테이너는 동일한 명령을 사용하여 이 공유 데이터에 대한 읽기/쓰기 액세스를 얻을 수 있습니다.

이 SMB 글로벌 매핑 지원은 다음을 포함하여 호환되는 모든 SMB 서버에서 작동할 수 있는 SMB 클라이언트 쪽 기능입니다.

  • 저장소 공간 Direct(S2D) 또는 기존 SAN 위에 있는 스케일 아웃 파일 서버
  • Azure Files(SMB 공유)
  • 기존 파일 서버
  • SMB 프로토콜의 타사 구현(예: NAS 어플라이언스)

참고 항목

SMB 전역 매핑은 DFSN(DFS 네임스페이스) 폴더를 지원하지 않습니다. 예를 들어 DFSN 루트 공유를 New-SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1'매핑하는 경우 루트의 폴더 대상을 읽으면 "네트워크 위치에 연결할 수 없습니다." 오류가 반환됩니다.

명명된 볼륨

명명된 볼륨을 사용하면 이름으로 볼륨을 만들고, 컨테이너에 할당하고, 나중에 동일한 이름으로 다시 사용할 수 있습니다. 생성된 실제 경로와 이름만 추적할 필요가 없습니다. Windows의 Docker 엔진에는 로컬 컴퓨터에서 볼륨을 만들 수 있는 명명된 기본 제공 볼륨 플러그 인이 있습니다. 여러 컴퓨터에서 명명된 볼륨을 사용하려면 추가 플러그 인이 필요합니다.

예제 단계:

  1. docker volume create unwound - 'unwound'라는 볼륨 만들기
  2. docker run -v unwound:c:\data microsoft/windowsservercore - c:\data에 매핑된 볼륨이 있는 컨테이너 시작
  3. 컨테이너의 c:\data에 일부 파일을 쓴 다음 컨테이너를 중지합니다.
  4. docker run -v unwound:c:\data microsoft/windowsservercore - 새 컨테이너 시작
  5. 새 컨테이너에서 실행 dir c:\data - 파일이 여전히 있습니다.

참고 항목

Windows Server는 대상 경로 이름(컨테이너 내부 경로)을 소문자로 변환합니다. 예를 들어 Linux 컨테이너의 -v unwound:c:\MyData 또는 -v unwound:/app/MyData는 컨테이너 내부의 c:\mydata 디렉터리 또는 Linux 컨테이너에 /app/mydata가 되고, 매핑됩니다(없는 경우 생성됨).