Pengantar
Docker adalah alat containerization populer yang digunakan untuk menyediakan aplikasi perangkat lunak dengan sistem file yang berisi semua yang mereka butuhkan untuk dijalankan. Menggunakan container Docker memastikan bahwa perangkat lunak akan berperilaku dengan cara yang sama di mana pun ia di-deploy karena lingkungan run-time-nya konsisten.
Secara umum, wadah Docker bersifat sementara, berjalan selama yang diperlukan untuk menyelesaikan perintah yang dikeluarkan dalam wadah. Namun, terkadang aplikasi perlu berbagi akses ke data atau menyimpan data setelah penampung dihapus. Basis data, konten yang dibuat pengguna untuk situs web, dan file log hanyalah beberapa contoh data yang tidak praktis atau tidak mungkin disertakan dalam gambar Docker tetapi aplikasi mana yang perlu diakses. Akses persisten ke data disediakan dengan Volume Docker.
Volume Docker dapat dibuat dan dilampirkan dalam perintah yang sama yang membuat wadah, atau dapat dibuat secara independen dari wadah apa pun dan dilampirkan nanti. Dalam artikel ini, Anda akan melihat empat cara berbeda untuk berbagi data antar container.
Prasyarat
Untuk mengikuti artikel ini, Anda memerlukan server Ubuntu 22.04 dengan yang berikut:
- Pengguna non-root dengan hak istimewa sudo. Panduan Pengaturan Server Awal dengan Ubuntu 22.04 menjelaskan cara mengaturnya.
- Docker diinstal dengan instruksi dari Langkah 1 dan Langkah 2 Cara Menginstal dan Menggunakan Docker di Ubuntu 22.04
Catatan: Meskipun Prasyarat memberikan instruksi untuk menginstal Docker di Ubuntu 22.04, docker
perintah untuk volume data Docker dalam artikel ini harus bekerja pada sistem operasi lain selama Docker diinstal dan pengguna sudo telah ditambahkan ke docker
grup.
Langkah 1 — Membuat Volume Independen
Diperkenalkan dalam rilis Docker 1.9, docker volume create
perintah memungkinkan Anda untuk membuat volume tanpa menghubungkannya dengan wadah tertentu. Anda akan menggunakan perintah ini untuk menambahkan volume bernama DataVolume1
:
- docker volume create --name DataVolume1
Nama ditampilkan, menunjukkan bahwa perintah berhasil:
OutputDataVolume1
Untuk memanfaatkan volume, Anda akan membuat wadah baru dari gambar Ubuntu, menggunakan --rm
tandai untuk menghapusnya secara otomatis saat Anda keluar. Anda juga akan menggunakan -v
untuk memasang volume baru. -v
memerlukan nama volume, titik dua, lalu jalur absolut ke tempat volume akan muncul di dalam wadah. Jika direktori di jalur tidak ada sebagai bagian dari gambar, mereka akan dibuat saat perintah dijalankan. Jika mereka melakukannya ada, volume yang dipasang akan menyembunyikan konten yang ada:
- docker run -ti --rm -v DataVolume1:/datavolume1 ubuntu
Saat berada di wadah, tulis beberapa data ke volume:
- echo "Example1" > /datavolume1/Example1.txt
Karena Anda menggunakan --rm
bendera, wadah Anda akan dihapus secara otomatis saat Anda keluar. Namun, volume Anda akan tetap dapat diakses.
- exit
Anda dapat memverifikasi bahwa volume ada di sistem Anda dengan docker volume inspect
:
- docker volume inspect DataVolume1
Output[
{
"CreatedAt": "2018-07-11T16:57:54Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/DataVolume1/_data",
"Name": "DataVolume1",
"Options": {},
"Scope": "local"
}
]
Catatan: Anda bahkan dapat melihat data pada host di jalur yang terdaftar sebagai Mountpoint
. Namun, Anda harus menghindari mengubahnya, karena dapat menyebabkan kerusakan data jika aplikasi atau container tidak mengetahui adanya perubahan.
Selanjutnya, mulai wadah baru dan lampirkan DataVolume1
:
- docker run --rm -ti -v DataVolume1:/datavolume1 ubuntu
Verifikasi isinya:
- cat /datavolume1/Example1.txt
OutputExample1
Keluar dari wadah:
- exit
Dalam contoh ini, Anda membuat volume, melampirkannya ke penampung, dan memverifikasi persistensinya.
Langkah 2 — Membuat Volume yang Bertahan saat Penampung Dihapus
Pada contoh berikutnya, Anda akan membuat volume bersamaan dengan wadah, menghapus wadah, lalu melampirkan volume ke wadah baru.
Anda akan menggunakan docker run
perintah untuk membuat wadah baru menggunakan gambar dasar Ubuntu. -t
akan memberi kita terminal, dan -i
akan memungkinkan kita untuk berinteraksi dengannya. Untuk kejelasan, Anda akan menggunakan --name
untuk mengidentifikasi wadah.
-v
flag akan memungkinkan kami untuk membuat volume baru, yang Anda sebut DataVolume2
. Anda akan menggunakan titik dua untuk memisahkan nama ini dari jalur tempat volume harus dipasang di penampung. Terakhir, Anda akan menentukan gambar dasar Ubuntu dan mengandalkan perintah default di file Docker gambar dasar Ubuntu, bash
, untuk memasukkan kami ke dalam cangkang:
- docker run -ti --name=Container2 -v DataVolume2:/datavolume2 ubuntu
Catatan: -v
bendera sangat fleksibel. Itu dapat mengikat atau memberi nama volume hanya dengan sedikit penyesuaian sintaks. Jika argumen pertama dimulai dengan /
atau ~/
Anda membuat bindmount. Hapus itu, dan Anda menamai volumenya. Misalnya:
-v /path:/path/in/container
mount direktori host,/path
di/path/in/container
-v path:/path/in/container
membuat volume bernamapath
tanpa hubungan dengan tuan rumah.
Untuk informasi lebih lanjut tentang mengikat direktori dari host, lihat Cara Berbagi Data antara Docker Container dan Host
Saat berada di wadah, Anda akan menulis beberapa data ke volume:
- echo "Example2" > /datavolume2/Example2.txt
- cat /datavolume2/Example2.txt
OutputExample2
Keluar dari wadah:
- exit
Saat Anda memulai ulang wadah, volume akan dipasang secara otomatis:
- docker start -ai Container2
Pastikan volume sudah terpasang dan data Anda masih ada:
- cat /datavolume2/Example2.txt
OutputExample2
Terakhir, keluar dan bersihkan:
- exit
Docker tidak akan mengizinkan kami menghapus volume jika direferensikan oleh sebuah wadah. Untuk melihat apa yang terjadi, coba:
- docker volume rm DataVolume2
Pesan tersebut memberi tahu kami bahwa volume masih digunakan dan memasok ID penampung versi panjang:
OutputError response from daemon: unable to remove volume: remove DataVolume2: volume is in use - [d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63]
Anda dapat menggunakan ID dalam pesan kesalahan di atas untuk menghapus penampung:
- docker rm d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63
Outputd0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63
Melepaskan wadah tidak akan memengaruhi volume. Anda dapat melihatnya masih ada di sistem dengan mendaftar volume dengan docker volume ls
:
- docker volume ls
OutputDRIVER VOLUME NAME
local DataVolume2
Dan Anda dapat menggunakan docker volume rm
untuk menghapusnya:
- docker volume rm DataVolume2
Dalam contoh ini, Anda membuat volume data kosong pada saat yang sama saat Anda membuat wadah. Dalam contoh berikutnya, Anda akan mempelajari apa yang terjadi saat Anda membuat volume dengan direktori penampung yang sudah berisi data.
Langkah 3 — Membuat Volume dari Direktori yang Ada dengan Data
Umumnya, membuat volume secara mandiri dengan docker volume create
dan membuatnya saat membuat wadah adalah setara, dengan satu pengecualian. Jika Anda membuat volume bersamaan dengan membuat wadah dan Anda memberikan jalur ke direktori yang berisi data dalam gambar dasar, data tersebut akan disalin ke dalam volume.
Sebagai contoh, Anda akan membuat wadah dan menambahkan volume data di /var
, direktori yang berisi data dalam gambar dasar:
- docker run -ti --rm -v DataVolume3:/var ubuntu
Semua konten dari /var
gambar dasar direktori disalin ke volume, dan Anda dapat memasang volume itu di wadah baru.
Keluar dari penampung saat ini:
- exit
Kali ini, daripada mengandalkan bash
default gambar dasar perintah, Anda akan mengeluarkan ls
Anda sendiri perintah, yang akan menampilkan isi volume tanpa memasukkan shell:
- docker run --rm -v DataVolume3:/datavolume3 ubuntu ls datavolume3
Direktori datavolume3
sekarang memiliki salinan konten /var
gambar dasar direktori:
Outputbackups
cache
lib
local
lock
log
mail
opt
run
spool
tmp
Sepertinya Anda tidak ingin memasang /var/
dengan cara ini, tetapi ini dapat membantu jika Anda telah membuat gambar Anda sendiri dan menginginkan cara mudah untuk menyimpan data. Dalam contoh berikutnya, Anda akan mendemonstrasikan bagaimana volume dapat dibagi di antara beberapa wadah.
Langkah 4 — Berbagi Data Antara Beberapa Kontainer Docker
Sejauh ini, Anda telah melampirkan volume ke satu wadah dalam satu waktu. Seringkali, Anda ingin beberapa wadah dilampirkan ke volume data yang sama. Ini relatif mudah untuk dicapai, tetapi ada satu peringatan penting:saat ini, Docker tidak menangani penguncian file. Jika Anda memerlukan beberapa wadah untuk menulis ke volume, aplikasi yang berjalan di wadah tersebut harus dirancang untuk menulis ke penyimpanan data bersama untuk mencegah kerusakan data.
Buat Container4 dan DataVolume4
Gunakan docker run
untuk membuat wadah baru bernama Container4
dengan volume data terlampir:
- docker run -ti --name=Container4 -v DataVolume4:/datavolume4 ubuntu
Selanjutnya Anda akan membuat file dan menambahkan beberapa teks:
- echo "This file is shared between containers" > /datavolume4/Example4.txt
Kemudian, Anda akan keluar dari wadah:
- exit
Ini mengembalikan kita ke command prompt host, di mana Anda akan membuat wadah baru yang memasang volume data dari Container4
.
Buat Container5 dan Pasang Volume dari Container4
Anda akan membuat Container5
, dan pasang volume dari Container4
:
- docker run -ti --name=Container5 --volumes-from Container4 ubuntu
Periksa persistensi data:
- cat /datavolume4/Example4.txt
OutputThis file is shared between containers
Sekarang, tambahkan beberapa teks dari Container5
:
- echo "Both containers can write to DataVolume4" >> /datavolume4/Example4.txt
Terakhir, Anda akan keluar dari wadah:
- exit
Selanjutnya, Anda akan memeriksa apakah data Anda masih ada di Container4
.
Lihat Perubahan yang Dibuat di Container5
Sekarang, periksa perubahan yang ditulis ke volume data dengan Container5
dengan memulai ulang Container4
:
- docker start -ai Container4
Periksa perubahannya:
- cat /datavolume4/Example4.txt
OutputThis file is shared between containers
Both containers can write to DataVolume4
Sekarang setelah Anda memverifikasi bahwa kedua penampung dapat membaca dan menulis dari volume data, Anda akan keluar dari penampung:
- exit
Sekali lagi, Docker tidak menangani penguncian file apa pun, jadi aplikasi harus akun untuk file yang mengunci sendiri. Dimungkinkan untuk memasang volume Docker sebagai hanya-baca untuk memastikan bahwa kerusakan data tidak akan terjadi secara tidak sengaja ketika sebuah wadah memerlukan akses hanya-baca dengan menambahkan :ro
. Sekarang Anda akan melihat cara kerjanya.
Mulai Penampung 6 dan Pasang Volume Hanya-Baca
Setelah volume dipasang dalam wadah, daripada melepasnya seperti yang Anda lakukan dengan sistem file Linux pada umumnya, Anda dapat membuat wadah baru yang dipasang seperti yang Anda inginkan dan, jika perlu, hapus wadah sebelumnya. Untuk membuat volume hanya-baca, Anda menambahkan :ro
di akhir nama wadah:
- docker run -ti --name=Container6 --volumes-from Container4:ro ubuntu
Anda akan memeriksa status hanya-baca dengan mencoba menghapus file contoh Anda:
- rm /datavolume4/Example4.txt
Outputrm: cannot remove '/datavolume4/Example4.txt': Read-only file system
Terakhir, Anda akan keluar dari wadah dan membersihkan wadah dan volume pengujian Anda:
- exit
Setelah selesai, bersihkan wadah dan volume Anda:
- docker rm Container4 Container5 Container6
- docker volume rm DataVolume4
Dalam contoh ini, Anda telah menunjukkan cara berbagi data antara dua penampung menggunakan volume data dan cara memasang volume data sebagai hanya-baca.
Kesimpulan
Dalam tutorial ini, Anda membuat volume data yang memungkinkan data bertahan melalui penghapusan penampung. Anda berbagi volume data antar container, dengan peringatan bahwa aplikasi perlu dirancang untuk menangani penguncian file untuk mencegah kerusakan data. Terakhir, Anda menunjukkan cara memasang volume bersama dalam mode hanya-baca. Jika Anda tertarik untuk mempelajari tentang berbagi data antara container dan sistem host, lihat Cara Berbagi Data antara Docker Container dan Host.