Penyimpanan Persisten dalam Kontainer

Anda mungkin memiliki kasus di mana penting bahwa aplikasi dapat menyimpan data dalam kontainer, atau Anda ingin menampilkan file ke dalam kontainer yang tidak disertakan pada build-time kontainer. Penyimpanan persisten dapat diberikan kepada kontainer dengan beberapa cara:

  • Pemasangan ikatan
  • Volume bernama

Docker memiliki gambaran umum yang bagus tentang cara menggunakan volume sehingga yang terbaik adalah membacanya terlebih dahulu. Sisa halaman ini berfokus pada perbedaan antara Linux & Windows dan memberikan contoh di Windows.

Pemasangan Ikatan

Pemasangan ikatan memungkinkan kontainer berbagi direktori dengan host. Ini berguna jika Anda ingin tempat untuk menyimpan file di komputer lokal yang tersedia jika Anda menghidupkan ulang kontainer, atau ingin membagikannya dengan beberapa kontainer. Jika Anda ingin kontainer berjalan pada beberapa komputer dengan akses ke file yang sama, maka volume bernama atau pemasangan SMB harus digunakan sebagai gantinya.

Catatan

Pemasangan ikatan langsung pada volume bersama kluster (CSV) tidak didukung, komputer virtual yang bertindak sebagai host kontainer dapat berjalan pada volume CSV.

Izin

Model izin yang digunakan untuk pemasangan ikat bervariasi berdasarkan tingkat isolasi untuk kontainer Anda.

Kontainer yang menggunakan isolasi Hyper-V menggunakan model izin baca-saja atau baca-tulis sederhana. File diakses di host menggunakan LocalSystem akun . Jika Anda mendapatkan akses ditolak dalam kontainer, pastikan LocalSystem memiliki akses ke direktori tersebut di host. Ketika bendera baca saja digunakan, perubahan yang dilakukan pada volume di dalam kontainer tidak akan terlihat atau dipertahankan ke direktori pada host.

Kontainer Windows yang menggunakan isolasi proses sedikit berbeda karena menggunakan identitas proses dalam kontainer untuk mengakses data, yang berarti bahwa ACL file dihormati. Identitas proses yang berjalan dalam kontainer ("ContainerAdministrator" pada Windows Server Core dan "ContainerUser" pada kontainer Nano Server, secara default) akan digunakan untuk mengakses file dan direktori dalam volume yang dipasang alih-alih LocalSystem, dan perlu diberikan akses untuk menggunakan data.

Karena identitas ini hanya ada dalam konteks kontainer--bukan pada host tempat file disimpan--Anda harus menggunakan grup keamanan terkenal seperti Authenticated Users saat mengonfigurasi ACL untuk memberikan akses ke kontainer.

Peringatan

Jangan ikat-pasang direktori sensitif seperti C:\ ke dalam kontainer yang tidak tepercaya. Ini akan memungkinkannya untuk mengubah file pada host yang biasanya tidak akan memiliki akses ke dan dapat membuat pelanggaran keamanan.

Contoh penggunaan:

  • docker run -v c:\ContainerData:c:\data:RO untuk akses baca-saja
  • docker run -v c:\ContainerData:c:\data:RW untuk akses baca-tulis
  • docker run -v c:\ContainerData:c:\data untuk akses baca-tulis (default)

Symlink diselesaikan dalam kontainer. Jika Anda mengikat-memasang jalur host ke kontainer yang merupakan symlink, atau berisi symlink - kontainer tidak akan dapat mengaksesnya.

Dudukan SMB

Pada Windows Server versi 1709 dan yang lebih baru, fitur yang disebut "Pemetaan Global SMB" memungkinkan untuk memasang berbagi SMB pada host, lalu meneruskan direktori pada berbagi tersebut ke dalam kontainer. Kontainer tidak perlu dikonfigurasi dengan server, berbagi, nama pengguna, atau kata sandi tertentu - itu semua ditangani pada host sebagai gantinya. Kontainer akan berfungsi sama seperti jika memiliki penyimpanan lokal.

Langkah-langkah konfigurasi

  1. Pada host kontainer, petakan berbagi SMB jarak jauh secara global:

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

    Perintah ini akan menggunakan mandat untuk mengotentikasi dengan server SMB jarak jauh. Kemudian, petakan jalur berbagi jarak jauh ke huruf drive G: (dapat menjadi huruf drive lain yang tersedia). Kontainer yang dibuat pada host kontainer ini sekarang dapat memetakan volume data mereka ke jalur pada drive G: .

    Catatan

    Saat menggunakan pemetaan global SMB untuk kontainer, semua pengguna pada host kontainer dapat mengakses berbagi jarak jauh. Aplikasi apa pun yang berjalan pada host kontainer juga akan memiliki akses ke berbagi jarak jauh yang dipetakan.

  2. Buat kontainer dengan volume data yang dipetakan ke eksekusi docker berbagi SMB yang dipasang secara global -it --name demo -v g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe

    Di dalam kontainer, c:\AppData1 kemudian akan dipetakan ke direktori "ContainerData" berbagi jarak jauh. Setiap data yang disimpan di berbagi jarak jauh yang dipetakan secara global akan tersedia untuk aplikasi di dalam kontainer. Beberapa kontainer bisa mendapatkan akses baca/tulis ke data bersama ini dengan perintah yang sama.

Dukungan pemetaan global SMB ini adalah fitur sisi klien SMB yang dapat berfungsi di atas server SMB yang kompatibel termasuk:

  • Scaleout File Server di atas Storage Spaces Direct (S2D) atau SAN tradisional
  • Azure Files (berbagi SMB)
  • Server File Tradisional
  • Implementasi pihak ke-3 protokol SMB (misalnya: appliance NAS)

Catatan

Pemetaan global SMB tidak mendukung folder DFS Namespaces (DFSN). Misalnya, jika Anda memetakan berbagi akar DFSN dengan New-SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1', membaca target folder akar tersebut akan mengembalikan kesalahan "Lokasi jaringan tidak dapat dicapai."

Volume Bernama

Volume bernama memungkinkan Anda membuat volume berdasarkan nama, menetapkannya ke kontainer, dan menggunakannya kembali nanti dengan nama yang sama. Anda tidak perlu melacak jalur aktual tempat pembuatannya, hanya nama. Mesin Docker di Windows memiliki plugin volume bernama bawaan yang dapat membuat volume pada komputer lokal. Plugin tambahan diperlukan jika Anda ingin menggunakan volume bernama pada beberapa komputer.

Contoh langkah-langkah:

  1. docker volume create unwound - Buat volume bernama 'unwound'
  2. docker run -v unwound:c:\data microsoft/windowsservercore - Mulai kontainer dengan volume yang dipetakan ke c:\data
  3. Tulis beberapa file ke c:\data dalam kontainer, lalu hentikan kontainer
  4. docker run -v unwound:c:\data microsoft/windowsservercore - Memulai kontainer baru
  5. Jalankan dir c:\data dalam kontainer baru - file masih ada

Catatan

Windows Server akan mengonversi nama jalur target (jalur di dalam kontainer) menjadi huruf kecil; misalnya-v unwound:c:\MyData, , atau -v unwound:/app/MyData dalam kontainer Linux, akan menghasilkan direktori di dalam kontainer , atau /app/mydata dalam kontainer c:\mydataLinux, dipetakan (dan dibuat, jika tidak ada).