Bagaimana Docker berbeda dari mesin virtual?

3693

Saya terus membaca ulang dokumentasi Docker untuk mencoba memahami perbedaan antara Docker dan VM lengkap. Bagaimana cara mengatur untuk menyediakan sistem file lengkap, lingkungan jaringan yang terisolasi, dll tanpa menjadi berat?

Mengapa menggunakan perangkat lunak untuk gambar Docker (jika itu istilah yang tepat) lebih mudah daripada hanya menggunakan untuk lingkungan produksi yang konsisten?

zslayton
sumber
11
Analisis kinerja Docker vs KVM: bodenr.blogspot.com/2014/05/...
HDave
1
Jika Anda mencari perbedaan di antara gambar-gambar mereka - stackoverflow.com/questions/29096967/…
devesh-ahuja
21
Docker bukan mesin virtual - ini adalah alat manajemen konfigurasi.
aaa90210
3
Dengan kata sederhana: VM -> tiga lapisan virtual harus dijalankan untuk memungkinkan menjalankan aplikasi Anda, jika Anda ingin virtualisasi server OK tetapi jika Anda hanya ingin menjalankan aplikasi web bukan solusi terbaik. DOCKER -> Hanya satu lapisan antara CPU asli Anda dan aplikasi web Anda. Lebih kuat dan lebih baik kloning / mirroring jika Anda hanya harus menjalankan aplikasi web Anda untuk virtualisasi yang saya rekomendasikan
Davide Castronovo
6
jangan lupa bahwa Docker untuk Mac dan Docker untuk Windows menggunakan lapisan virtualisasi.
Shapeshifter

Jawaban:

3435

Docker awalnya menggunakan LinuX Containers (LXC), tetapi kemudian beralih ke runC (sebelumnya dikenal sebagai libcontainer ), yang berjalan di sistem operasi yang sama dengan host-nya. Ini memungkinkannya untuk berbagi banyak sumber daya sistem operasi host. Selain itu, ia menggunakan sistem file berlapis ( AuFS ) dan mengelola jaringan.

AuFS adalah sistem file berlapis, sehingga Anda dapat memiliki bagian hanya baca dan bagian tulis yang digabung bersama. Seseorang dapat memiliki bagian umum dari sistem operasi sebagai hanya baca (dan dibagi di antara semua wadah Anda) dan kemudian memberikan masing-masing wadah mount sendiri untuk ditulis.

Jadi, katakanlah Anda memiliki gambar kontainer 1 GB; jika Anda ingin menggunakan VM penuh, Anda harus memiliki 1 GB x jumlah VM yang Anda inginkan. Dengan Docker dan AuFS Anda dapat berbagi sebagian besar 1 GB di antara semua wadah dan jika Anda memiliki 1000 kontainer, Anda mungkin masih memiliki sedikit lebih dari 1 GB ruang untuk wadah OS (dengan asumsi mereka semua menjalankan gambar OS yang sama) .

Sistem tervirtualisasi penuh mendapatkan set sumber daya sendiri yang dialokasikan untuk itu, dan melakukan pembagian minimal. Anda mendapatkan lebih banyak isolasi, tetapi jauh lebih berat (membutuhkan lebih banyak sumber daya). Dengan Docker Anda mendapatkan lebih sedikit isolasi, tetapi wadahnya ringan (membutuhkan lebih sedikit sumber daya). Jadi, Anda dapat dengan mudah menjalankan ribuan kontainer pada host, dan itu bahkan tidak akan berkedip. Coba lakukan itu dengan Xen, dan kecuali Anda memiliki host yang sangat besar, saya pikir itu tidak mungkin.

Sistem tervirtualisasi penuh biasanya membutuhkan beberapa menit untuk memulai, sedangkan wadah Docker / LXC / runC membutuhkan waktu beberapa detik, dan seringkali bahkan kurang dari satu detik.

Ada pro dan kontra untuk setiap jenis sistem tervirtualisasi. Jika Anda ingin isolasi penuh dengan sumber daya yang terjamin, VM lengkap adalah cara untuk melakukannya. Jika Anda hanya ingin mengisolasi proses dari satu sama lain dan ingin menjalankan banyak dari mereka pada host berukuran cukup, maka Docker / LXC / runC tampaknya menjadi cara untuk pergi.

Untuk informasi lebih lanjut, lihat kumpulan posting blog ini yang menjelaskan cara kerja LXC.

Mengapa menyebarkan perangkat lunak ke gambar buruh pelabuhan (jika itu istilah yang tepat) lebih mudah daripada hanya menggunakan lingkungan produksi yang konsisten?

Menyebarkan lingkungan produksi yang konsisten lebih mudah diucapkan daripada dilakukan. Bahkan jika Anda menggunakan alat-alat seperti Chef dan Puppet , selalu ada pembaruan OS dan hal-hal lain yang berubah antara host dan lingkungan.

Docker memberi Anda kemampuan untuk mengambil gambar OS menjadi gambar bersama, dan membuatnya mudah untuk digunakan pada host Docker lainnya. Secara lokal, dev, qa, prod, dll .: semua gambar yang sama. Tentu Anda bisa melakukan ini dengan alat lain, tetapi tidak semudah atau cepat.

Ini bagus untuk pengujian; katakanlah Anda memiliki ribuan tes yang perlu terhubung ke database, dan setiap tes membutuhkan salinan asli dari database dan akan membuat perubahan pada data. Pendekatan klasik untuk ini adalah mereset database setelah setiap tes baik dengan kode khusus atau dengan alat-alat seperti Flyway - ini bisa sangat memakan waktu dan berarti bahwa tes harus dijalankan secara seri. Namun, dengan Docker Anda dapat membuat gambar dari database Anda dan menjalankan satu contoh per tes, dan kemudian menjalankan semua tes secara paralel karena Anda tahu mereka semua akan berjalan melawan snapshot yang sama dari database. Karena tes berjalan secara paralel dan dalam wadah Docker, mereka dapat menjalankan semua pada kotak yang sama pada waktu yang sama dan harus menyelesaikan lebih cepat. Coba lakukan itu dengan VM penuh.

Dari komentar ...

Menarik! Saya kira saya masih bingung dengan gagasan "snapshot [ting] OS". Bagaimana cara seseorang melakukannya tanpa, membuat gambar OS?

Baiklah, mari kita lihat apakah saya bisa menjelaskan. Anda mulai dengan gambar dasar, dan kemudian membuat perubahan Anda, dan melakukan perubahan itu menggunakan buruh pelabuhan, dan itu membuat gambar. Gambar ini hanya berisi perbedaan dari pangkalan. Ketika Anda ingin menjalankan gambar Anda, Anda juga memerlukan basis, dan lapisan gambar Anda di atas basis menggunakan sistem file berlapis: seperti yang disebutkan di atas, Docker menggunakan AuFS. AuFS menggabungkan berbagai lapisan menjadi satu dan Anda mendapatkan apa yang Anda inginkan; Anda hanya perlu menjalankannya. Anda dapat terus menambahkan lebih banyak gambar (lapisan) dan itu akan terus menyimpan hanya diff. Karena Docker biasanya membangun di atas gambar yang sudah jadi dari registri , Anda jarang harus "memotret" sendiri seluruh OS.

Ken Cochrane
sumber
239
Ken, di beberapa tempat Anda mengkonfigurasi OS dengan kernel. Semua kontainer pada host dijalankan di bawah kernel yang sama, tetapi sisa file OS bisa unik per kontainer.
Andy
22
Menarik! Saya kira saya masih bingung dengan gagasan "snapshot [ting] OS". Bagaimana cara seseorang melakukannya tanpa, membuat gambar OS?
zslayton
7
@ murtaza52 mereka menambahkan dukungan untuk sistem file yang berbeda sehingga Aufs tidak akan menjadi masalah. Tidak yakin kapan dukungan 32 bit akan ditambahkan, jangan berpikir ada permintaan yang kuat, jadi itu adalah daftar prioritas rendah, tapi saya bisa salah.
Ken Cochrane
21
@ Mike: ... yang tidak diragukan lagi terinspirasi oleh penjara FreeBSD HISTORY The jail utility appeared in FreeBSD 4.0.
Stefan Paletta
21
Bagi mereka yang bertanya-tanya apa komentar @ Mike yang kami balas karena tampaknya telah dihapus, inilah: <Satu hal yang hilang adalah referensi ke fakta bahwa Linux Containers adalah tiruan dari sumber inspirasi yang sebenarnya : Wadah Solaris. Jauh di tahun 2004 ... Ini adalah konsep revolusioner dan cara yang hebat dan hebat untuk melakukan mesin virtual yang terjangkau dan di-host yang benar-benar performant. Joyent adalah yang pertama saya sadari ...>
Jeffrey 'jf' Lim
559

Jawaban yang bagus Hanya untuk mendapatkan representasi gambar dari wadah vs VM, lihat yang di bawah ini.

masukkan deskripsi gambar di sini

Sumber

manu97
sumber
20
[Strike] Sejauh yang saya mengerti, di atas "mesin docker" harus ada kernel linux bersama. Lalu ada bins / lib yang bahkan dibagikan secara umum. Pertama setelah itu datang tempat sampah / lib dan aplikasi yang khusus untuk setiap wadah. Harap perbaiki saya jika saya salah. </strike> Saya salah. Gambar Docker membagikan kernel dengan host, lihat superuser.com/questions/889472/… . Namun, untuk mengilustrasikan sistem file gabungan wadah, mungkin ada lapisan bersama lib / bins langsung di atas mesin buruh pelabuhan.
Betamo
13
Saya memiliki masalah dengan gambar di atas, karena Hypervisor dapat diinstal pada bare metal / infrastruktur tetapi Docket tidak dapat (belum)
reza
@reza, saya setuju Hypervisor dapat diinstal pada Bare metal, tetapi intinya Docker direkomendasikan untuk kontainerisasi aplikasi dan cara membatasi atau menghindari virtualisasi yang tidak diperlukan / berlaku untuk beberapa skenario. Ken Cochrane menjelaskan ini lebih detail stackoverflow.com/a/16048358/2478933
manu97
4
Ini tidak menjelaskan apa itu Docker Engine . Gambar yang sangat abstrak.
kyb
9
Tidak ada lapisan "Docker Engine" antara container dan kernel, container hanyalah sebuah proses dengan pengaturan khusus di kernel (namespaces, cgroups, dll.)
Paweł Prażak
504

Mungkin bermanfaat untuk memahami bagaimana virtualisasi dan wadah bekerja pada level rendah. Itu akan menjernihkan banyak hal.

Catatan: Saya sedikit menyederhanakan dalam menjelaskan di bawah ini. Lihat referensi untuk informasi lebih lanjut.

Bagaimana virtualisasi bekerja pada level rendah?

Dalam hal ini manajer VM mengambil alih ring CPU 0 (atau "mode root" pada CPU yang lebih baru) dan mencegat semua panggilan istimewa yang dibuat oleh OS tamu untuk membuat ilusi bahwa OS tamu memiliki perangkat kerasnya sendiri. Fakta menyenangkan: Sebelum tahun 1998 dianggap mustahil untuk mencapai ini dalam arsitektur x86 karena tidak ada cara untuk melakukan intersepsi semacam ini. Orang-orang di VMWare adalah yang pertama yang memiliki ide untuk menulis ulang byte yang dapat dieksekusi dalam memori untuk panggilan istimewa OS tamu untuk mencapai ini.

Efek bersihnya adalah virtualisasi memungkinkan Anda menjalankan dua OS yang sama sekali berbeda pada perangkat keras yang sama. Setiap OS tamu melewati semua proses bootstrap, memuat kernel dll. Anda dapat memiliki keamanan yang sangat ketat, misalnya, OS tamu tidak bisa mendapatkan akses penuh ke host OS atau tamu lain dan mengacaukan semuanya.

Bagaimana wadah bekerja di level rendah?

Sekitar tahun 2006 , orang-orang termasuk beberapa karyawan di Google menerapkan fitur level kernel baru yang disebut namespaces (namun ide itu jauh sebelumnya ada di FreeBSD). Salah satu fungsi OS adalah untuk memungkinkan berbagi sumber daya global seperti jaringan dan disk ke proses. Bagaimana jika sumber daya global ini dibungkus dalam ruang nama sehingga mereka hanya dapat dilihat oleh proses yang berjalan di ruang nama yang sama? Katakanlah, Anda bisa mendapatkan sepotong disk dan meletakkannya di namespace X dan kemudian proses yang berjalan di namespace Y tidak bisa melihat atau mengaksesnya. Demikian pula, proses dalam namespace X tidak dapat mengakses apa pun dalam memori yang dialokasikan ke namespace Y. Tentu saja, proses di X tidak dapat melihat atau berbicara dengan proses di namespace Y. Ini menyediakan semacam virtualisasi dan isolasi untuk sumber daya global. Beginilah cara kerja buruh pelabuhan: Setiap kontainer berjalan di namespace sendiri tetapi menggunakan persis sama kernel sebagai semua wadah lainnya. Isolasi terjadi karena kernel mengetahui namespace yang ditugaskan untuk proses dan selama panggilan API memastikan bahwa proses hanya dapat mengakses sumber daya di namespace-nya sendiri.

Keterbatasan kontainer vs VM harus jelas sekarang: Anda tidak dapat menjalankan OS yang sama sekali berbeda dalam wadah seperti di VM. Namun Anda dapat menjalankan distro Linux yang berbeda karena mereka berbagi kernel yang sama. Level isolasi tidak sekuat di VM. Bahkan, ada cara untuk wadah "tamu" untuk mengambil alih tuan rumah dalam implementasi awal. Anda juga dapat melihat bahwa ketika Anda memuat wadah baru, seluruh salinan baru OS tidak mulai seperti di VM. Semua kontainer berbagi kernel yang sama. Inilah sebabnya mengapa wadah itu ringan. Juga tidak seperti VM, Anda tidak perlu mengalokasikan banyak memori ke kontainer karena kami tidak menjalankan salinan OS yang baru. Hal ini memungkinkan untuk menjalankan ribuan kontainer pada satu OS sambil mem-sandbox mereka yang mungkin tidak dapat dilakukan jika kami menjalankan salinan OS yang terpisah di VM-nya sendiri.

Shital Shah
sumber
26
Wow, terima kasih atas penjelasan tingkat rendah yang luar biasa (dan fakta sejarah). Saya mencari itu dan tidak ditemukan di atas. Apa yang Anda maksud dengan "Anda dapat menjalankan distro Linux yang berbeda karena mereka berbagi kernel yang sama." ? Apakah Anda mengatakan bahwa sebuah wadah tamu harus memiliki versi kernel Linux yang sama persis atau tidak masalah? Jika tidak masalah bagaimana jika saya menjalankan perintah OS pada tamu tetapi hanya didukung di kernel tamu. Atau misalnya bug diperbaiki di kernel tamu tetapi tidak di kernel host. Semua tamu akan memanifestasikan bug, benar? Meskipun para tamu ditambal.
Jeach
7
@Jeach: wadah tidak memiliki kernel sendiri, mereka berbagi / menggunakan salah satu host. Jadi Anda tidak dapat menjalankan kontainer yang membutuhkan kernel yang berbeda di mesin / VM yang sama.
user276648
2
Pertanyaan: Anda menulis bahwa beberapa karyawan Google terlibat dalam fitur kernel namespaces sekitar tahun 1996 - namun Google tidak didirikan sampai tahun 1998. Apakah maksud Anda adalah 'orang yang kemudian menjadi karyawan Google'?
Martin Gjaldbaek
3
@martin - terima kasih untuk memperhatikan tahun ini adalah tahun 2006. Juga saya harus menyebutkan bahwa berbagai jenis ruang nama telah ada di Linux sejak tahun 2002 tetapi itu adalah pekerjaan selama tahun 2006 yang meletakkan dasar untuk kontainerisasi. Saya telah memperbarui jawabannya dengan referensi.
Shital Shah
20
+1 Ini harus menjadi jawaban yang ditandai, sementara jawaban lainnya menawarkan beberapa klarifikasi, hanya penjelasan dari tingkat bawah ke atas yang dapat menjelaskan cara kerja teknologi ini, 'proses yang dikelompokkan dalam ruang nama mereka sendiri = wadah'. Terima kasih banyak, saya mengerti sekarang.
Tino Mclaren
328

Saya suka jawaban Ken Cochrane.

Tapi saya ingin menambahkan sudut pandang tambahan, tidak dibahas secara rinci di sini. Menurut saya Docker juga berbeda dalam keseluruhan proses. Berbeda dengan VMs, Docker tidak (hanya) tentang berbagi sumber daya yang optimal dari perangkat keras, apalagi ia menyediakan "sistem" untuk aplikasi pengemasan (lebih disukai, tetapi bukan keharusan, sebagai seperangkat layanan microsoft).

Bagi saya itu cocok di celah antara alat berorientasi pengembang seperti rpm, paket Debian , Maven , npm + Git di satu sisi dan alat ops seperti Puppet , VMware, Xen, sebut saja ...

Mengapa menyebarkan perangkat lunak ke gambar buruh pelabuhan (jika itu istilah yang tepat) lebih mudah daripada hanya menggunakan lingkungan produksi yang konsisten?

Pertanyaan Anda mengasumsikan beberapa lingkungan produksi yang konsisten. Tetapi bagaimana cara membuatnya konsisten? Pertimbangkan beberapa jumlah (> 10) server dan aplikasi, tahapan dalam pipeline.

Untuk menjaga sinkronisasi ini, Anda akan mulai menggunakan sesuatu seperti Puppet, Chef atau skrip provisi Anda sendiri, aturan yang tidak dipublikasikan, dan / atau banyak dokumentasi ... Dalam teori server dapat berjalan tanpa batas waktu, dan dijaga agar tetap konsisten dan mutakhir. Praktik gagal untuk mengelola konfigurasi server sepenuhnya, sehingga ada cakupan yang cukup untuk penyimpangan konfigurasi, dan perubahan tak terduga untuk menjalankan server.

Jadi ada pola yang diketahui untuk menghindari ini, yang disebut server tidak berubah . Tetapi pola server abadi tidak disukai. Sebagian besar karena keterbatasan VM yang digunakan sebelum Docker. Berurusan dengan beberapa gigabytes gambar besar, memindahkan gambar-gambar besar itu, hanya untuk mengubah beberapa bidang dalam aplikasi, sangat sangat melelahkan. Bisa dimengerti ...

Dengan ekosistem Docker, Anda tidak perlu berpindah-pindah gigabyte pada "perubahan kecil" (terima kasih aufs dan Registry) dan Anda tidak perlu khawatir kehilangan kinerja dengan mengemas aplikasi ke dalam wadah Docker saat runtime. Anda tidak perlu khawatir tentang versi gambar itu.

Dan akhirnya Anda bahkan akan sering dapat mereproduksi lingkungan produksi yang kompleks bahkan pada laptop Linux Anda (jangan panggil saya jika tidak bekerja dalam kasus Anda;))

Dan tentu saja Anda dapat memulai wadah Docker di VM (itu ide yang bagus). Kurangi penyediaan server Anda di tingkat VM. Semua hal di atas dapat dikelola oleh Docker.

PS Sementara itu Docker menggunakan implementasi sendiri "libcontainer", bukan LXC. Tapi LXC masih bisa digunakan.

aholbreich
sumber
1
Tampaknya aneh untuk memasukkan git ke dalam sekelompok alat seperti rpm dan dpkg. Saya menyebutkan ini karena saya melihat upaya untuk menggunakan sistem kontrol versi seperti git sebagai alat distribusi / pengemasan untuk menjadi sumber banyak kebingungan.
blitzen9872
2
dia tidak salah, git dapat digunakan untuk manajemen paket, misalnya bower secara internal merupakan cli yang bagus untuk mengunduh tag git.
roo2
2
aplikasi pengemasan dalam wadah adalah pendekatan yang menarik dan valid. Namun jika Anda mengemasnya di buruh pelabuhan, ini akan berlebihan, karena tidak akan ada dukungan langsung untuk dependensi atau pustaka bersama. Inilah yang ingin dicapai oleh teknologi pengemasan baru seperti Ubuntu Snap dan Flatpak untuk Redhat. Menurut saya, salah satu teknologi pengemasan ini akan menang dan menjadi masa depan pengemasan di linux.
yosefrow
@ blitzen9872 menyetujui ini. Tetapi disebutkan persis karena itu sering digunakan untuk distribusi di praksis, sekali lagi saya juga tidak suka.
aholbreich
@yosefrow rumit "berlebihan" Lihat Ide dan keuntungan dari pola "server tidak berubah", ada beberapa kelemahan tentu saja ... Jika Anda melihat berlebihan, jangan gunakan itu ..
aholbreich
245

Docker bukan metodologi virtualisasi. Ini bergantung pada alat lain yang benar-benar menerapkan virtualisasi berbasis wadah atau virtualisasi tingkat sistem operasi. Untuk itu, Docker awalnya menggunakan driver LXC, kemudian pindah ke libcontainer yang sekarang diganti namanya menjadi runc. Docker terutama berfokus pada mengotomatiskan penyebaran aplikasi di dalam wadah aplikasi. Wadah aplikasi dirancang untuk mengemas dan menjalankan layanan tunggal, sedangkan wadah sistem dirancang untuk menjalankan banyak proses, seperti mesin virtual. Jadi, Docker dianggap sebagai manajemen wadah atau alat penyebaran aplikasi pada sistem kemas.

Untuk mengetahui perbedaannya dari virtualisasi lain, mari kita lihat virtualisasi dan tipenya. Maka, akan lebih mudah untuk memahami apa bedanya di sana.

Virtualisasi

Dalam bentuknya, itu dianggap metode membagi mainframe secara logis untuk memungkinkan beberapa aplikasi untuk berjalan secara bersamaan. Namun, skenario berubah secara drastis ketika perusahaan dan komunitas open source mampu menyediakan metode penanganan instruksi khusus dengan satu dan lain cara dan memungkinkan beberapa sistem operasi dijalankan secara bersamaan pada sistem berbasis x86 tunggal.

Hypervisor

Pegangan hypervisor menciptakan lingkungan virtual tempat mesin virtual tamu beroperasi. Itu mengawasi sistem tamu dan memastikan bahwa sumber daya dialokasikan kepada para tamu sesuai kebutuhan. Hypervisor berada di antara mesin fisik dan mesin virtual dan menyediakan layanan virtualisasi ke mesin virtual. Untuk merealisasikannya, ia mencegat operasi sistem operasi tamu pada mesin virtual dan mengemulasi operasi pada sistem operasi mesin host.

Pesatnya perkembangan teknologi virtualisasi, terutama di cloud, telah mendorong penggunaan virtualisasi lebih lanjut dengan memungkinkan beberapa server virtual dibuat pada satu server fisik dengan bantuan hypervisor, seperti Xen, VMware Player, KVM, dll., Dan penggabungan dukungan perangkat keras dalam prosesor komoditas, seperti Intel VT dan AMD-V.

Jenis-jenis Virtualisasi

Metode virtualisasi dapat dikategorikan berdasarkan bagaimana meniru perangkat keras ke sistem operasi tamu dan mengemulasi lingkungan operasi tamu. Terutama, ada tiga jenis virtualisasi:

  • Persaingan
  • Paravirtualization
  • Virtualisasi berbasis wadah

Persaingan

Emulation, juga dikenal sebagai virtualisasi penuh menjalankan kernel OS mesin virtual sepenuhnya dalam perangkat lunak. Hypervisor yang digunakan dalam tipe ini dikenal sebagai hypervisor Tipe 2. Itu diinstal di bagian atas sistem operasi host yang bertanggung jawab untuk menerjemahkan kode kernel OS tamu ke instruksi perangkat lunak. Terjemahan dilakukan sepenuhnya dalam perangkat lunak dan tidak memerlukan keterlibatan perangkat keras. Emulasi memungkinkan untuk menjalankan sistem operasi apa pun yang tidak dimodifikasi yang mendukung lingkungan yang ditiru. Kelemahan dari jenis virtualisasi ini adalah overhead sumber daya sistem tambahan yang mengarah pada penurunan kinerja dibandingkan dengan jenis virtualisasi lainnya.

Persaingan

Contoh dalam kategori ini termasuk VMware Player, VirtualBox, QEMU, Bochs, Parallels, dll.

Paravirtualization

Paravirtualization, juga dikenal sebagai hypervisor Tipe 1, berjalan langsung pada perangkat keras, atau "bare-metal", dan menyediakan layanan virtualisasi langsung ke mesin virtual yang berjalan di atasnya. Ini membantu sistem operasi, perangkat keras virtual, dan perangkat keras nyata untuk berkolaborasi untuk mencapai kinerja yang optimal. Hypervisor ini biasanya memiliki tapak yang agak kecil dan tidak sendiri membutuhkan sumber daya yang luas.

Contoh dalam kategori ini termasuk Xen, KVM, dll.

Paravirtualization

Virtualisasi berbasis wadah

Virtualisasi berbasis kontainer, juga dikenal sebagai virtualisasi tingkat sistem operasi, memungkinkan beberapa eksekusi terisolasi dalam satu kernel sistem operasi. Ini memiliki kinerja dan kepadatan terbaik dan fitur manajemen sumber daya yang dinamis. Lingkungan eksekusi virtual terisolasi yang disediakan oleh jenis virtualisasi ini disebut wadah dan dapat dilihat sebagai sekelompok proses yang dilacak.

Virtualisasi berbasis wadah

Konsep sebuah wadah dimungkinkan oleh fitur namespaces yang ditambahkan ke Linux kernel versi 2.6.24. Kontainer menambahkan ID-nya ke setiap proses dan menambahkan pemeriksaan kontrol akses baru untuk setiap panggilan sistem. Itu diakses oleh klon () system call yang memungkinkan membuat instance terpisah dari namespaces yang sebelumnya global.

Ruang nama dapat digunakan dalam banyak cara berbeda, tetapi pendekatan yang paling umum adalah membuat wadah terisolasi yang tidak memiliki visibilitas atau akses ke objek di luar wadah. Proses yang berjalan di dalam wadah tampaknya berjalan pada sistem Linux normal meskipun mereka berbagi kernel yang mendasarinya dengan proses yang terletak di ruang nama lain, sama untuk jenis objek lainnya. Misalnya, saat menggunakan ruang nama, pengguna root di dalam wadah tidak diperlakukan sebagai root di luar wadah, menambah keamanan tambahan.

Subsistem Linux Control Groups (cgroups), komponen utama berikutnya yang memungkinkan virtualisasi berbasis wadah, digunakan untuk mengelompokkan proses dan mengelola konsumsi sumber daya agregat mereka. Ini biasanya digunakan untuk membatasi konsumsi memori dan CPU dari wadah. Karena sistem Linux kemas hanya memiliki satu kernel dan kernel memiliki visibilitas penuh ke dalam wadah, hanya ada satu tingkat alokasi sumber daya dan penjadwalan.

Beberapa alat manajemen tersedia untuk wadah Linux, termasuk LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, dll.

Wadah vs Mesin Virtual

Tidak seperti mesin virtual, sebuah wadah tidak perlu mem-boot kernel sistem operasi, sehingga wadah dapat dibuat dalam waktu kurang dari satu detik. Fitur ini membuat virtualisasi berbasis wadah unik dan diinginkan daripada pendekatan virtualisasi lainnya.

Karena virtualisasi berbasis-kontainer menambah sedikit atau tidak ada overhead pada mesin host, virtualisasi berbasis-kontainer memiliki kinerja yang hampir sama dengan aslinya

Untuk virtualisasi berbasis wadah, tidak diperlukan perangkat lunak tambahan, tidak seperti virtualisasi lainnya.

Semua kontainer pada mesin host berbagi penjadwal mesin menghemat kebutuhan sumber daya tambahan.

Status kontainer (gambar Docker atau LXC) berukuran kecil dibandingkan dengan gambar mesin virtual, sehingga gambar kontainer mudah didistribusikan.

Manajemen sumber daya dalam wadah dicapai melalui cgroup. Cgroups tidak memungkinkan kontainer mengkonsumsi lebih banyak sumber daya daripada yang dialokasikan untuk mereka. Namun, sampai sekarang, semua sumber daya mesin host terlihat di mesin virtual, tetapi tidak dapat digunakan. Ini dapat diwujudkan dengan menjalankan topatauhtop pada wadah dan mesin host pada saat yang sama. Output di semua lingkungan akan terlihat serupa.

Memperbarui:

Bagaimana Docker menjalankan kontainer di sistem non-Linux?

Jika kontainer dimungkinkan karena fitur yang tersedia di kernel Linux, maka pertanyaan yang jelas adalah bagaimana sistem non-Linux menjalankan kontainer. Docker untuk Mac dan Windows menggunakan VM Linux untuk menjalankan kontainer. Docker Toolbox digunakan untuk menjalankan kontainer di Virtual Box VMs. Tapi, Docker terbaru menggunakan Hyper-V di Windows dan Hypervisor.framework di Mac.

Sekarang, izinkan saya menjelaskan bagaimana Docker untuk Mac menjalankan kontainer secara detail.

Docker untuk Mac menggunakan https://github.com/moby/hyperkit untuk meniru kemampuan hypervisor dan Hyperkit menggunakan hypervisor.framework pada intinya. Hypervisor.framework adalah solusi hypervisor asli Mac. Hyperkit juga menggunakan VPNKit dan DataKit untuk masing-masing jaringan namespace dan sistem file.

VM Linux yang dijalankan Docker di Mac hanya baca. Namun, Anda dapat menabraknya dengan menjalankan:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty.

Sekarang, kita bahkan dapat memeriksa versi Kernel dari VM ini:

# uname -a Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux.

Semua kontainer dijalankan di dalam VM ini.

Ada beberapa batasan untuk hypervisor.framework. Karena itu Docker tidak mengekspos docker0antarmuka jaringan di Mac. Jadi, Anda tidak dapat mengakses kontainer dari tuan rumah. Sampai sekarang, docker0hanya tersedia di dalam VM.

Hyper-v adalah hypervisor asli di Windows. Mereka juga mencoba memanfaatkan kemampuan Windows 10 untuk menjalankan sistem Linux secara asli.

Ashish Bista
sumber
1
Posting yang sangat bagus. Terima kasih banyak! Pertanyaan lain yang saya miliki adalah bahwa saya dapat membuat docker arm7v gambar 32-bit pada mesin Mac x86_64. Namun, saya tidak dapat membuat gambar yang sama di Ubuntu yang diinstal pada mesin x86_64. Apakah ini terkait dengan solusi Mac hypervisor yang Anda sebutkan?
jiashenC
1
Jawaban Anda adalah satu-satunya yang menjawab "Bagaimana Docker menjalankan kontainer dalam sistem non-Linux?" Informasi ini sangat sulit ditemukan di mana saja. Semuanya menekankan bahwa "wadah benar-benar berbeda dari VM!", Lebih cepat, lebih ringan, dll, namun satu-satunya cara untuk menjalankan wadah pada sistem non-linux adalah dengan memutar VM ...!
Bogatyr
@ Bogatyr IINM, itu -satu-VM untuk semua kontainer.
dstromberg
147

Melalui posting ini kita akan menggambar beberapa garis perbedaan antara VM dan LXC. Pertama-tama mari kita mendefinisikannya.

VM :

Mesin virtual mengemulasi lingkungan komputasi fisik, tetapi permintaan untuk CPU, memori, hard disk, jaringan dan sumber daya perangkat keras lainnya dikelola oleh lapisan virtualisasi yang menerjemahkan permintaan ini ke perangkat keras fisik yang mendasarinya.

Dalam konteks ini VM disebut sebagai Tamu sementara lingkungan yang dijalankannya disebut tuan rumah.

LXC s:

Linux Containers (LXC) adalah kemampuan tingkat sistem operasi yang memungkinkan untuk menjalankan beberapa wadah Linux yang terisolasi, pada satu host kontrol (host LXC). Linux Containers berfungsi sebagai alternatif ringan untuk VM karena mereka tidak memerlukan hypervisor yaitu. Virtualbox, KVM, Xen, dll.

Sekarang, kecuali Anda dibius oleh Alan (Zach Galifianakis- dari seri Hangover) dan telah berada di Vegas selama setahun terakhir, Anda akan cukup sadar tentang lonjakan minat yang luar biasa untuk teknologi wadah Linux, dan jika saya akan spesifik satu wadah proyek yang telah membuat gebrakan di seluruh dunia dalam beberapa bulan terakhir adalah - Docker mengarah ke beberapa pendapat yang menggema bahwa lingkungan komputasi awan harus meninggalkan mesin virtual (VM) dan menggantinya dengan wadah karena biaya overhead yang lebih rendah dan berpotensi kinerja yang lebih baik.

Tetapi pertanyaan besarnya adalah, apakah itu layak ?, apakah itu masuk akal?

Sebuah. LXC adalah scoped ke instance dari Linux. Ini mungkin rasa yang berbeda dari Linux (misalnya wadah Ubuntu pada host CentOS tapi tetap Linux.) Demikian pula, wadah berbasis Windows dicakup oleh contoh Windows sekarang jika kita melihat VMs mereka memiliki cakupan yang cukup luas dan menggunakan hypervisor Anda tidak terbatas pada sistem operasi Linux atau Windows.

b. LXC memiliki overhead yang rendah dan memiliki kinerja yang lebih baik dibandingkan dengan VM. Alat yaitu. Docker yang dibangun di atas bahu teknologi LXC telah menyediakan pengembang dengan platform untuk menjalankan aplikasi mereka dan pada saat yang sama telah memberdayakan orang-orang operasi dengan alat yang akan memungkinkan mereka untuk menyebarkan wadah yang sama di server produksi atau pusat data. Ia mencoba membuat pengalaman antara pengembang yang menjalankan aplikasi, mem-boot dan menguji aplikasi dan orang yang mengoperasikan aplikasi yang mulus, karena ini adalah di mana semua gesekan terletak dan tujuan DevOps adalah untuk memecah silo tersebut.

Jadi pendekatan terbaik adalah penyedia infrastruktur cloud harus menganjurkan penggunaan VM dan LXC yang tepat, karena mereka masing-masing cocok untuk menangani beban kerja dan skenario tertentu.

Meninggalkan VM tidak praktis seperti sekarang. Jadi baik VM dan LXC memiliki keberadaan dan kepentingan masing-masing.

Pankaj Arora
sumber
4
Bagian Anda "b" di atas adalah persis apa yang dikatakan orang Docker tentang teknologi. Ini dimaksudkan untuk membuat tugas pengembangan dan penyebaran lebih mudah. Dan berdasarkan pengalaman saya sebagai seorang dev dan sebagai sysop, saya harus setuju.
WineSoaked
3
Itu jawaban yang cukup abstrak. Kami membutuhkan kasus penggunaan saat menggunakan / tidak menggunakan Docker. Itu pertanyaannya. Semua orang dapat menemukan seperti apa Docker itu tetapi hanya sedikit yang bisa menjelaskan tentang skenario nyata.
Ivan Voroshilin
1
buruh pelabuhan sedang dibawa ke dunia windows sekarang, karena tidak lagi bergantung pada LXC: blogs.msdn.com/b/nzdev/archive/2015/06/02/... tolong perbaiki saya jika saya salah paham jawabannya di sini
bubakazouba
6
Saya mengalami kesulitan memahami bagian "(mis. Wadah Ubuntu pada host Centos tetapi masih Linux)" dari wadah tersebut. Cara saya memahaminya, adalah bahwa kontainer membagikan kernel host. Sebagai contoh, jika saya memiliki host VM yang menjalankan kernel Linux 4.6, ada beberapa tamu VM yang menjalankan kernel Linux 2.4, 2.6, 3.2, 4.1 dan 4.4. Jika saya menjalankan perintah khusus untuk kernel itu, saya akan mendapatkan perilaku kernel tamu (dan bukan tuan rumah). Tetapi jika VM tamu saya adalah kontainer sekarang, akankah perintah yang dieksekusi ditentukan oleh kernel host?
Jeach
@bubakazouba ya. Anda benar. Sekarang mereka menggunakan runC
Rumesh Eranga Hapuarachchi
140

Sebagian besar jawaban di sini berbicara tentang mesin virtual. Saya akan memberi Anda satu jawaban liner untuk pertanyaan ini yang telah membantu saya selama beberapa tahun terakhir menggunakan Docker. Ini:

Docker hanyalah cara mewah untuk menjalankan suatu proses, bukan mesin virtual.

Sekarang, izinkan saya menjelaskan sedikit lebih banyak tentang apa artinya itu. Mesin virtual adalah binatang mereka sendiri. Saya merasa ingin menjelaskan apa Docker akan membantu Anda memahami ini lebih daripada menjelaskan apa itu mesin virtual. Terutama karena ada banyak jawaban bagus di sini yang memberi tahu Anda secara tepat apa yang seseorang maksudkan ketika mereka mengatakan "mesin virtual". Begitu...

Wadah Docker hanyalah sebuah proses (dan anak-anaknya) yang dikelompokkan menggunakan cgroup di dalam kernel sistem host dari sisa proses. Anda benar-benar dapat melihat proses kontainer Docker Anda dengan berjalan ps auxdi host. Misalnya, memulai apache2"dalam wadah" baru dimulai apache2sebagai proses khusus pada host. Itu baru saja dikotak-kotakkan dari proses lain pada mesin. Penting untuk dicatat bahwa wadah Anda tidak ada di luar masa proses kemas Anda. Ketika proses Anda mati, wadah Anda mati. Itu karena Docker menggantikan pid 1di dalam wadah Anda dengan aplikasi Anda ( pid 1biasanya sistem init). Poin terakhir tentang pid 1ini sangat penting.

Sejauh filesystem yang digunakan oleh masing-masing proses kontainer, Docker menggunakan UnionFS gambar yang UnionFS, yang Anda unduh saat Anda melakukan dan kemudian . Maka Anda bisa melihat-lihat. Semua direktori yang terlihat seperti hash panjang sebenarnya adalah layer individual. Masing-masing berisi file (docker pull ubuntu . Setiap "gambar" hanyalah serangkaian lapisan dan metadata terkait. Konsep layering sangat penting di sini. Setiap lapisan hanyalah perubahan dari lapisan di bawahnya. Misalnya, ketika Anda menghapus file di Dockerfile Anda saat membangun wadah Docker, Anda sebenarnya hanya membuat layer di atas lapisan terakhir yang mengatakan "file ini telah dihapus". Kebetulan, inilah mengapa Anda dapat menghapus file besar dari sistem file Anda, tetapi gambar masih membutuhkan ruang disk yang sama. File itu masih ada, di lapisan di bawah yang sekarang. Lapisan itu sendiri hanyalah tarbal file. Anda dapat menguji ini dengandocker save --output /tmp/ubuntu.tar ubuntucd /tmp && tar xvf ubuntu.tarlayer.tar ) dan metadata (json) dengan informasi tentang lapisan tertentu. Lapisan-lapisan itu hanya menggambarkan perubahan pada sistem file yang disimpan sebagai lapisan "di atas" keadaan aslinya. Saat membaca data "saat ini", sistem file membaca data seolah-olah hanya melihat lapisan perubahan paling atas. Itu sebabnya file tersebut tampaknya dihapus, meskipun masih ada di lapisan "sebelumnya", karena sistem file hanya melihat lapisan paling atas. Hal ini memungkinkan wadah yang sama sekali berbeda untuk berbagi lapisan sistem file mereka, meskipun beberapa perubahan signifikan mungkin terjadi pada sistem file pada lapisan paling atas di setiap wadah. Ini dapat menghemat banyak ruang disk saat wadah Anda berbagi lapisan gambar dasarnya. Namun,

Jaringan di Docker dicapai dengan menggunakan jembatan ethernet (dipanggil docker0pada host), dan antarmuka virtual untuk setiap kontainer pada host. Ini menciptakan subnet virtual docker0untuk wadah Anda untuk berkomunikasi "antara" satu sama lain. Ada banyak opsi untuk jaringan di sini, termasuk membuat subnet khusus untuk wadah Anda, dan kemampuan untuk "berbagi" tumpukan jaringan host Anda agar wadah Anda dapat mengakses secara langsung.

Docker bergerak sangat cepat. Its dokumentasi adalah beberapa dokumentasi terbaik yang pernah saya lihat. Itu umumnya ditulis dengan baik, ringkas, dan akurat. Saya sarankan Anda memeriksa dokumentasi yang tersedia untuk informasi lebih lanjut, dan percaya pada dokumentasi atas hal lain yang Anda baca online, termasuk Stack Overflow. Jika Anda memiliki pertanyaan spesifik, saya sangat merekomendasikan bergabung dengan #dockerFreenode IRC dan bertanya di sana (Anda bahkan dapat menggunakan webchat Freenode untuk itu!).

L0j1k
sumber
12
"Docker hanyalah cara mewah untuk menjalankan suatu proses, bukan mesin virtual." ini ringkasan yang bagus, terima kasih!
mkorman
Terima kasih! Kredit untuk itu keluar ke programmerq dari #dockersaluran di Freenode IRC.
L0j1k
Ini jauh lebih jelas daripada jawaban lainnya. Saya kira analogi proseslah yang melakukannya untuk saya. Itu hanya menurunkan tingkat abstraksi.
Mate Mrše
Saya akan menambahkan: "Docker hanyalah cara mewah untuk menjalankan suatu proses, dengan cara yang terisolasi, dilindungi, dienkapsulasi, bukan mesin virtual." Sistem host memiliki visibilitas (atas proses dan sumber daya) dari subsistem tetapi sistem yang terisolasi tidak memiliki visibilitas (atas proses dan sumber daya) dalam sistem host.
Sohail Si
87

Docker merangkum aplikasi dengan semua dependensinya.

Virtualizer merangkum sebuah OS yang dapat menjalankan aplikasi apa pun yang biasanya dapat dijalankan pada mesin logam kosong.

Giovanni De Gasperis
sumber
1
Saya belajar tentang LXC, koreksi saya jika saya salah, tetapi bisa jadi semacam virtualenv? tapi jelas lebih luas, tidak hanya terbatas pada python untuk mengatakan
NeoVe
2
Saya suka jawaban ini yang terbaik. Sederhana dan langsung ke titik. Sekarang seseorang memiliki pemahaman dasar tentang APA yang dapat dilakukan LXC dan Virtualizers, detail dari bacaan lain akan masuk akal.
Phil
2
@ Philip Itu terjadi setelah saya membaca jawaban terperinci di atas terlebih dahulu.
johnny
Saya berasumsi mereka ingin tahu bagaimana cara merangkum. Itulah bagian besar yang akan menunjukkan perbedaan di antara mereka tetapi Anda tidak menjawab.
Light.G
60

Keduanya sangat berbeda. Docker ringan dan menggunakan LXC / libcontainer (yang bergantung pada kernel namespacing dan cgroups) dan tidak memiliki emulasi mesin / perangkat keras seperti hypervisor, KVM. Xen yang berat.

Docker dan LXC lebih ditujukan untuk sandboxing, containerisasi, dan isolasi sumber daya. Ini menggunakan API klon OS (saat ini hanya kernel Linux) host yang menyediakan ruang nama untuk IPC, NS (mount), jaringan, PID, UTS, dll.

Bagaimana dengan memori, I / O, CPU, dll? Itu dikontrol menggunakan cgroups di mana Anda dapat membuat grup dengan spesifikasi / pembatasan sumber daya (CPU, memori, dll) dan menempatkan proses Anda di sana. Di atas LXC, Docker menyediakan backend penyimpanan ( http://www.projectatomic.io/docs/filesystems/ ) misalnya, sistem pemasangan mount union di mana Anda dapat menambahkan lapisan dan berbagi lapisan di antara ruang nama pemasangan yang berbeda.

Ini adalah fitur yang kuat di mana gambar dasar biasanya dibaca hanya dan hanya ketika wadah memodifikasi sesuatu di lapisan itu akan menulis sesuatu ke partisi baca-tulis (alias salin saat menulis) Ini juga menyediakan banyak pembungkus lain seperti registri dan versi gambar.

Dengan LXC normal Anda harus datang dengan beberapa rootfs atau berbagi rootfs dan ketika dibagikan, dan perubahannya tercermin pada wadah lain. Karena banyak fitur yang ditambahkan ini, Docker lebih populer daripada LXC. LXC populer di lingkungan tertanam untuk menerapkan keamanan di sekitar proses yang terpapar ke entitas eksternal seperti jaringan dan UI. Docker populer di lingkungan cloud multi-tenancy di mana lingkungan produksi yang konsisten diharapkan.

VM normal (misalnya, VirtualBox dan VMware) menggunakan hypervisor, dan teknologi terkait baik memiliki firmware khusus yang menjadi lapisan pertama untuk OS pertama (OS host, atau OS tamu 0) atau perangkat lunak yang berjalan pada OS host untuk memberikan emulasi perangkat keras seperti CPU, USB / aksesori, memori, jaringan, dll, ke OS tamu. VM masih (hingga 2015) populer di lingkungan multi-tenant dengan keamanan tinggi.

Docker / LXC hampir dapat dijalankan pada perangkat keras apa pun yang murah (memori kurang dari 1 GB juga OK selama Anda memiliki kernel yang lebih baru) vs. VM normal membutuhkan setidaknya 2 GB memori, dll., Untuk melakukan sesuatu yang berarti dengannya . Tetapi dukungan Docker pada OS host tidak tersedia di OS seperti Windows (per November 2014) di mana jenis VM dapat dijalankan di windows, Linux, dan Mac.

Ini foto dari buruh pelabuhan: Ini adalah pic dari rightscale

akibatnya
sumber
34

1. Ringan

Ini mungkin kesan pertama bagi banyak pelajar buruh pelabuhan.

Pertama, gambar buruh pelabuhan biasanya lebih kecil dari gambar VM, membuatnya mudah untuk dibuat, disalin, dibagikan.

Kedua, kontainer Docker dapat dimulai dalam beberapa milidetik, sedangkan VM mulai dalam hitungan detik.

2. Sistem File Berlapis

Ini adalah fitur kunci lain dari Docker. Gambar memiliki lapisan, dan berbagai gambar dapat berbagi lapisan, menjadikannya lebih hemat-ruang dan lebih cepat untuk dibuat.

Jika semua wadah menggunakan Ubuntu sebagai gambar dasarnya, tidak setiap gambar memiliki sistem file sendiri, tetapi berbagi file ubuntu bergaris bawah yang sama, dan hanya berbeda dalam data aplikasi mereka sendiri.

3. Kernel OS yang Dibagikan

Pikirkan wadah sebagai proses!

Semua kontainer yang berjalan di host memang sekelompok proses dengan sistem file yang berbeda. Mereka berbagi kernel OS yang sama, hanya merangkum perpustakaan sistem dan dependensi.

Ini bagus untuk sebagian besar kasus (tidak ada kernel OS tambahan yang dipertahankan) tetapi bisa menjadi masalah jika diperlukan isolasi yang ketat antar wadah.

Mengapa itu penting?

Semua ini tampak seperti perbaikan, bukan revolusi. Nah, kuantitatif akumulasi mengarah ke kualitatif transformasi .

Pikirkan tentang penyebaran aplikasi. Jika kami ingin menggunakan perangkat lunak (layanan) baru atau memutakhirkannya, lebih baik mengubah file dan proses konfigurasi daripada membuat VM baru. Karena Membuat VM dengan layanan yang diperbarui, mengujinya (berbagi antara Dev & QA), menggunakan untuk produksi membutuhkan waktu berjam-jam, bahkan berhari-hari. Jika ada yang salah, Anda harus mulai lagi, membuang lebih banyak waktu. Jadi, gunakan alat manajemen konfigurasi (boneka, saltstack, chef, dll.) Untuk menginstal perangkat lunak baru, lebih baik unduh file baru.

Ketika datang ke buruh pelabuhan, tidak mungkin untuk menggunakan wadah buruh pelabuhan yang baru dibuat untuk menggantikan yang lama. Maintainance jauh lebih mudah! Membangun gambar baru, membaginya dengan QA, mengujinya, menggunakannya hanya membutuhkan beberapa menit (jika semuanya otomatis), berjam-jam dalam kasus terburuk. Ini disebut infrastruktur tetap : jangan memelihara (meningkatkan) perangkat lunak, buat yang baru.

Ini mengubah cara layanan disampaikan. Kami ingin aplikasi, tetapi harus mempertahankan VM (yang menyulitkan dan tidak ada hubungannya dengan aplikasi kami). Docker membuat Anda fokus pada aplikasi dan menghaluskan segalanya.

cizixs
sumber
27

Docker, pada dasarnya wadah, mendukung virtualisasi OS yaitu aplikasi Anda merasa memiliki instance lengkap dari OS sedangkan VM mendukung virtualisasi perangkat keras . Anda merasa seperti itu adalah mesin fisik di mana Anda dapat mem-boot OS apa pun.

Di Docker, wadah yang menjalankan berbagi kernel OS host, sedangkan di VM mereka memiliki file OS mereka sendiri. Lingkungan (OS) tempat Anda mengembangkan aplikasi akan sama ketika Anda menyebarkannya ke berbagai lingkungan penyajian, seperti "pengujian" atau "produksi".

Misalnya, jika Anda mengembangkan server web yang berjalan pada port 4000, ketika Anda menyebarkannya ke lingkungan "pengujian" Anda, port tersebut sudah digunakan oleh beberapa program lain, sehingga berhenti bekerja. Dalam wadah ada lapisan; semua perubahan yang Anda buat pada OS akan disimpan dalam satu atau lebih lapisan dan lapisan-lapisan itu akan menjadi bagian dari gambar, jadi ke mana pun gambar bergerak, dependensi juga akan hadir.

Pada contoh di bawah ini, mesin host memiliki tiga VM. Untuk menyediakan aplikasi dalam isolasi lengkap VMs, mereka masing-masing memiliki salinan sendiri file OS, perpustakaan dan kode aplikasi, bersama dengan instance penuh dalam memori dari OS.Tanpa Wadah Sedangkan gambar di bawah ini menunjukkan skenario yang sama dengan wadah. Di sini, wadah hanya berbagi sistem operasi host, termasuk kernel dan pustaka, sehingga mereka tidak perlu mem-boot OS, memuat pustaka atau membayar biaya memori pribadi untuk file-file tersebut. Satu-satunya ruang tambahan yang mereka ambil adalah setiap memori dan ruang disk yang diperlukan untuk menjalankan aplikasi dalam wadah. Sementara lingkungan aplikasi terasa seperti OS khusus, aplikasi menyebarkan seperti itu akan menjadi tuan rumah khusus. Aplikasi kemas dimulai dalam hitungan detik dan lebih banyak contoh aplikasi dapat masuk ke mesin daripada dalam kasus VM. masukkan deskripsi gambar di sini

Sumber: https://azure.microsoft.com/en-us/blog/containers-docker-windows-and-trends/

Ali Kahoot
sumber
Saya sangat menyukai paragraf pertama.
Light.G
23

Ada tiga pengaturan berbeda yang menyediakan tumpukan untuk menjalankan aplikasi (Ini akan membantu kita mengenali apa itu wadah dan apa yang membuatnya jauh lebih kuat daripada solusi lain):

1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers

1) Tumpukan server tradisional terdiri dari server fisik yang menjalankan sistem operasi dan aplikasi Anda.

Keuntungan:

  • Pemanfaatan sumber daya mentah

  • Isolasi

Kekurangan:

  • Waktu penyebaran sangat lambat
  • Mahal
  • Sumber daya terbuang
  • Sulit untuk skala
  • Sulit untuk bermigrasi
  • Konfigurasi yang kompleks

2) VM stack terdiri dari server fisik yang menjalankan sistem operasi dan hypervisor yang mengelola mesin virtual Anda, sumber daya bersama, dan antarmuka jaringan. Setiap Vm menjalankan Sistem Operasi Tamu, aplikasi atau serangkaian aplikasi.

Keuntungan:

  • Penggunaan sumber daya yang baik
  • Mudah diukur
  • Mudah dicadangkan dan dimigrasi
  • Penghematan biaya
  • Fleksibilitas

Kekurangan:

  • Alokasi sumber daya bermasalah
  • Vendor lockin
  • Konfigurasi yang kompleks

3) Pengaturan Kontainer , perbedaan utama dengan stack lainnya adalah virtualisasi berbasis wadah menggunakan kernel OS host untuk rum beberapa instance tamu yang terisolasi. Mesin virtual tamu ini disebut sebagai wadah. Tuan rumah dapat berupa server fisik atau VM.

Keuntungan:

  • Isolasi
  • Ringan
  • Sumberdaya efektif
  • Mudah dimigrasi
  • Keamanan
  • Overhead rendah
  • Produksi cermin dan lingkungan pengembangan

Kekurangan:

  • Arsitektur yang Sama
  • Aplikasi sumber daya berat
  • Masalah jaringan dan keamanan.

Dengan membandingkan pengaturan wadah dengan pendahulunya, kita dapat menyimpulkan bahwa kontainerisasi adalah pengaturan tercepat, paling efektif sumber daya, dan paling aman yang kita ketahui sampai saat ini. Wadah adalah contoh terisolasi yang menjalankan aplikasi Anda. Docker memutar wadah dengan cara, lapisan menjalankan memori waktu dengan driver penyimpanan default (driver overlay) yang berjalan dalam hitungan detik dan lapisan copy-on-write dibuat di atasnya setelah kita masukkan ke dalam wadah, yang mendukung pelaksanaan wadah.Dalam kasus VM yang akan memakan waktu sekitar satu menit untuk memuat semuanya ke lingkungan virtual. Mesin virtual ringan ini dapat diganti, dibangun kembali, dan dipindah-pindahkan dengan mudah. Ini memungkinkan kita untuk mencerminkan lingkungan produksi dan pengembangan dan sangat membantu dalam proses CI / CD. Keuntungan yang dapat diberikan kontainer sangat menarik sehingga mereka pasti ada di sini untuk menginap.

mohan08p
sumber
Tolong beri tahu mengapa ini harus menjadi "pengaturan paling aman" dibandingkan dengan VM.
MKesper
@MKesper: Ketika Anda bermigrasi dari lingkungan lawas ke lingkungan wadah, Anda memiliki berbagai cara untuk membangun paradigma keamanan, yang didasarkan pada pendekatan proaktif daripada reaktif untuk mencegah intrusi. Hal ini memungkinkan Anda untuk mengamankan aplikasi dan runtime di tingkat yang lebih granular dan bernuansa. Mereka juga memberdayakan untuk mengidentifikasi dan menyelesaikan potensi ancaman keamanan sebelum mengganggu alur kerja Anda. Dan, adalah mungkin untuk menggabungkan analisis statis dengan ML untuk mengotomatiskan pertahanan runtime dan menegakkan kebijakan di seluruh lingkungan Anda. Oleh karena itu, garis "pengaturan paling aman".
mohan08p
18

Berhubungan dengan:-

"Mengapa menyebarkan perangkat lunak ke gambar buruh pelabuhan lebih mudah daripada hanya menyebarkan ke lingkungan produksi yang konsisten?"

Sebagian besar perangkat lunak digunakan untuk berbagai lingkungan, biasanya minimal tiga dari yang berikut:

  1. PC pengembang individu
  2. Lingkungan pengembang bersama
  3. PC penguji individual
  4. Lingkungan pengujian bersama
  5. Lingkungan QA
  6. Lingkungan UAT
  7. Pengujian beban / kinerja
  8. Pementasan langsung
  9. Produksi
  10. Arsipkan

Ada juga faktor-faktor berikut yang perlu dipertimbangkan:

  • Pengembang, dan memang penguji, semuanya akan memiliki konfigurasi PC yang sangat berbeda atau sangat berbeda, sesuai dengan sifat pekerjaannya.
  • Pengembang sering dapat mengembangkan pada PC di luar kendali aturan standardisasi perusahaan atau bisnis (mis. Freelancer yang mengembangkan pada mesin mereka sendiri (sering jarak jauh) atau kontributor untuk proyek sumber terbuka yang tidak 'dipekerjakan' atau 'dikontrak' untuk mengkonfigurasi PC mereka dengan cara tertentu. cara)
  • Beberapa lingkungan akan terdiri dari sejumlah mesin tetap dalam konfigurasi beban seimbang
  • Banyak lingkungan produksi akan memiliki server berbasis cloud secara dinamis (atau 'elastis') dibuat dan dihancurkan tergantung pada tingkat lalu lintas

Seperti yang Anda lihat, jumlah total server yang diekstrapolasi jarang dalam angka tunggal, sangat sering dalam angka tripel dan masih dapat secara signifikan lebih tinggi lagi.

Ini semua berarti bahwa menciptakan lingkungan yang konsisten di tempat pertama cukup sulit hanya karena volume semata (bahkan dalam skenario lapangan hijau), tetapi menjaga mereka tetap konsisten adalah hal yang mustahil mengingat banyaknya server, penambahan server baru (secara dinamis atau secara manual), pembaruan otomatis dari vendor / vendor, vendor anti-virus, vendor browser dan sejenisnya, instalasi perangkat lunak manual atau perubahan konfigurasi yang dilakukan oleh pengembang atau teknisi server, dll. Saya ulangi - itu sebenarnya (tidak ada maksud kata-kata) tidak mungkin untuk menjaga lingkungan tetap konsisten (oke, bagi purist, itu bisa dilakukan, tetapi itu melibatkan sejumlah besar waktu, usaha, dan disiplin, itulah sebabnya mengapa VM dan wadah (misalnya Docker) dirancang sejak awal).

Jadi pikirkan pertanyaan Anda lebih seperti ini "Mengingat kesulitan ekstrim menjaga semua lingkungan konsisten, apakah lebih mudah untuk menggunakan perangkat lunak ke gambar buruh pelabuhan, bahkan ketika memperhitungkan kurva pembelajaran?" . Saya pikir Anda akan menemukan jawabannya selalu "ya" - tetapi hanya ada satu cara untuk mengetahuinya, posting pertanyaan baru ini pada Stack Overflow.

Greg Trevellick
sumber
Jadi, jika saya menggunakan gambar buruh pelabuhan saya dengan 15 kotak berbeda yang memiliki semua kombinasi OS / versi yang berbeda, semua gambar buruh pelabuhan saya akan berjalan sama?
Teoman shipahi
@Teomanshipahi Jika semua kontainer ini bisa menggunakan kernel yang sama yang disediakan oleh host, ya, mereka semua akan berjalan dengan sukses.
Light.G
Jika saya menggunakan buruh pelabuhan untuk windows di lokal saya, dapatkah saya menggunakan dan menjalankan cara yang sama di linux / mac?
Teoman shipahi
Hal-hal yang tampaknya selalu disingkirkan adalah masih ada dependensi versi: 1) Pengembang harus mengembangkan lingkungan yang sama dengan yang terdapat pada gambar; 2) Lingkungan dev dan lingkungan pengujian harus menjalankan versi yang sama (atau kompatibel) dari kernel linux dan buruh pelabuhan itu sendiri ... ya?
Bogatyr
18

Ada banyak jawaban yang menjelaskan lebih rinci perbedaannya, tetapi inilah penjelasan singkat saya.

Satu perbedaan penting adalah bahwa VM menggunakan kernel terpisah untuk menjalankan OS . Itulah alasannya berat dan membutuhkan waktu untuk boot, menghabiskan lebih banyak sumber daya sistem.

Di Docker, kontainer berbagi kernel dengan host; karenanya ringan dan dapat memulai dan berhenti dengan cepat.

Dalam Virtualisasi, sumber daya dialokasikan pada awal pengaturan dan karenanya sumber daya tidak sepenuhnya digunakan ketika mesin virtual menganggur selama banyak waktu. Dalam Docker, wadah tidak dialokasikan dengan jumlah sumber daya perangkat keras yang tetap dan bebas untuk menggunakan sumber daya tergantung pada persyaratan dan karenanya sangat skalabel.

Docker menggunakan sistem File UNION .. Docker menggunakan teknologi copy-on-write untuk mengurangi ruang memori yang dikonsumsi oleh kontainer. Baca lebih lanjut di sini

Jayabalan Bala
sumber
1
"Dalam Virtualisasi, sumber daya dialokasikan pada awal pengaturan dan karenanya sumber daya tidak sepenuhnya digunakan ketika mesin virtual menganggur selama banyak waktu" Hyper-V memiliki gagasan tentang Memori Dinamis di mana Anda dapat menentukan Minimum, Maksimum dan RAM Startup.
Mariusz
15

Dengan mesin virtual , kami memiliki server, kami memiliki sistem operasi host di server itu, dan kemudian kami memiliki hypervisor. Dan kemudian berjalan di atas hypervisor itu, kami memiliki sejumlah sistem operasi tamu dengan aplikasi dan binari yang bergantung padanya, dan perpustakaan di server itu. Ini membawa sistem operasi seluruh tamu dengan itu. Ini kelas berat. Juga ada batasan berapa banyak Anda benar-benar dapat memakai setiap mesin fisik.

Masukkan deskripsi gambar di sini

Kontainer Docker di sisi lain, sedikit berbeda. Kami memiliki server. Kami memiliki sistem operasi host. Tapi alih-alih hypervisor , kami memiliki mesin Docker , dalam hal ini. Dalam hal ini, kami tidak membawa seluruh sistem operasi tamu. Kami membawa lapisan yang sangat tipis dari sistem operasi , dan wadah dapat berbicara ke OS host untuk mendapatkan fungsionalitas kernel di sana. Dan itu memungkinkan kita untuk memiliki wadah yang sangat ringan.

Semua yang ada di sana adalah kode aplikasi dan semua binari dan perpustakaan yang diperlukannya. Dan binari dan pustaka tersebut sebenarnya dapat dibagikan di berbagai wadah jika Anda menginginkannya juga. Dan hal ini memungkinkan kita untuk melakukan, adalah sejumlah hal. Mereka memiliki waktu startup yang jauh lebih cepat . Anda tidak dapat berdiri VM tunggal dalam beberapa detik seperti itu. Dan sama-sama, menurunkannya dengan cepat .. sehingga kita dapat naik turun dengan sangat cepat dan kita akan melihatnya nanti.

Masukkan deskripsi gambar di sini

Setiap kontainer berpikir bahwa itu berjalan pada salinan sistem operasinya sendiri. Itu punya sistem file sendiri, registry sendiri, dll yang merupakan semacam kebohongan. Ini sebenarnya sedang divirtualisasi.

Nedzad G
sumber
11

Perbedaan antara bagaimana aplikasi di VM menggunakan cpu vs container

Sumber: Kubernetes in Action.

Kode lezat
sumber
11

Saya telah menggunakan Docker di lingkungan produksi dan pementasan sangat banyak. Ketika Anda terbiasa, Anda akan menemukannya sangat kuat untuk membangun wadah multi dan lingkungan yang terisolasi.

Docker telah dikembangkan berdasarkan LXC (Linux Container) dan berfungsi dengan baik di banyak distribusi Linux, terutama Ubuntu.

Wadah buruh pelabuhan adalah lingkungan yang terisolasi. Anda bisa melihatnya ketika Anda mengeluarkan topperintah dalam wadah Docker yang telah dibuat dari gambar Docker.

Selain itu, mereka sangat ringan dan fleksibel berkat konfigurasi dockerFile.

Sebagai contoh, Anda dapat membuat gambar Docker dan mengkonfigurasi DockerFile dan memberi tahu bahwa misalnya ketika sedang berjalan lalu wget 'this', apt-get 'that', jalankan 'some shell script', seting variabel lingkungan dan sebagainya.

Dalam proyek layanan mikro dan arsitektur Docker adalah aset yang sangat layak. Anda dapat mencapai skalabilitas, ketahanan, dan elastisitas dengan Docker, Docker swarm, Kubernetes, dan Docker Compose.

Masalah penting lainnya tentang Docker adalah Docker Hub dan komunitasnya. Sebagai contoh, saya menerapkan ekosistem untuk memantau kafka menggunakan Prometheus, Grafana, Prometheus-JMX-Eksportir, dan Docker.

Untuk melakukan itu, saya mengunduh wadah Docker yang dikonfigurasi untuk zookeeper, kafka, Prometheus, Grafana dan jmx-collector kemudian memasang konfigurasi saya sendiri untuk beberapa dari mereka menggunakan file YAML, atau untuk yang lain, saya mengubah beberapa file dan konfigurasi dalam wadah Docker dan saya membangun seluruh sistem untuk memantau kafka menggunakan Dockers multi-kontainer pada satu mesin dengan isolasi dan skalabilitas dan ketahanan yang arsitektur ini dapat dengan mudah dipindahkan ke beberapa server.

Selain situs Docker Hub ada situs lain bernama quay.io yang dapat Anda gunakan untuk memiliki dashboard gambar Docker Anda sendiri di sana dan menarik / mendorong ke / dari sana. Anda bahkan dapat mengimpor gambar Docker dari Docker Hub ke dermaga lalu menjalankannya dari dermaga di mesin Anda sendiri.

Catatan: Mempelajari Docker di tempat pertama tampaknya rumit dan sulit, tetapi ketika Anda terbiasa maka Anda tidak dapat bekerja tanpanya.

Saya ingat hari-hari pertama bekerja dengan Docker ketika saya mengeluarkan perintah yang salah atau menghapus kontainer saya dan semua data dan konfigurasi salah.

Touraj Ebrahimi
sumber
6

Beginilah cara Docker memperkenalkan dirinya:

Docker adalah perusahaan yang menggerakkan pergerakan kontainer dan satu-satunya penyedia platform kontainer untuk menangani setiap aplikasi di cloud hybrid. Bisnis saat ini berada di bawah tekanan untuk mentransformasi secara digital tetapi dibatasi oleh aplikasi dan infrastruktur yang ada sambil merasionalisasi portofolio awan, pusat data, dan arsitektur aplikasi yang semakin beragam. Docker memungkinkan kemandirian sejati antara aplikasi dan infrastruktur dan pengembang dan operasi TI untuk membuka potensi mereka dan menciptakan model kolaborasi dan inovasi yang lebih baik.

Jadi Docker adalah berbasis wadah, artinya Anda memiliki gambar dan wadah yang dapat dijalankan pada mesin Anda saat ini. Ini tidak termasuk sistem operasi seperti VM , tetapi seperti paket paket kerja yang berbeda seperti Java, Tomcat, dll.

Jika Anda memahami wadah, Anda mendapatkan apa itu Docker dan apa bedanya dengan VM ...

Jadi, apa itu wadah?

Gambar kontainer adalah paket perangkat lunak yang ringan, berdiri sendiri, dapat dieksekusi yang mencakup semua yang diperlukan untuk menjalankannya: kode, runtime, alat sistem, pustaka sistem, pengaturan. Tersedia untuk aplikasi berbasis Linux dan Windows, perangkat lunak kemas akan selalu berjalan sama, apa pun lingkungannya. Wadah mengisolasi perangkat lunak dari lingkungannya, misalnya perbedaan antara pengembangan dan lingkungan pementasan dan membantu mengurangi konflik antara tim yang menjalankan perangkat lunak berbeda pada infrastruktur yang sama.

Buruh pelabuhan

Jadi seperti yang Anda lihat pada gambar di bawah ini, setiap wadah memiliki paket terpisah dan berjalan pada satu mesin berbagi sistem operasi mesin ... Mereka aman dan mudah untuk dikirim ...

Alireza
sumber
4

Ada banyak jawaban teknis yang bagus di sini yang secara jelas membahas perbedaan antara VM dan wadah serta asal-usul Docker.

Bagi saya perbedaan mendasar antara VM dan Docker adalah bagaimana Anda mengelola promosi aplikasi Anda.

Dengan VM, Anda mempromosikan aplikasi dan ketergantungannya dari satu VM ke DEV berikutnya ke UAT ke PRD.

  1. Seringkali VM ini memiliki patch dan pustaka yang berbeda.
  2. Tidak jarang beberapa aplikasi berbagi VM. Ini memerlukan pengelolaan konfigurasi dan dependensi untuk semua aplikasi.
  3. Backout membutuhkan pembatalan perubahan di VM. Atau mengembalikannya jika memungkinkan.

Dengan Docker idenya adalah bahwa Anda menggabungkan aplikasi Anda di dalam wadahnya sendiri bersama dengan perpustakaan yang dibutuhkannya dan kemudian mempromosikan keseluruhan wadah sebagai satu kesatuan.

  1. Kecuali untuk kernel, tambalan dan pustaka identik.
  2. Sebagai aturan umum, hanya ada satu aplikasi per kontainer yang menyederhanakan konfigurasi.
  3. Backout terdiri dari menghentikan dan menghapus wadah.

Jadi pada level paling mendasar dengan VM Anda mempromosikan aplikasi dan dependensinya sebagai komponen diskrit sedangkan dengan Docker Anda mempromosikan semuanya dalam satu pukulan.

Dan ya ada masalah dengan kontainer termasuk mengelola mereka meskipun alat seperti Kubernetes atau Docker Swarm sangat menyederhanakan tugas.

TJA
sumber