Apa yang ditambahkan Docker ke lxc-tools (tools LXC userspace)?

398

Jika Anda melihat fitur Docker, sebagian besar sudah disediakan oleh LXC.

Jadi apa yang ditambahkan Docker? Mengapa saya menggunakan Docker di atas LXC biasa?

Flimm
sumber

Jawaban:

550

Dari FAQ Docker :

Docker bukan pengganti lxc. "lxc" mengacu pada kemampuan kernel linux (khususnya ruang nama dan grup kontrol) yang memungkinkan proses sandboxing satu sama lain, dan mengendalikan alokasi sumber daya mereka.

Di atas fondasi fitur kernel tingkat rendah ini, Docker menawarkan alat tingkat tinggi dengan beberapa fungsi yang kuat:

  • Penempatan portabel di seluruh mesin.Docker mendefinisikan format untuk bundling aplikasi dan semua dependensinya menjadi satu objek yang dapat ditransfer ke mesin yang didukung docker apa pun, dan dieksekusi di sana dengan jaminan bahwa lingkungan eksekusi yang terpapar pada aplikasi akan sama. Lxc mengimplementasikan proses sandboxing, yang merupakan prasyarat penting untuk penerapan portabel, tetapi itu saja tidak cukup untuk penerapan portabel. Jika Anda mengirimi saya salinan aplikasi Anda yang dipasang dalam konfigurasi lxc khusus, itu hampir pasti tidak akan berjalan di mesin saya seperti di komputer Anda, karena itu terikat dengan konfigurasi spesifik mesin Anda: jaringan, penyimpanan, pencatatan, distro, dll. Docker mendefinisikan abstraksi untuk pengaturan khusus mesin ini, sehingga wadah buruh pelabuhan yang sama dapat berjalan - tidak berubah - pada banyak mesin yang berbeda,

  • Aplikasi-sentris. Docker dioptimalkan untuk penyebaran aplikasi , tidak seperti mesin. Ini tercermin dalam API, antarmuka pengguna, filosofi desain, dan dokumentasi. Sebaliknya, skrip pembantu lxc fokus pada wadah sebagai mesin ringan - pada dasarnya server yang melakukan booting lebih cepat dan membutuhkan lebih sedikit ram. Kami pikir ada lebih dari sekadar wadah.

  • Membangun otomatis . Docker menyertakan alat bagi pengembang untuk secara otomatis merakit wadah dari kode sumber mereka, dengan kontrol penuh atas dependensi aplikasi, alat bangun, pengemasan, dll. Mereka bebas menggunakan make, maven, koki, boneka, garam, paket debian, rpms, sumber tarball, atau kombinasi apa pun di atas, terlepas dari konfigurasi mesin .

  • Versi. Docker mencakup kemampuan mirip git untuk melacak versi wadah yang berurutan, memeriksa perbedaan antara versi, melakukan versi baru, memutar kembali dll. Sejarah juga mencakup bagaimana wadah disusun dan oleh siapa, sehingga Anda mendapatkan keterlacakan penuh dari server produksi semua jalan kembali ke pengembang hulu. Docker juga mengimplementasikan unggahan dan unduhan tambahan, mirip dengan "git pull", sehingga versi baru suatu wadah dapat ditransfer dengan hanya mengirim diff.

  • Penggunaan kembali komponen. Wadah apa pun dapat digunakan sebagai "gambar dasar" untuk membuat komponen yang lebih khusus. Ini dapat dilakukan secara manual atau sebagai bagian dari bangunan otomatis. Misalnya Anda dapat menyiapkan lingkungan python yang ideal, dan menggunakannya sebagai basis untuk 10 aplikasi yang berbeda. Setup postgresql ideal Anda dapat digunakan kembali untuk semua proyek masa depan Anda. Dan seterusnya.

  • Berbagi. Docker memiliki akses ke registri publik ( https://registry.hub.docker.com/ ) di mana ribuan orang telah mengunggah kontainer yang berguna: apa pun dari redis, couchdb, postgres ke irc bouncer ke rails server aplikasi untuk mengambil gambar-gambar dasar untuk berbagai distro. Registri juga mencakup "perpustakaan standar" resmi dari wadah berguna yang dikelola oleh tim buruh pelabuhan. Registri itu sendiri adalah open-source, jadi siapa pun dapat menggunakan registri mereka sendiri untuk menyimpan dan mentransfer kontainer pribadi, untuk penyebaran server internal misalnya.

  • Alat ekosistem. Docker mendefinisikan API untuk mengotomatisasi dan menyesuaikan pembuatan dan penyebaran kontainer. Ada sejumlah besar alat terintegrasi dengan buruh pelabuhan untuk memperluas kemampuannya. Penempatan seperti PaaS (Dokku, Deis, Flynn), orkestrasi multi-simpul (maestro, garam, mesos, openstack nova), dashboard manajemen (docker-ui, cakrawala openstack, galangan kapal), manajemen konfigurasi (koki, boneka), integrasi berkelanjutan (jenkins, strider, travis), dll. Docker dengan cepat menetapkan dirinya sebagai standar untuk perkakas berbasis wadah.

Saya harap ini membantu!

Solomon Hykes
sumber
3
Ketika Anda mengatakan, "wadah apa pun dapat digunakan sebagai gambar dasar", saya kira Anda maksud wadah Docker, bukan wadah LXC yang dibuat secara independen dari Docker. Sejauh yang saya tahu, seseorang tidak dapat membuat wadah Docker dari awal, itu harus selalu mewarisi dari wadah Docker lain (pertanyaan terkait: stackoverflow.com/questions/18274088/… ).
Flimm
18
Anda dapat dengan mudah membuat wadah baru dari tarball apa pun dengan "impor buruh pelabuhan". Misalnya: "debootstrap raring ./rootfs; tar -C ./rootfs -c. | Buruh pelabuhan mengimpor flimm / mybase".
Solomon Hykes
3
apakah ini masih benar sekarang karena Docker punya libcontainer (yang bukan pengganti)
Garet Claborn
3
@ GaretClaborn ya, karena libcontainer hanya perpustakaan mereka sendiri untuk mengakses ruang nama dan grup, semua yang dikatakan Solomon masih berlaku.
John Morales
10
Wadah Linux adalah hasil membatasi dan mengisolasi suatu proses menggunakan serangkaian fasilitas Linux: chroot, cgroups, dan namespaces. LXC adalah alat userspace yang memanipulasi fasilitas itu. libcontainer adalah alternatif untuk LXC yang memanipulasi fasilitas yang sama. Docker menggunakan libcontainer secara default tetapi dapat menggunakan LXC sebagai gantinya. Yang mengatakan, Docker (banyak) lebih dari sekedar lapisan kompatibilitas di atas libcontainer / LXC; itu menambahkan fitur tambahan yang terdaftar di jawaban lain.
user100464
71

Mari kita lihat daftar fitur teknis Docker , dan periksa mana yang disediakan oleh LXC dan mana yang tidak.

Fitur:

1) Isolasi sistem file: setiap wadah proses berjalan dalam sistem file root yang benar-benar terpisah.

Disediakan dengan LXC polos.

2) Sumber daya isolasi : sumber daya sistem seperti cpu dan memori dapat dialokasikan secara berbeda untuk setiap wadah proses, menggunakan cgroups.

Disediakan dengan LXC polos.

3) Isolasi jaringan : setiap wadah proses berjalan di namespace jaringan sendiri, dengan antarmuka virtual dan alamat IP-nya sendiri.

Disediakan dengan LXC polos.

4) Copy-on-write : sistem file root dibuat menggunakan copy-on-write, yang membuat penyebaran sangat cepat, murah memori dan murah disk.

Ini disediakan oleh AUFS, sistem file gabungan tempat Docker bergantung. Anda dapat mengatur AUFS sendiri secara manual dengan LXC, tetapi Docker menggunakannya sebagai standar.

5) Penebangan : aliran standar (stdout / stderr / stdin) dari setiap wadah proses dikumpulkan dan dicatat untuk pengambilan waktu-nyata atau batch.

Docker menyediakan ini.

6) Ubah manajemen : perubahan pada sistem file wadah dapat dilakukan menjadi gambar baru dan digunakan kembali untuk membuat lebih banyak wadah. Tidak diperlukan konfigurasi templating atau manual.

"Templating or configuration manual" adalah referensi ke LXC, di mana Anda perlu mempelajari kedua hal ini. Docker memungkinkan Anda memperlakukan wadah dengan cara yang biasa Anda gunakan untuk merawat mesin virtual, tanpa mempelajari tentang konfigurasi LXC.

7) Shell interaktif : buruh pelabuhan dapat mengalokasikan pseudo-tty dan menempel pada input standar dari wadah apa pun, misalnya untuk menjalankan shell interaktif yang dibuang.

LXC sudah menyediakan ini.


Saya baru saja mulai belajar tentang LXC dan Docker, jadi saya akan menerima segala koreksi atau jawaban yang lebih baik.

Flimm
sumber
35
IMHO, jawaban ini tidak tepat. Docker tidak "menyediakan" fitur-fitur itu; itu hanya membuat mereka mudah digunakan secara sepele. Jika kita ingin menjadi nitpicky, kita dapat mengatakan bahwa LXC tidak menyediakan isolasi: namespaces menyediakannya, dan LXC hanyalah alat pengguna komoditas lahan untuk membuatnya lebih mudah digunakan daripada dengan unsharealat dasar (atau langsung clone()syscall). Demikian juga, Docker membuat hal-hal itu lebih mudah digunakan (dan membawa lebih banyak fitur di atas meja, seperti kemampuan untuk mendorong / menarik gambar). 2c saya
jpetazzo
6
@ jpetazzo: LXC sebenarnya cukup mudah, bagaimana cara Docker membuatnya lebih mudah (selain menambahkan fitur lain seperti mendorong dan menarik gambar)?
Flimm
31
@ Flimm: Saya suka perbandingan dalam edisi 16 Majalah Admin , hal. 34: Docker bundel LXC bersama dengan beberapa teknologi pendukung lainnya dan membungkusnya dalam antarmuka baris perintah yang mudah digunakan. Menggunakan wadah adalah sedikit seperti mencoba untuk menggunakan Git hanya dengan perintah seperti update-indexdan read-tree, tanpa alat akrab seperti add, commit, dan merge. Docker menyediakan lapisan "porselen" di atas "plumbing" LXC, memungkinkan Anda untuk bekerja dengan konsep tingkat yang lebih tinggi dan lebih sedikit khawatir tentang detail tingkat rendah.
0xC0000022L
4
Saya menjalankan tolok ukur UnixBench di dalam wadah buruh pelabuhan dan wadah LXC, menjalankan OS yang sama, dan LXC unggul dalam skor. Menjadi buruh pelabuhan berdasarkan LXC, saya sangat bingung dengan hasil saya.
gextra
7
Tampak bagi saya bahwa kinerja yang lebih lambat dari Docker terkait dengan disk I / O, karena itu mungkin disebabkan oleh adopsi AUFS.
gextra
16

Posting & jawaban di atas dengan cepat menjadi tanggal karena pengembangan LXD terus meningkatkan LXC . Ya, saya tahu Docker belum juga diam.

LXD sekarang mengimplementasikan repositori untuk gambar kontainer LXC yang dapat didorong atau ditarik oleh pengguna untuk berkontribusi atau digunakan kembali.

REST api LXD ke LXC sekarang memungkinkan penciptaan / penyebaran / pengelolaan LXC lokal & jarak jauh menggunakan sintaks perintah yang sangat sederhana.

Fitur utama LXD adalah:

  • Aman dengan desain (wadah yang tidak terjangkau, pembatasan sumber daya, dan banyak lagi)
  • Dapat diskalakan (dari wadah di laptop Anda ke ribuan node komputasi)
  • Intuitif (API sederhana, jelas, dan pengalaman baris perintah yang tajam)
  • Berbasis gambar (tidak ada lagi template distribusi, hanya gambar yang bagus dan tepercaya) Migrasi langsung

Ada plugin NCLXD sekarang untuk OpenStack memungkinkan OpenStack untuk memanfaatkan LXD untuk menyebarkan / mengelola wadah LXC sebagai VM di OpenStack daripada menggunakan KVM, vmware dll.

Namun, NCLXD juga memungkinkan cloud hybrid dari campuran HW VM tradisional dan VM LXC.

Plugin OpenStack nclxd daftar fitur yang didukung termasuk:

stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support

Pada saat Ubuntu 16.04 dirilis pada bulan April 2016 akan ada tambahan fitur keren seperti dukungan perangkat blok, dukungan migrasi langsung .

bmullan
sumber
4

Dockers menggunakan gambar yang dibangun berlapis-lapis. Ini menambahkan banyak dalam hal portabilitas, berbagi, versi dan fitur lainnya. Gambar-gambar ini sangat mudah untuk port atau transfer dan karena mereka berada di lapisan, perubahan dalam versi selanjutnya ditambahkan dalam bentuk lapisan di atas lapisan sebelumnya. Jadi, saat porting berkali-kali Anda tidak perlu port layer dasar. Dockers memiliki wadah yang menjalankan gambar-gambar ini dengan lingkungan eksekusi terkandung, mereka menambahkan perubahan sebagai lapisan baru memberikan kontrol versi yang mudah.

Selain itu Docker Hub adalah registri yang baik dengan ribuan gambar publik, di mana Anda dapat menemukan gambar yang memiliki OS dan perangkat lunak lain yang diinstal. Jadi, Anda bisa mendapatkan awal yang cukup baik untuk aplikasi Anda.

div
sumber
Ketika Anda mengatakan "built in layers" - apa artinya - (A) Salinan lapisan dasar, diadaptasi dan berkomitmen untuk lapisan "BARU". Jadi, lapisan dasar terputus dari yang berikutnya? (B) Lapisan dasar adalah / termasuk dalam lapisan "BARU" dan juga ditautkan. Jadi, perubahan pada lapisan dasar secara otomatis tercermin ke lapisan "BARU". Maaf, jika klarifikasi yang dicari terlalu naif. :( Kapil
Kapil
Gambar Docker dibangun berlapis-lapis. Untuk memasukkan istilah granular, semua perubahan hingga titik ketika sebuah layer dikomit hadir dalam lapisan gambar yang dibuat sampai saat itu. Setiap perubahan yang dilakukan setelah itu ditambahkan ke lapisan berikutnya dan di atas. Jadi, layer baru terhubung dengan layer dasar. Saya tidak berpikir bahwa lapisan baru yang sama dapat ditambahkan ke lapisan dasar yang berbeda dengan perubahan tambahan. Namun, jika banyak entitas ingin mempertahankan konsistensi dan memiliki lapisan dasar yang sama, maka hanya lapisan baru yang perlu diberikan kepada entitas ini untuk mencapai keadaan yang sama.
div
Namun, saya tidak diperbarui tentang perkembangan saat ini pada buruh pelabuhan dan mungkin ada perubahan pada implementasi gambar buruh pelabuhan yang tidak tercakup dalam komentar di atas.
div
Untuk lebih spesifik, lapisan diidentifikasi oleh tanda tangan (SHA-sesuatu, saya percaya) yang berarti bahwa jika Anda mengubah lapisan, itu adalah lapisan yang berbeda. @ Kapil: Itu berarti bahwa sementara perilakunya agak lebih dekat dengan opsi Anda (B), Anda sebenarnya tidak dapat membuat perubahan ke lapisan dasar. (atau lapisan apa pun, dalam hal ini) Suatu gambar dibangun dari daftar lapisan, masing-masing diterapkan secara berurutan; lapisan dapat dibersihkan (dan saya pikir mereka secara otomatis dibersihkan oleh buruh pelabuhan itu sendiri) ketika tidak lagi diperlukan; yaitu, ketika semua gambar referensi telah dihapus.
codermonkeyfuel
@ Kapil: Sejujurnya, pertanyaan Anda mungkin akan berfungsi paling baik sebagai pertanyaan baru, alih-alih sebagai komentar untuk pertanyaan ini, karena ini adalah pertanyaan yang berguna bagi orang untuk dapat melihat sendiri. Jika Anda ingin mengajukannya sebagai pertanyaan baru, saya juga akan menjawabnya.
codermonkeyfuel
0

Akan menjaga pithier ini, ini sudah ditanyakan dan dijawab di atas .

Namun saya mundur dan menjawabnya sedikit berbeda, mesin buruh pelabuhan itu sendiri menambahkan orkestrasi sebagai salah satu tambahannya dan ini adalah bagian yang mengganggu. Setelah Anda mulai menjalankan aplikasi sebagai kombinasi dari wadah yang menjalankan 'suatu tempat' di beberapa mesin wadah itu menjadi sangat menarik. Robustness, Horizontal Scaling, abstraksi lengkap dari perangkat keras yang mendasarinya, saya bisa terus dan terus ...

Bukan hanya Docker yang memberi Anda ini, sebenarnya standar Kontainer Orkestrasi de facto adalah Kubernetes yang hadir dalam banyak rasa, satu Docker, tetapi juga OpenShift, SuSe, Azure, AWS ...

Kemudian di bawah K8S ada mesin kontainer alternatif; yang menarik adalah Docker dan CRIO - baru-baru ini dibuat, tanpa daemon, dimaksudkan sebagai mesin kontainer khusus untuk Kubernet tetapi belum dewasa. Ini adalah persaingan antara ini yang saya pikir akan menjadi pilihan jangka panjang nyata untuk mesin kontainer.

Will Rothwell
sumber