Data persisten dalam volume Docker
- Get link
- X
- Other Apps
Karena kontainer Docker seharusnya kecil, proses tunggal dan contoh mudah diganti, tidak terlalu jelas bagaimana data persisten cocok dengan gambar itu. Bayangkan Anda memiliki container MySQL yang Anda putuskan untuk diupgrade. Apa yang akan Anda lakukan dengan file database-nya? Dalam dunia kontainer, "upgrade" berarti "nuke yang lama, mulai yang baru" dan data Anda akan berubah menjadi abu radioaktif dengan sistem file container lainnya.
Namun, seiring dengan masalah tersebut Docker juga menyediakan solusi: Volume Docker.
Apa itu volume Docker
Secara umum, volume Docker hanyalah direktori host yang dipasang ke sistem file penampung. Karena tidak lagi milik FS wadah, tidak masalah untuk menghapus satu wadah, membuat yang lain dan memasang volume data yang ada ke dalamnya. Ada beberapa pendekatan tentang cara menggunakan volume Docker dan hari ini kita akan melihat tiga di antaranya.
1. Pemasangan direktori sederhana
Pendekatan paling sederhana adalah memasang direktori host sewenang-wenang ke FS penampung. Bayangkan Anda menjalankan wadah mysql dan ingin menyimpan file datanya selama peningkatan, atau hanya melakukan pencadangan sesekali. Kita dapat memetakan direktori host ke direktori data penampung, jadi apa pun yang dituliskan oleh mysql misalnya /var/lib/mysql
akan berakhir dalam keamanan relatif dari host FS:
1 2 3 4 5 | docker run -d \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v /home/docker/mysql-data:/var/lib/mysql \ --name mysqlserver \ mysql |
Saat kami menghancurkan mysqlserver
, datanya akan bertahan.
1 2 3 4 5 6 | docker stop mysqlserver docker rm mysqlserver ls /home/docker/mysql-data #auto.cnf client-cert.pem ib_logfile0 mysql/ public_key.pem sys/ #ca-key.pem client-key.pem ib_logfile1 performance_schema/ server-cert.pem #ca.pem ib_buffer_pool ibdata1 private_key.pem server-key.pem |
Sekarang kita dapat memulai wadah mysql baru, pasang direktori data yang sama ke dalamnya dan lanjutkan seolah-olah tidak ada yang terjadi.
Dudukan hanya baca
Jika penampung tidak seharusnya memperbarui data dalam direktori yang dipasang, itu dapat dibuat hanya-baca hanya dengan menambahkan :ro
sufiks. Jelas, tidak masuk akal untuk melakukannya untuk pemasangan basis data, tetapi untuk server web itu cukup logis:
1 2 3 | docker run -v /home/docker/www:/usr/share/nginx/html:ro ... |
Mendaftar tunggangan yang ada
Jangan coba-coba mengingat apa yang sebenarnya dipasang ke wadah apa - otak kita tidak bekerja seperti itu. Sebaliknya, docker inspect %container%
tidak hanya akan memberi tahu pengaturan jaringan, host dan kontainer, tetapi juga volume dan pemasangan apa yang digunakannya saat ini:
1 2 3 4 5 6 7 8 9 10 11 | docker inspect mysqlserver # ... # "Mounts": [ # { # "Source": "/home/docker/mysql-data", # "Destination": "/var/lib/mysql", # "RW": true, # ... # } # ], # ... |
2. Volume data Docker
Mari kita coba hal lain: jalankan contoh mysql pertama sekali lagi, tetapi kali ini lewati -v
argumen (volume). Kemudian, jika kita inspect
melakukannya, akan sulit untuk tidak memperhatikan bahwa masih ada volume yang menyertainya!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | docker run -d \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ --name mysqlserver \ mysql docker inspect mysqlserver #... # "Mounts": [ # { # "Name": "aac828f46e6ff00fedaf45bc21e89523bd57663d3d58bf0e3c73e8cb4092d768", # "Source": "/mnt/sda1/var/lib/docker/volumes/aac828f46e6ff00fedaf45bc21e89523bd57663d3d58bf0e3c73e8cb4092d768/_data", # "Destination": "/var/lib/mysql", # ... # } # ], #... |
Ya, kali ini namanya aneh, dan mount source pathnya lebih panjang, tapi masih mengarah ke /var/lib/mysql
folder data. Bagaimana mungkin?
Jawabannya ada di bagian bawah gambar mysql Dockerfile :
1 2 3 | ... VOLUME /var/lib/mysql ... |
VOLUME /var/lib/mysql
membuat volume baru yang terpasang /var/lib/mysql
. Ini berperilaku sedikit seperti mount direktori biasa, tetapi sebenarnya tidak persis sama. Setiap kali Docker melihat deklarasi volume, itu akan menghasilkan nama 64 byte yang unik untuknya, membuat direktori mount baru (volume) di host FS - /var/lib/docker/volumes/%name%
, dan ketika container mulai pertama kali, tidak seperti mount direktori host biasa, itu akan salin wadah apa pun yang ada di /var/lib/mysql
volume, dan setelah itu akan menggunakan konten dari volume, bukan FS wadah. Itu memiliki implikasi penting: ketika saya membuat wadah dari gambar mysql yang lebih baru yang juga memiliki konten yang lebih baru /var/lib/mysql
, jika volumenya sudah ada, konten baru itu akan diabaikan.
Membuat volume data dari baris perintah
Deklarasi volume tidak harus ada di Dockerfile, kita juga bisa membuatnya dari baris perintah:
1 2 3 4 | docker run \ -v /data \ ubuntu \ touch /data/README.md |
Perintah ini membuat volume baru yang dipasang ke /data
, kemudian touch /data/README.md
membuat file kosong di dalamnya dan setelah itu penampung segera keluar.
Tidak seperti mount host biasa, buruh pelabuhan melacak semua volume yang pernah dibuatnya dan menyediakan beberapa docker volume ...
perintah untuk mereka. Salah satunya adalah ls
, yang mencetak volume yang ada. Dengan menggunakannya kita dapat menemukan volume yang baru kita buat:
1 2 3 | docker volume ls #DRIVER VOLUME NAME #local b45436c7f8bab37c0bfe998f962001226470cbc1dfe4ac59cc0287276e3d7a64 |
Volume Docker tidak secara eksklusif dimiliki oleh kontainer yang membuatnya. Menggunakan namanya, kita dapat memasangnya ke sejumlah kontainer lain:
1 2 3 4 5 6 7 | docker run -ti \ -v b45436c7f8bab37c0bfe998f962001226470cbc1dfe4ac59cc0287276e3d7a64:/data \ ubuntu bash root@21bd05dfa2dd:/# cd /data root@21bd05dfa2dd:/data# ls README.md |
Contoh klasik penggunaan fitur ini adalah menghubungkan volume ke container yang akan membuat backup data:
1 2 3 4 | docker run --rm \ -v b45436c7f8bab37c0bfe998f962001226470cbc1dfe4ac59cc0287276e3d7a64:/data -v $(pwd):/backup \ ubuntu tar cvf /backup/backup.tar /data |
Membuat volume tanpa kontainer
Anda bahkan tidak membutuhkan wadah untuk membuat volume. Kita dapat menggunakan docker volume create
perintah untuk membuat volume terlebih dahulu dan kemudian memasangnya ke wadah mana pun yang membutuhkannya. Keindahan dari pendekatan ini adalah kita dapat memilih nama volume dan sekali dan untuk selamanya menyingkirkan 64 karakter monstrositas itu:
1 | docker volume create mysql-data |
Membuat volume data penyimpanan bersama
volume create
perintah juga memberikan sesuatu yang jauh lebih kuat daripada hanya memilih nama. Hingga saat ini kami telah membuat volume yang dihosting di sistem file saat ini, yang tidak terlalu dapat diskalakan. Untuk mengatasi bahwa Docker mendukung plugin volume yang memungkinkan penyimpanan data volume di lokasi lain: Azure, DigitalOcean, dan beberapa lainnya .
Menginstal dan mengonfigurasi plugin semacam itu terkadang sulit, tetapi setelah selesai, menggunakan plugin hanyalah masalah menambahkan satu argumen lagi ke volume create
perintah:
1 | docker volume create --driver dostorage --name my-volume |
3. Penampung volume
Ada juga pola Docker lama yang disebut container data-only. Seperti namanya, ini adalah wadah dengan satu atau lebih volume terlampir, yang bertanggung jawab penuh untuk ada dan menyediakan volume itu untuk orang lain. Kontainer bahkan tidak harus dijalankan.
Setelah kita mendapatkan wadah seperti itu, kita dapat melampirkan volumenya sekaligus ke wadah lain dengan --volumes-from
argumen:
1 | docker run -d --volumes-from mydatacontainer mysql |
Sejujurnya, saya tidak melihat manfaat apa pun dari memiliki wadah volume khusus. Fungsionalitas yang sama dapat dicapai dengan volume data biasa tanpa overhead. Mungkin fitur ini lebih masuk akal sebelum Docker 1.8 memperkenalkan Volumes API, tetapi sekarang lebih membingungkan daripada berguna.
Ringkasan
Hari ini kami melihat beberapa cara untuk menyimpan data di dalam kontainer buruh pelabuhan: pemasangan direktori host, volume data dan kontainer volume. Sementara ketiganya didukung oleh Docker, hanya yang kedua - volume data - yang terlihat seperti cara yang 'benar' untuk melakukan pekerjaan itu. Bagaimanapun, pemasangan direktori hanya berfungsi di host lokal, penampung volume tidak menambahkan banyak nilai dibandingkan dengan volume data yang disebutkan, dan hanya volume data yang berfungsi dengan baik di host lokal dan di mana pun di cloud, dengan asumsi Anda menginstal plugin untuk itu.
- Get link
- X
- Other Apps
Comments
Post a Comment