Saya menjalankan Jenkins di dalam wadah Docker. Saya bertanya-tanya apakah tidak masalah bagi wadah Jenkins untuk menjadi tuan rumah Docker? Apa yang saya pikirkan adalah untuk memulai wadah buruh pelabuhan baru untuk setiap build uji integrasi dari dalam Jenkins (untuk memulai database, pialang pesan, dll.). Kontainer dengan demikian harus dimatikan setelah tes integrasi selesai. Apakah ada alasan untuk menghindari menjalankan wadah buruh pelabuhan dari dalam wadah buruh pelabuhan lain dengan cara ini?
jenkins
docker
docker-dind
Johan
sumber
sumber
Jawaban:
Menjalankan Docker di dalam Docker (alias dind ), sedapat mungkin, harus dihindari, jika memungkinkan. (Sumber disediakan di bawah ini.) Sebaliknya, Anda ingin mengatur cara agar wadah utama Anda memproduksi dan berkomunikasi dengan wadah saudara .
Jérôme Petazzoni - penulis fitur yang memungkinkan Docker berjalan di dalam wadah Docker - sebenarnya menulis posting blog yang mengatakan tidak melakukannya . Kasus penggunaan yang dia gambarkan cocok dengan kasus penggunaan OP yang tepat dari wadah CI Docker yang perlu menjalankan pekerjaan di dalam wadah Docker lainnya.
Petazzoni mencantumkan dua alasan mengapa dind merepotkan:
Dari posting blog itu, ia menjelaskan alternatif berikut,
sumber
sudo
ketika melakukan seperti ini? Terima kasihdocker
grup:sudo usermod -aG docker $USER
. Anda harus melakukan relog ulang setelah itu./var/run/docker.sock
saat Anda menjalankan docker untuk mac pada mesin macos Anda./var/run/docker.sock
Saya menjawab pertanyaan serupa sebelumnya tentang cara menjalankan wadah Docker di dalam Docker .
Jadi, menjalankan Docker di dalam Docker oleh banyak orang dianggap sebagai jenis solusi yang baik untuk jenis masalah ini. Sekarang, trennya adalah menggunakan wadah "saudara". Lihat jawabannya oleh @predmijat di halaman ini untuk info lebih lanjut.
sumber
Tidak apa-apa untuk menjalankan Docker-in-Docker (DinD) dan pada kenyataannya Docker (perusahaan) memiliki gambar DinD resmi untuk ini.
Namun peringatannya adalah bahwa itu membutuhkan wadah istimewa, yang tergantung pada kebutuhan keamanan Anda mungkin bukan alternatif yang layak.
Solusi alternatif menjalankan Docker menggunakan wadah saudara (alias Docker-out-of-Docker atau DooD) tidak memerlukan wadah istimewa, tetapi memiliki beberapa kelemahan yang berasal dari kenyataan bahwa Anda meluncurkan wadah dari dalam konteks yang berbeda dari yang sedang dijalankan (yaitu, Anda meluncurkan wadah dari dalam wadah, namun berjalan di tingkat tuan rumah, bukan di dalam wadah).
Saya menulis sebuah blog yang menggambarkan pro / kontra dari DinD vs DooD di sini .
Karena itu, Nestybox (startup yang baru saya dirikan) sedang mengerjakan solusi yang menjalankan Docker-in-Docker dengan aman (tanpa menggunakan wadah istimewa). Anda dapat memeriksanya di www.nestybox.com .
sumber
Ya, kita dapat menjalankan buruh pelabuhan di buruh pelabuhan, kita harus melampirkan sockeet unix "/var/run/docker.sock" di mana daemon buruh pelabuhan mendengarkan secara default sebagai volume ke buruh pelabuhan induk menggunakan "-v / var / run /docker.sock:/var/run/docker.sock ". Terkadang, masalah izin mungkin muncul untuk soket daemon docker yang dapat Anda tulis "sudo chmod 757 /var/run/docker.sock".
Dan juga perlu menjalankan docker dalam mode istimewa, jadi perintahnya adalah:
sudo chmod 757 /var/run/docker.sock
run buruh pelabuhan --privileged = true -v /var/run/docker.sock:/var/run/docker.sock -itu ...
sumber