Kontainer Docker adalah lingkungan yang sengaja diisolasi. Setiap container memiliki sistem file sendiri yang tidak dapat diakses langsung oleh container lain atau host Anda.
Terkadang container mungkin perlu berbagi data. Meskipun Anda harus bertujuan agar wadah mandiri, ada skenario di mana berbagi data tidak dapat dihindari. Ini mungkin agar wadah kedua dapat mengakses cache gabungan, menggunakan basis data yang didukung file, membuat cadangan, atau melakukan operasi pada data yang dibuat pengguna, seperti wadah pengoptimal gambar yang memproses foto profil yang diunggah melalui wadah server web terpisah .
Dalam panduan ini, kita akan melihat beberapa metode untuk meneruskan data di antara container Docker Anda. Kami akan menganggap Anda sudah menyiapkan Docker dan memahami konsep dasar seperti container, gambar, volume, dan jaringan.
Menggunakan Volume untuk Berbagi Direktori
Volume adalah cara de facto untuk mengatur berbagi data. Mereka adalah sistem file independen yang menyimpan data mereka di luar wadah individu mana pun. Memasang volume ke jalur sistem file dalam wadah memberikan akses baca-tulis ke data volume.
Volume dapat dilampirkan ke beberapa wadah secara bersamaan. Ini memfasilitasi berbagi data tanpa hambatan dan persistensi yang dikelola oleh Docker.
Buat volume untuk memulai:
docker volume create --name shared-data
Selanjutnya buat wadah Anda, pasang volume ke jalur sistem file yang diharapkan oleh setiap gambar:
docker run -d -v shared-data:/data --name example example-image:latest docker run -d -v shared-data:/backup-source --name backup backup-image:latest
Dalam contoh ini, backup
container akan mendapatkan akses efektif ke example
/data
penampung direktori. Itu akan dipasang sebagai /backup-source
; perubahan yang dibuat oleh salah satu wadah akan tercermin di wadah lainnya.
Memulai Kontainer dengan Cepat Dengan Volume yang Sesuai
Contoh di atas dapat disederhanakan menggunakan docker run
perintah --volumes-from
bendera. Ini menyediakan mekanisme untuk secara otomatis memasang volume yang sudah digunakan oleh wadah yang ada:
docker run -d --volumes-from example --name backup backup-image:latest
Kali ini backup
container akan menerima shared-data
volume dipasang ke /data
direktori. --volumes-from
flag menarik semua definisi volume yang dilampirkan ke example
wadah. Ini sangat ideal untuk pekerjaan pencadangan dan container berumur pendek lainnya yang bertindak sebagai komponen tambahan untuk layanan utama Anda.
Meningkatkan Keamanan Dengan Mount Hanya-Baca
Volume selalu dipasang dalam mode baca-tulis secara default. Semua container Anda yang memiliki akses ke suatu volume diizinkan untuk mengubah isinya, yang berpotensi menyebabkan hilangnya data yang tidak diinginkan.
Ini adalah praktik terbaik untuk memasang volume bersama dalam mode hanya-baca ketika penampung tidak diharapkan untuk membuat modifikasi. Pada contoh di atas, backup
container hanya perlu membaca konten shared-data
volume. Menyetel mount ke mode read-only akan memberlakukan ekspektasi ini, mencegah bug atau binari berbahaya dalam gambar menghapus data yang digunakan oleh example
wadah.
docker run -d -v shared-data:/backup-source:ro --name backup backup-image:latest
Menambahkan ro
sebagai parameter yang dipisahkan titik dua ketiga ke -v
flag menunjukkan volume harus dipasang dalam mode read-only. Anda juga dapat menulis readonly
bukannya ro
sebagai alternatif yang lebih eksplisit.
Berbagi Data Melalui Jaringan
Anda dapat menggunakan pertukaran jaringan sebagai pendekatan alternatif untuk berbagi data melalui volume sistem file. Menggabungkan dua kontainer ke jaringan Docker yang sama memungkinkan mereka berkomunikasi dengan lancar menggunakan nama host yang ditetapkan secara otomatis:
docker network create demo-network docker run -d --net demo-network --name first example-image:latest docker run -d --net demo-network --name second another-image:latest
Di sini first
akan dapat melakukan ping second
dan sebaliknya. Kontainer Anda dapat menjalankan layanan HTTP API yang memungkinkannya berinteraksi dengan data satu sama lain.
Melanjutkan contoh pencadangan, sekarang backup
container dapat membuat permintaan jaringan ke http://example:8080/backup-data
untuk memperoleh data untuk cadangan. example
wadah harus merespons dengan arsip yang berisi semua data yang perlu disimpan. Penampung cadangan kemudian bertanggung jawab untuk menyimpan arsip ke lokasi penyimpanan yang sesuai.
Menegakkan bahwa berbagi data terjadi melalui jaringan sering membantu upaya decoupling. Anda berakhir dengan antarmuka yang jelas yang tidak membuat ketergantungan keras antar layanan. Akses data dapat dikontrol secara lebih tepat dengan memaparkan API untuk setiap tipe data, alih-alih memberikan setiap kontainer akses total ke sebuah volume.
Penting untuk mempertimbangkan keamanan jika Anda menggunakan pendekatan ini. Pastikan API HTTP apa pun yang dirancang untuk akses internal oleh wadah Docker Anda yang lain tidak memiliki port yang terbuka di jaringan jembatan host Docker Anda. Ini adalah perilaku default saat menggunakan opsi jaringan yang ditunjukkan di atas; mengikat port dengan -p 8080:8080
akan mengizinkan akses ke API cadangan melalui antarmuka jaringan host Anda. Ini akan menjadi masalah keamanan.
Ringkasan
Wadah Docker adalah lingkungan terisolasi yang tidak dapat mengakses sistem file satu sama lain. Meskipun demikian, Anda dapat berbagi data dengan membuat volume yang dipasang ke semua wadah yang berpartisipasi. Menggunakan jaringan Docker bersama adalah opsi alternatif yang memberikan pemisahan yang lebih kuat dalam skenario di mana interaksi sistem file langsung tidak diperlukan.
Ini adalah praktik yang baik untuk membatasi interaksi antar-kontainer sejauh mungkin. Kasus di mana Anda memerlukan berbagi data harus didefinisikan dengan jelas untuk menghindari penggabungan layanan Anda secara erat. Wadah yang memiliki ketergantungan kaku pada data dari lainnya container bisa lebih sulit untuk diterapkan dan dipelihara dari waktu ke waktu, mengikis manfaat containerisasi dan isolasi yang lebih luas.