Mengapa Docker-in-Docker dianggap buruk?

21

Pada Agustus 2013 Jérôme Petazzoni menciptakan Docker di Docker, dindsingkatnya, ini memungkinkan kontainer Docker dibuat di dalam Docker Containers, fungsi ini terbukti sangat populer sehingga Repositori GitHub Jérôme menerima lebih dari seribu bintang dan tiga ratus garpu.

Pada Docker 1.8, dirilis dua tahun kemudian pada Agustus 2015, Docker di Docker langsung didukung oleh Docker di luar kotak. Namun, penggunaan Docker di Docker disertai dengan peringatan, yang tampaknya terkait dengan Jérôme's Post: Menggunakan Docker-in-Docker untuk CI Anda atau lingkungan pengujian? Berpikir dua kali. yang berfokus pada alasan mengapa Docker di Docker bukan pilihan yang bagus untuk Continuous Integration.

Mengapa dianggap buruk menggunakan Docker di Docker? Apakah ini hanya kasus untuk menghindari Turtles sepenuhnya? atau pertimbangan kinerja?

Turtles semua jalan ke bawah!

Richard Slater
sumber
Saya tidak terbiasa dengan buruh pelabuhan selain telah membacanya. Tapi kalau dipikir-pikir, rasanya Anda memiliki host OS di perangkat keras, host memuat kontainer, lalu kontainer memuat yang lain. Sepertinya banyak overhead mengingat idenya adalah untuk menyebarkan gambar. Gambar gambar gambar ... Juga tertarik pada jawaban aktual untuk q ini.
Tanpa Pengembalian Uang Tanpa Pengembalian
Anda menautkan jawaban ke pertanyaan Anda ... atau apakah saya melewatkan sesuatu?
AnoE

Jawaban:

16

Kekhawatiran Integrasi Berkelanjutan

Singkatnya: Docker di Docker (dind) tidak menangani konkurensi dengan baik.

Alasan mengapa Anda tidak boleh menggunakan dind untuk CI adalah karena Docker dirancang untuk memiliki akses eksklusif ke direktori yang digunakannya untuk penyimpanan (biasanya /var/lib/docker). Dind tidak menghargai ini karena semua proses anak menggunakan direktori ini secara bersamaan. Setiap kali Anda membangun kembali (dari CI misalnya), apa pun yang terkait dengan aplikasi Anda dalam direktori ini bisa terhapus dan dipaksa untuk memulai dari nol. Bagaimana pengguna Anda akan suka jika mereka memasukkan rincian pembayaran mereka, mengklik "Beli", dan tiba-tiba menemukan diri mereka kembali di layar login seolah-olah mereka tidak pernah melakukan apa pun? Itu hanya UX yang tidak bagus. Dua pembangunan kembali terjadi sekaligus? Itu benar-benar akan berakhir buruk bagi semua orang yang terlibat (termasuk integritas data Anda).

Kekhawatiran lainnya

Dari tautan yang diposkan OP, kekhawatiran keamanan muncul karena sistem akan mencoba menerapkan kebijakan keamanan dengan cara yang sangat "mirip-CSS" di mana wadah yang lebih rendah dapat memiliki akses ke sumber daya penampung luar kecuali dilarang secara eksplisit. Ingat ketika Anda dapat mengakses sumber daya server web dengan melakukan sesuatu seperti "mywebsite.com/../another_folder/private_resource.txt"? Juga, kadang-kadang filesystem tidak bermain dengan baik satu sama lain ketika mereka bersarang dengan cara ini.

Cara Mengatasinya

Untungnya, posting blog di OP memiliki solusi yang bagus untuk masalah ini. Kecuali jika kebutuhan Anda tidak terpenuhi oleh "bangun / jalankan / dorong wadah Docker dari sistem CI Anda sendiri yang berjalan di Docker", Anda dapat menggunakan -vmode (tambahkan volume data ke wadah Anda) pada soket Docker (biasanya /var/run/docker.sock:/var/run/docker.sock) untuk memungkinkan jenis akses yang Anda butuhkan ke volume data "bersama". Wadah-wadah ini akan dimulai bersama induknya, bukannya di bawahnya, memaksa IO sinkron. Sekarang Anda memiliki hal yang sama (hampir) seperti dind tetapi tanpa kelemahan yang datang dengan Docker tidak dibangun untuk konkurensi.

Referensi (dari OP): Menggunakan Docker-in-Docker untuk CI Anda atau lingkungan pengujian? Berpikir dua kali.

Peter G
sumber
Berikut adalah salah satu contoh pendekatan yang dijelaskan (dood) untuk Jenkins, namun beberapa masalah dilaporkan saat menggunakannya hub.docker.com/r/psharkey/jenkins-dood
rombob
Dari penjelasan ini, saya masih tidak bisa memastikan apakah dind harus dihindari dalam kasus saya ... Agen pembangun saya berjalan dalam wadah buruh pelabuhan, dan melakukan hal berikut: 1. Checkout repo.2. Start container & mount repo.3. Run some build-/test script inside container.Per agen, hanya ada satu saja ' dind'-container berjalan. Apakah masih ada masalah dengan dind dalam use case ini?
helmesjo