Pengenalan Mesra Pemula kepada Kontena, VM dan Docker

Sekiranya anda seorang pengaturcara atau teknisi, kemungkinan anda paling tidak pernah mendengar tentang Docker: alat yang berguna untuk mengemas, menghantar, dan menjalankan aplikasi dalam "kontena." Tidak sukar, dengan perhatian yang diperolehnya hari ini - dari pemaju dan pentadbir sistem. Malah anjing besar seperti Google, VMware dan Amazon sedang membina perkhidmatan untuk menyokongnya.

Tidak kira sama ada anda mempunyai kes penggunaan segera untuk Docker, saya masih menganggap penting untuk memahami beberapa konsep asas mengenai "wadah" itu dan bagaimana ia dibandingkan dengan Mesin Maya (VM). Walaupun Internet penuh dengan panduan penggunaan yang sangat baik untuk Docker, saya tidak dapat mencari banyak panduan konseptual yang mesra pemula, terutamanya mengenai apa isi wadah itu dibuat. Oleh itu, semoga siaran ini dapat menyelesaikan masalah itu :)

Mari mulakan dengan memahami apa sebenarnya VM dan bekas.

Apa itu "kontena" dan "VM"?

Kontena dan VM serupa dalam tujuannya: untuk mengasingkan aplikasi dan kebergantungannya ke dalam unit mandiri yang dapat berjalan di mana saja.

Lebih-lebih lagi, kontena dan VM menghilangkan keperluan untuk perkakasan fizikal, yang memungkinkan penggunaan sumber pengkomputeran yang lebih cekap, baik dari segi penggunaan tenaga dan keberkesanan kos.

Perbezaan utama antara kontena dan VM adalah dalam pendekatan seni bina mereka. Mari kita perhatikan lebih dekat.

Mesin Maya

VM pada dasarnya adalah peniruan komputer sebenar yang melaksanakan program seperti komputer sebenar. VM dijalankan di atas mesin fizikal menggunakan "hypervisor" . Seorang penyelia, pada gilirannya, menggunakan mesin hos atau "bare-metal" .

Mari membongkar jargonnya:

A hypervisor adalah suatu perisian, perisian tegar, atau perkakasan yang VMS berjalan di atas. Pengawas sendiri menggunakan komputer fizikal, disebut sebagai "mesin host" . Mesin induk menyediakan VM dengan sumber, termasuk RAM dan CPU. Sumber-sumber ini dibahagikan antara VM dan boleh diedarkan mengikut kesesuaian anda. Oleh itu, jika satu VM menjalankan aplikasi yang lebih banyak sumbernya, anda mungkin memperuntukkan lebih banyak sumber untuk yang lain daripada VM lain yang berjalan pada mesin host yang sama.

VM yang berjalan pada mesin host (sekali lagi, menggunakan hypervisor) juga sering disebut "mesin tamu". Mesin tamu ini mengandungi kedua-dua aplikasi dan apa sahaja yang diperlukan untuk menjalankan aplikasi tersebut (contohnya binari sistem dan perpustakaan). Ia juga membawa seluruh susunan perkakasan maya sendiri, termasuk penyesuai rangkaian maya, penyimpanan, dan CPU - yang bermaksud ia juga mempunyai sistem operasi tetamu sendiri yang lengkap. Dari dalam, mesin tamu berperanan sebagai unitnya sendiri dengan sumber daya yang tersendiri. Dari luar, kita tahu bahawa ia adalah sumber perkongsian VM yang disediakan oleh mesin hos.

Seperti yang disebutkan di atas, mesin tamu boleh berjalan di hypervisor yang dihoskan atau hypervisor bare-metal . Terdapat beberapa perbezaan penting antara mereka.

Pertama, hypervisor virtualisasi yang dihoskan dijalankan pada sistem operasi mesin hos. Sebagai contoh, komputer yang menjalankan OSX boleh mempunyai VM (misalnya VirtualBox atau VMware Workstation 8) yang terpasang di atas OS tersebut. VM tidak mempunyai akses langsung ke perkakasan, jadi ia harus melalui sistem operasi host (dalam kes kami, OSX Mac).

Kelebihan hypervisor yang dihoskan ialah perkakasan yang mendasari kurang penting. Sistem operasi hos bertanggungjawab untuk pemacu perkakasan dan bukannya pengawas itu sendiri, dan oleh itu dianggap mempunyai lebih banyak "keserasian perkakasan." Sebaliknya, lapisan tambahan ini di antara perkakasan dan pengawas menghasilkan lebih banyak sumber overhead, yang menurunkan prestasi VM.

Persekitaran hypervisor bare metal menangani masalah prestasi dengan memasang dan menjalankan dari perkakasan mesin host. Kerana ia berinteraksi secara langsung dengan perkakasan yang mendasari, ia tidak memerlukan sistem operasi host untuk dijalankan. Dalam kes ini, perkara pertama yang dipasang pada pelayan mesin hos sebagai sistem operasi akan menjadi penyelia. Tidak seperti hypervisor yang dihoskan, hypervisor bare-metal mempunyai pemacu peranti sendiri dan berinteraksi dengan setiap komponen secara langsung untuk sebarang I / O, pemprosesan, atau tugas khusus OS. Ini menghasilkan prestasi, skalabilitas, dan kestabilan yang lebih baik. Pertukaran di sini ialah keserasian perkakasan terhad kerana penyelia hanya boleh mempunyai begitu banyak pemacu peranti yang terdapat di dalamnya.

Selepas semua perbincangan mengenai hypervisors, anda mungkin tertanya-tanya mengapa kita memerlukan lapisan “hypervisor” tambahan ini di antara VM dan mesin host sama sekali.

Oleh kerana VM mempunyai sistem operasi maya sendiri, hypervisor memainkan peranan penting dalam menyediakan platform kepada VM untuk mengurus dan melaksanakan sistem operasi tetamu ini. Ini membolehkan komputer hos berkongsi sumber mereka di antara mesin maya yang berfungsi sebagai tetamu di atasnya.

Seperti yang anda lihat dalam rajah, VM mengemas perkakasan maya, kernel (iaitu OS) dan ruang pengguna untuk setiap VM baru.

Bekas

Tidak seperti VM yang menyediakan virtualisasi perkakasan, wadah menyediakan virtualisasi peringkat sistem operasi dengan mengaburkan "ruang pengguna". Anda akan melihat maksud saya semasa membongkar bekas bekas .

Untuk semua maksud dan tujuan, kontena kelihatan seperti VM. Sebagai contoh, mereka memiliki ruang pribadi untuk diproses, dapat menjalankan perintah sebagai root, memiliki antara muka rangkaian peribadi dan alamat IP, membenarkan laluan tersuai dan peraturan yang dapat dilampirkan, dapat memasang sistem fail, dan lain-lain.

Satu perbezaan besar antara kontena dan VM adalah bahawa kontainer * berkongsi * kernel sistem host dengan bekas lain.

Gambar rajah ini menunjukkan kepada anda bahawa bekas hanya memuat ruang pengguna, dan bukan kernel atau perkakasan maya seperti yang dilakukan oleh VM. Setiap kontena mendapat ruang pengguna tersendiri untuk membolehkan beberapa kontena berjalan pada mesin hos tunggal. Kita dapat melihat bahawa semua seni bina tahap sistem operasi dikongsi di seluruh kontena. Bahagian yang hanya dibuat dari awal ialah tong sampah dan lib. Inilah yang menjadikan bekas menjadi ringan.

Di mana Docker masuk?

Docker adalah projek sumber terbuka berdasarkan wadah Linux. Ia menggunakan ciri Linux Kernel seperti ruang nama dan kumpulan kawalan untuk membuat kontena di atas sistem operasi.

Bekas jauh dari yang baru; Google telah menggunakan teknologi kontena mereka sendiri selama bertahun-tahun. Teknologi kontena Linux yang lain termasuk Zon Solaris, penjara BSD, dan LXC, yang telah wujud selama bertahun-tahun.

Jadi mengapa Docker tiba-tiba mendapat wap?

1. Kemudahan penggunaan: Docker menjadikannya lebih mudah bagi sesiapa sahaja - pembangun, pentadbir sistem, arkitek dan lain-lain - untuk memanfaatkan kontena untuk membina dan menguji aplikasi mudah alih dengan cepat. Ini membolehkan sesiapa sahaja mengemas aplikasi pada komputer riba mereka, yang pada gilirannya dapat berjalan tanpa pengubahsuaian pada awan awam, awan peribadi, atau bahkan logam kosong. Mantra adalah: "bina sekali, jalankan ke mana sahaja."

2. Kelajuan: Bekas Docker sangat ringan dan cepat. Oleh kerana kontena hanyalah lingkungan kotak pasir yang berjalan di kernel, sumber tersebut mengambil lebih sedikit sumber. Anda boleh membuat dan menjalankan wadah Docker dalam beberapa saat, berbanding dengan VM yang mungkin memakan masa lebih lama kerana mereka harus menjalankan sistem operasi maya penuh setiap masa.

3. Docker Hub: Pengguna Docker juga mendapat manfaat dari ekosistem Docker Hub yang semakin kaya, yang boleh anda fikirkan sebagai "app store untuk gambar Docker." Docker Hub mempunyai puluhan ribu gambar awam yang dibuat oleh komuniti yang sedia untuk digunakan. Sangat mudah untuk mencari gambar yang memenuhi keperluan anda, siap untuk diturunkan dan digunakan dengan sedikit pengubahsuaian.

4. Modulariti dan Skalabilitas: Docker memudahkan untuk memecahkan fungsi aplikasi anda ke dalam wadah individu. Sebagai contoh, anda mungkin menjalankan pangkalan data Postgres anda dalam satu bekas dan pelayan Redis anda yang lain semasa aplikasi Node.js anda berada di dalam yang lain. Dengan Docker, menjadi lebih mudah untuk menghubungkan bekas ini bersama-sama untuk membuat aplikasi anda, menjadikannya skala atau kemas kini komponen secara bebas di masa hadapan.

Akhir sekali, siapa yang tidak menyukai ikan paus Docker? ;)

Konsep Docker Asas

Setelah mendapat gambaran besar, mari kita bahagi bahagian-bahagian asas Docker demi bahagian:

Enjin Docker

Enjin Docker adalah lapisan di mana Docker berjalan. Masa berjalan dan perkakas ringan yang menguruskan bekas, gambar, binaan dan banyak lagi. Ia berjalan secara asli pada sistem Linux dan terdiri dari:

1. Docker Daemon yang berjalan di komputer hos.

2. Pelanggan Docker yang kemudian berkomunikasi dengan Docker Daemon untuk melaksanakan perintah.

3. API REST untuk berinteraksi dengan Docker Daemon dari jauh.

Pelanggan Docker

Pelanggan Docker adalah apa yang anda, sebagai pengguna akhir Docker, berkomunikasi dengan. Fikirkannya sebagai UI untuk Docker. Contohnya, apabila anda ...

anda berkomunikasi dengan Docker Client, yang kemudian menyampaikan arahan anda kepada Docker Daemon.

Docker Daemon

Docker daemon adalah apa yang sebenarnya melaksanakan perintah yang dikirimkan ke Docker Client - seperti membangun, menjalankan, dan mengedarkan bekas anda. Docker Daemon menggunakan mesin hos, tetapi sebagai pengguna, anda tidak pernah berkomunikasi secara langsung dengan Daemon. Pelanggan Docker boleh berjalan di mesin host juga, tetapi tidak diperlukan. Ia boleh berjalan pada mesin yang berbeza dan berkomunikasi dengan Docker Daemon yang berjalan di mesin hos.

Dockerfile

Dockerfile adalah tempat anda menulis arahan untuk membina imej Docker. Arahan ini boleh:

  • Jalankan apt-get y install some-package : untuk memasang pakej perisian
  • EXPOSE 8000: untuk mendedahkan port
  • ENV ANT_HOME / usr / local / apache-ant untuk meneruskan pemboleh ubah persekitaran

dan sebagainya. Setelah anda menyiapkan Dockerfile, anda boleh menggunakan perintah build docker untuk membina gambar daripadanya. Berikut adalah contoh Dockerfile:

Imej Docker

Imej adalah templat hanya baca yang anda buat dari sekumpulan arahan yang ditulis dalam Dockerfile anda. Imej menentukan apa yang anda mahukan agar aplikasi yang dibungkus dan kebergantungannya kelihatan seperti * dan * proses apa yang akan dijalankan semasa dilancarkan.

Imej Docker dibina menggunakan Dockerfile. Setiap arahan di Dockerfile menambahkan "lapisan" baru pada gambar, dengan lapisan mewakili sebahagian dari sistem fail gambar yang menambah atau menggantikan lapisan di bawahnya. Lapisan adalah kunci struktur Docker yang ringan namun kuat Docker menggunakan Union File System untuk mencapainya:

Sistem Fail Union

Docker menggunakan Union File Systems untuk membina imej. Anda boleh menganggap Sistem Fail Union sebagai sistem fail yang boleh ditumpuk, yang bermaksud fail dan direktori sistem fail yang berasingan (dikenali sebagai cawangan) boleh dilapisi secara telus untuk membentuk satu sistem fail.

Isi direktori yang mempunyai jalan yang sama dalam cawangan yang dilapisi dilihat sebagai satu direktori gabungan, yang mengelakkan perlunya membuat salinan terpisah dari setiap lapisan. Sebaliknya, mereka semua boleh diberi petunjuk kepada sumber yang sama; apabila lapisan tertentu perlu diubah, ia akan membuat salinan dan mengubah salinan tempatan, membiarkan asalnya tidak berubah. Begitulah sistem fail boleh * muncul * ditulis tanpa benar-benar membenarkan penulisan. (Dengan kata lain, sistem "copy-on-write".)

Sistem berlapis menawarkan dua faedah utama:

1. Bebas pendua: lapisan membantu mengelakkan penduaan set fail yang lengkap setiap kali anda menggunakan gambar untuk membuat dan menjalankan wadah baru, menjadikan penampung kontainer sangat cepat dan murah.

2. Pemisahan lapisan: Membuat perubahan jauh lebih cepat - ketika Anda mengubah gambar, Docker hanya menyebarkan kemas kini ke lapisan yang diubah.

Isipadu

Volume adalah bahagian "data" dari wadah, yang dimulakan semasa wadah dibuat. Kelantangan membolehkan anda bertahan dan berkongsi data bekas. Volume data terpisah dari Union File System lalai dan wujud seperti direktori dan fail biasa pada sistem fail host. Jadi, walaupun anda memusnahkan, mengemas kini, atau membina semula bekas anda, jumlah data akan tetap tidak tersentuh. Apabila anda ingin mengemas kini kelantangan, anda membuat perubahan secara langsung. (Sebagai bonus tambahan, jumlah data dapat dikongsi dan digunakan kembali di antara beberapa kontena, yang cukup rapi.)

Bekas Docker

Wadah Docker, seperti yang dibincangkan di atas, membungkus perisian aplikasi ke dalam kotak yang tidak kelihatan dengan semua yang perlu dijalankan oleh aplikasi. Itu termasuk sistem operasi, kod aplikasi, runtime, alat sistem, perpustakaan sistem, dan lain-lain. Docker container dibina dari gambar Docker. Oleh kerana gambar hanya boleh dibaca, Docker menambah sistem fail baca-tulis di atas sistem fail baca sahaja bagi membuat wadah.

Lebih-lebih lagi, ketika membuat wadah, Docker membuat antara muka rangkaian sehingga wadah dapat berbicara dengan host tempatan, melampirkan alamat IP yang tersedia ke wadah, dan menjalankan proses yang anda tentukan untuk menjalankan aplikasi anda ketika menentukan gambar.

Setelah berjaya membuat wadah, anda kemudian boleh menjalankannya di mana-mana persekitaran tanpa perlu membuat perubahan.

Klik dua kali pada "bekas"

Phew! Itu banyak bahagian yang bergerak. Satu perkara yang selalu membuat saya penasaran adalah bagaimana kontena benar-benar dilaksanakan, terutamanya kerana tidak ada batas infrastruktur abstrak di sekitar kontena. Setelah banyak membaca, semuanya masuk akal jadi inilah percubaan saya untuk menerangkannya kepada anda! :)

Istilah "kontena" sebenarnya hanyalah konsep abstrak untuk menerangkan bagaimana beberapa ciri berbeza bekerjasama untuk menggambarkan "wadah". Mari kita lalui dengan pantas:

1) Ruang Nama

Namespaces menyediakan kontena dengan pandangan mereka sendiri mengenai sistem Linux yang mendasari, membatasi apa yang dapat dilihat dan diakses oleh wadah. Semasa anda menjalankan bekas, Docker membuat ruang nama yang akan digunakan oleh bekas tertentu.

Terdapat beberapa jenis ruang nama dalam kernel yang digunakan oleh Docker, misalnya:

a. BERSIH: Menyediakan wadah dengan pandangan sendiri mengenai timbunan rangkaian sistem (contohnya peranti rangkaiannya sendiri, alamat IP, jadual perutean IP, / direktori / proc / net, nombor port, dll.).

b. PID: PID bermaksud ID Proses. Sekiranya anda pernah menjalankan ps aux di baris perintah untuk memeriksa proses apa yang berjalan di sistem anda, anda akan melihat lajur bernama "PID". Ruang nama PID memberikan kontena pandangan mereka sendiri mengenai proses yang dapat mereka lihat dan berinteraksi dengannya, termasuk init bebas (PID 1), yang merupakan "nenek moyang semua proses".

c. MNT: Memberi kontena pandangannya sendiri mengenai "pemasangan" pada sistem. Jadi, proses di ruang nama gunung yang berbeza mempunyai pandangan yang berbeza mengenai hierarki sistem fail.

d. UTS: UTS bermaksud Sistem Perkongsian Masa UNIX. Ia membolehkan proses mengenal pasti pengecam sistem (iaitu nama host, nama domain, dll.). UTS membenarkan kontena mempunyai nama host dan nama domain NIS sendiri yang tidak bergantung kepada kontena lain dan sistem host.

e. IPC: IPC bermaksud InterProcess Communication. Ruang nama IPC bertanggungjawab untuk mengasingkan sumber IPC antara proses yang berjalan di dalam setiap bekas.

f. PENGGUNA: Ruang nama ini digunakan untuk mengasingkan pengguna dalam setiap bekas. Ia berfungsi dengan membiarkan kontena mempunyai pandangan yang berbeza dari julat uid (ID pengguna) dan gid (ID kumpulan), dibandingkan dengan sistem host. Akibatnya, uid dan gid proses boleh berbeza di dalam dan di luar ruang nama pengguna, yang juga memungkinkan proses untuk memiliki pengguna yang tidak berhak di luar wadah tanpa mengorbankan hak root di dalam sebuah wadah.

Docker menggunakan ruang nama ini bersama-sama untuk mengasingkan dan memulakan pembuatan wadah. Ciri seterusnya dipanggil kumpulan kawalan.

2) Kumpulan kawalan

Kumpulan kawalan (juga disebut cgroups) adalah fitur kernel Linux yang mengasingkan, memprioritaskan, dan memperhitungkan penggunaan sumber daya (CPU, memori, disk I / O, rangkaian, dll.) Dari satu set proses. Dalam pengertian ini, cgroup memastikan bahawa kontena Docker hanya menggunakan sumber yang mereka perlukan - dan, jika diperlukan, tetapkan had untuk sumber apa yang dapat * digunakan * oleh kontena. Kumpulan juga memastikan bahawa satu wadah tidak menghabiskan salah satu sumber tersebut dan menjatuhkan keseluruhan sistem.

Terakhir, sistem fail kesatuan adalah ciri lain yang digunakan oleh Docker:

3) Sistem fail Kesatuan Terpencil:

Dihuraikan di atas di bahagian Docker Images :)

Ini benar-benar ada untuk wadah Docker (tentu saja, syaitan ada dalam perincian pelaksanaan - seperti bagaimana menguruskan interaksi antara pelbagai komponen).

Masa Depan Docker: Docker dan VM Akan Bersama

Walaupun Docker pasti mendapat banyak tenaga, saya tidak percaya ia akan menjadi ancaman sebenar kepada VM. Kontena akan terus mendapat tempat, tetapi terdapat banyak kes penggunaan di mana VM masih lebih sesuai.

Sebagai contoh, jika anda perlu menjalankan banyak aplikasi di beberapa pelayan, mungkin masuk akal untuk menggunakan VM. Sebaliknya, jika anda memerlukan banyak salinan * satu aplikasi, Docker menawarkan beberapa kelebihan yang menarik.

Lebih-lebih lagi, sementara wadah membolehkan anda memecah aplikasi anda menjadi bahagian diskrit yang lebih berfungsi untuk membuat pemisahan kebimbangan, ini juga bermaksud terdapat banyak bahagian yang perlu dikendalikan, yang boleh menjadi sukar.

Keselamatan juga menjadi perhatian bagi kontena Docker - kerana kontainer mempunyai kernel yang sama, penghalang antara kontena lebih tipis. Walaupun VM penuh hanya dapat mengeluarkan hypercalls kepada hypervisor host, wadah Docker dapat membuat syscall ke kernel host, yang membuat luas permukaan yang lebih besar untuk menyerang. Apabila keselamatan sangat penting, pembangun cenderung memilih VM, yang diasingkan oleh perkakasan yang dilekatkan - menjadikannya lebih sukar untuk mengganggu satu sama lain.

Sudah tentu, masalah seperti keselamatan dan pengurusan pasti akan berkembang kerana kontena mendapat lebih banyak pendedahan dalam pengeluaran dan pemeriksaan lebih lanjut dari pengguna. Buat masa ini, perbahasan mengenai kontena vs VM adalah yang terbaik untuk pengguna yang tinggal dan menghirupnya setiap hari!

Kesimpulannya

Saya harap anda sekarang dilengkapi dengan pengetahuan yang anda perlukan untuk mempelajari lebih lanjut mengenai Docker dan mungkin juga menggunakannya dalam satu projek suatu hari nanti.

Seperti biasa, berikan saya komen dalam komen sekiranya saya melakukan kesalahan atau boleh membantu! :)