Apa Docker: kunjungan singkat menyang sejarah lan abstraksi dhasar

Diwiwiti tanggal 10 Agustus ing Slurm Kursus video Docker, ing ngendi kita nganalisa kanthi lengkap - saka abstraksi dhasar nganti paramèter jaringan.

Ing artikel iki kita bakal ngomong babagan sejarah Docker lan abstraksi utama: Gambar, Cli, Dockerfile. Kuliah kasebut ditujokake kanggo pamula, mula ora ana minat kanggo pangguna sing berpengalaman. Ora bakal ana getih, apendiks utawa kecemplung jero. Dasar banget.

Apa Docker: kunjungan singkat menyang sejarah lan abstraksi dhasar

Apa iku Docker

Ayo goleki definisi Docker saka Wikipedia.

Docker minangka piranti lunak kanggo ngotomatisasi panyebaran lan manajemen aplikasi ing lingkungan kontainer.

Ora ana sing jelas saka definisi iki. Utamane ora jelas apa tegese "ing lingkungan sing ndhukung containerization". Kanggo ngerteni, ayo bali menyang wektu. Ayo diwiwiti karo jaman sing biasa disebut "Era Monolitik."

jaman monolitik

Era monolitik yaiku awal 2000-an, nalika kabeh aplikasi monolitik, kanthi akeh dependensi. Pembangunan njupuk wektu dawa. Ing wektu sing padha, ora ana akeh server; kita ngerti kabeh kanthi jeneng lan ngawasi. Ana perbandingan sing lucu:

Pets minangka kéwan domestik. Ing jaman monolitik, kita nganggep server kaya kewan, didandani lan ditresnani, mbuwang bledug. Lan kanggo manajemen sumber daya sing luwih apik, kita nggunakake virtualisasi: kita njupuk server lan Cut menyang sawetara mesin virtual, saéngga njamin isolasi lingkungan.

Sistem virtualisasi berbasis hypervisor

Saben uwong mbokmenawa wis krungu babagan sistem virtualisasi: VMware, VirtualBox, Hyper-V, Qemu KVM, lan liya-liyane. Padha nyedhiyakake isolasi aplikasi lan manajemen sumber daya, nanging uga duwe kekurangan. Kanggo nindakake virtualisasi, sampeyan butuh hypervisor. Lan hypervisor minangka overhead sumber daya. Lan mesin virtual dhewe biasane colossus kabeh - gambar abot sing ngemot sistem operasi, Nginx, Apache, lan bisa uga MySQL. Gambar gedhe lan mesin virtual ora trep kanggo operate. Akibaté, nggarap mesin virtual bisa dadi alon. Kanggo ngatasi masalah iki, sistem virtualisasi digawe ing tingkat kernel.

Sistem virtualisasi tingkat kernel

Virtualisasi tingkat kernel didhukung dening sistem OpenVZ, Systemd-nspawn, LXC. Conto virtualisasi kasebut yaiku LXC (Linux Containers).

LXC minangka sistem virtualisasi tingkat sistem operasi kanggo nglakokake macem-macem instance sistem operasi Linux ing siji simpul. LXC ora nggunakake mesin virtual, nanging nggawe lingkungan virtual karo papan proses lan tumpukan jaringan dhewe.

Ateges LXC nggawe kontaner. Apa prabédan antarane mesin virtual lan kontaner?

Apa Docker: kunjungan singkat menyang sejarah lan abstraksi dhasar

Wadhah kasebut ora cocog kanggo proses pamisahan: kerentanan ditemokake ing sistem virtualisasi ing tingkat kernel sing ngidini dheweke bisa lolos saka wadhah menyang host. Mulane, yen sampeyan kudu ngisolasi soko, luwih becik nggunakake mesin virtual.

Bedane antarane virtualisasi lan containerization bisa dideleng ing diagram.
Ana hypervisor hardware, hypervisor ing ndhuwur OS, lan wadhah.

Apa Docker: kunjungan singkat menyang sejarah lan abstraksi dhasar

Hypervisor hardware apik yen sampeyan pengin ngisolasi soko. Amarga iku bisa kanggo isolasi ing tingkat kaca memori lan prosesor.

Ana hypervisors minangka program, lan ana kontaner, lan kita bakal pirembagan bab mau luwih. Sistem Containerization ora duwe hypervisor, nanging ana Container Engine sing nggawe lan ngatur wadhah. Bab iki luwih entheng, mula amarga nggarap inti kurang overhead utawa ora ana.

Apa digunakake kanggo containerization ing tingkat kernel

Teknologi utama sing ngidini sampeyan nggawe wadhah sing diisolasi saka proses liyane yaiku Namespaces lan Control Groups.

Namespaces: PID, Networking, Mount lan Panganggo. Ana liyane, nanging kanggo ease saka pangerten kita bakal fokus ing iki.

PID Namespace mbatesi proses. Nalika, contone, kita nggawe PID Namespace lan nyeleh proses ana, dadi karo PID 1. Biasane ing sistem PID 1 punika systemd utawa init. Dadi, nalika kita nyelehake proses ing ruang jeneng anyar, uga nampa PID 1.

Networking Namespace ngidini sampeyan mbatesi / ngisolasi jaringan lan nyelehake antarmuka sampeyan dhewe ing njero. Gunung minangka watesan sistem file. Pangguna — watesan kanggo pangguna.

Grup Kontrol: Memori, CPU, IOPS, Jaringan - total 12 setelan. Yen ora, padha uga disebut Cgroups ("C-grup").

Grup Kontrol ngatur sumber daya kanggo wadhah. Liwat Control Groups kita bisa ngomong sing wadhah ngirim ora nganggo luwih saka jumlah tartamtu saka sumber daya.

Supaya containerization bisa digunakake kanthi lengkap, teknologi tambahan digunakake: Kapabilitas, Copy-on-write lan liya-liyane.

Kapabilitas yaiku nalika kita ngandhani proses apa sing bisa lan ora bisa ditindakake. Ing tingkat kernel, iki mung bitmap kanthi akeh paramèter. Contone, pangguna root duwe hak istimewa lengkap lan bisa nindakake kabeh. Server wektu bisa ngganti wektu sistem: wis kapabilitas ing Kapsul Wektu, lan iku. Nggunakake hak istimewa, sampeyan bisa kanthi fleksibel ngatur watesan kanggo proses, lan kanthi mangkono nglindhungi dhewe.

Sistem Copy-on-write ngidini kita bisa nggarap gambar Docker lan nggunakake kanthi luwih efisien.

Docker saiki duwe masalah kompatibilitas karo Cgroups v2, mula artikel iki fokus khusus ing Cgroups v1.

Nanging ayo bali menyang sejarah.

Nalika sistem virtualisasi muncul ing tingkat kernel, mula aktif digunakake. Overhead ing hypervisor ilang, nanging sawetara masalah tetep:

  • gambar gedhe: padha push sistem operasi, perpustakaan, Bunch saka piranti lunak beda menyang OpenVZ padha, lan ing pungkasan gambar isih dadi cukup gedhe;
  • Ora ana standar normal kanggo kemasan lan pangiriman, mula masalah dependensi tetep. Ana kahanan nalika rong bagéyan kode nggunakake perpustakaan padha, nanging karo versi beda. Bisa uga ana konflik ing antarane.

Kanggo ngrampungake kabeh masalah kasebut, jaman sabanjure wis teka.

Jaman wadhah

Nalika Era Kontainer teka, filosofi nggarap dheweke diganti:

  • Siji proses - siji wadhah.
  • Kita ngirim kabeh dependensi sing dibutuhake proses kasebut menyang wadhah kasebut. Iki mbutuhake nglereni monoliths menyang microservices.
  • Sing luwih cilik gambar, luwih apik - ana kerentanan sing luwih sithik, luwih cepet diluncurake, lan liya-liyane.
  • Kedadeyan dadi ephemeral.

Elinga apa sing dakkandhakake babagan pets vs sapi? Biyen kewan kewan kewan, nanging saiki wis kaya sapi. Sadurunge, ana monolith - siji aplikasi. Saiki 100 microservices, 100 kontaner. Sawetara kontaner bisa duwe 2-3 replika. Dadi kurang penting kanggo kita ngontrol saben wadhah. Sing luwih penting kanggo kita yaiku kasedhiyan layanan kasebut dhewe: apa sing ditindakake ing wadhah kasebut. Iki owah-owahan pendekatan kanggo ngawasi.

Ing 2014-2015, Docker ngrembaka - teknologi sing bakal kita bahas saiki.

Docker ngganti filosofi lan kemasan aplikasi standar. Nggunakake Docker, kita bisa ngemas aplikasi, ngirim menyang repositori, download saka ing kono, lan nyebarake.

Kita sijine kabeh sing perlu menyang wadhah Docker, supaya masalah ketergantungan ditanggulangi. Docker njamin reproducibility. Aku mikir akeh wong sing nemoni irreproducibility: kabeh bisa digunakake kanggo sampeyan, sampeyan push menyang produksi, lan ing kana ora bisa digunakake. Kanthi Docker masalah iki ilang. Yen wadhah Docker sampeyan miwiti lan nindakake apa sing kudu ditindakake, mula kanthi kemungkinan dhuwur bakal diwiwiti ing produksi lan nindakake perkara sing padha ing kana.

Digression babagan overhead

Ana tansah regejegan bab overheads. Sawetara wong percaya yen Docker ora nggawa beban tambahan, amarga nggunakake kernel Linux lan kabeh proses sing dibutuhake kanggo wadah. Kaya, "yen sampeyan ujar manawa Docker ana ing ndhuwur, mula kernel Linux ana ing ndhuwur."

Ing sisih liya, yen sampeyan luwih jero, ana sawetara perkara ing Docker sing, kanthi regane, bisa diarani nduwur sirah.

Sing pertama yaiku ruang jeneng PID. Nalika kita nyeleh proses ing namespace, diutus PID 1. Ing wektu sing padha, proses iki wis PID liyane, kang dumunung ing namespace inang, njaba wadhah. Contone, kita ngluncurake Nginx ing wadhah, dadi PID 1 (proses master). Lan ing inang wis PID 12623. Lan iku hard kanggo ngomong pinten nduwur sirah iku.

Sing nomer loro yaiku Cgroups. Ayo dadi njupuk Cgroups dening memori, sing, kemampuan kanggo matesi memori saka wadhah. Nalika diaktifake, counter lan accounting memori diaktifake: kernel kudu ngerti carane akeh kaca wis diparengake lan carane akeh isih free kanggo wadhah iki. Iki bisa uga overhead, nanging aku durung weruh studi sing tepat babagan pengaruhe kinerja. Lan aku dhewe ora weruh yen aplikasi sing mlaku ing Docker dumadakan ngalami mundhut kinerja.

Lan siji cathetan liyane babagan kinerja. Sawetara parameter kernel dilewati saka host menyang wadhah. Ing tartamtu, sawetara paramèter jaringan. Mulane, yen sampeyan pengin mbukak soko dhuwur-kinerja ing Docker, contone, soko sing aktif nggunakake jaringan, sampeyan kudu paling ora kanggo nyetel paramèter iki. Sawetara nf_conntrack, contone.

Babagan konsep Docker

Docker kasusun saka sawetara komponen:

  1. Docker Daemon punika Container Engine padha; ngetokake kontaner.
  2. Docker CII minangka sarana manajemen Docker.
  3. Dockerfile - instruksi babagan carane nggawe gambar.
  4. Gambar - gambar saka ngendi wadhah digulung.
  5. Wadhah
  6. Registri Docker minangka repositori gambar.

Skema katon kaya iki:

Apa Docker: kunjungan singkat menyang sejarah lan abstraksi dhasar

Daemon Docker mlaku ing Docker_host lan ngluncurake kontainer. Ana Klien sing ngirim printah: mbangun gambar, ngundhuh gambar, miwiti wadhah. Daemon Docker menyang registri lan nglakokake. Klien Docker bisa ngakses loro lokal (menyang soket Unix) lan liwat TCP saka host remot.

Ayo dadi liwat saben komponen.

Docker daemon - iki bagean server, kerjane ing mesin inang: download gambar lan mbukak kontaner saka wong-wong mau, nggawe jaringan antarane kontaner, ngumpulake log. Nalika kita ujar "gawe gambar," setan uga nindakake.

Docker CLI - Bagian klien Docker, sarana konsol kanggo nggarap daemon. Aku mbaleni, iku bisa ora mung lokal, nanging uga liwat jaringan.

Prentah dhasar:

docker ps - nuduhake kontaner sing lagi mlaku ing host Docker.
gambar docker - nuduhake gambar sing diundhuh sacara lokal.
docker search <> - nggoleki gambar ing registri.
docker pull <> - download gambar saka pendaptaran menyang mesin.
mbangun docker < > - ngumpulake gambar.
docker run <> - miwiti wadhah.
docker rm <> - mbusak wadhah.
log docker <> - log wadhah
docker start/stop/restart <> - nggarap wadhah

Yen sampeyan nguwasani printah kasebut lan yakin nggunakake, anggep sampeyan 70% pinter ing Docker ing tingkat pangguna.

file docker - instruksi kanggo nggawe gambar. Meh saben printah instruksi lapisan anyar. Ayo katon ing conto.

Apa Docker: kunjungan singkat menyang sejarah lan abstraksi dhasar

Iki minangka Dockerfile: printah ing sisih kiwa, argumen ing sisih tengen. Saben printah sing ana ing kene (lan umume ditulis ing Dockerfile) nggawe lapisan anyar ing Gambar.

Malah ndeleng ing sisih kiwa, sampeyan bisa ngerti apa sing kedadeyan. Kita ngomong: "gawe folder kanggo kita" - iki siji lapisan. "Make the folder working" iku lapisan liyane, lan liya-liyane. Kue lapis nggawe urip luwih gampang. Yen aku nggawe Dockerfile liyane lan ngganti soko ing baris pungkasan - Aku mbukak soko liyane saka "python" "main.py", utawa nginstal dependensi saka file liyane - banjur lapisan sadurungé bakal digunakake maneh minangka cache a.

gambar - iki kemasan wadhah; wadhah diluncurake saka gambar. Yen kita ndeleng Docker saka sudut pandang manajer paket (kaya kita nggarap paket deb utawa rpm), mula gambar kasebut minangka paket rpm. Liwat yum install kita bisa nginstal aplikasi, mbusak, nemokake ing repositori, lan ngundhuh. Ing kene meh padha: kontaner diluncurake saka gambar, disimpen ing registri Docker (padha karo yum, ing repositori), lan saben gambar duwe hash SHA-256, jeneng lan tag.

Gambar dibangun miturut pandhuan saka Dockerfile. Saben instruksi saka Dockerfile nggawe lapisan anyar. Lapisan bisa digunakake maneh.

Registry Docker minangka repositori gambar Docker. Kaya OS, Docker duwe registri standar umum - dockerhub. Nanging sampeyan bisa mbangun repositori dhewe, registri Docker dhewe.

wadhah - apa sing dibukak saka gambar. Kita mbangun gambar miturut pandhuan saka Dockerfile, banjur kita miwiti saka gambar iki. Wadhah iki diisolasi saka wadhah liyane lan kudu ngemot kabeh sing dibutuhake supaya aplikasi bisa digunakake. Ing kasus iki, siji wadhah - siji proses. Iku kedadeyan yen sampeyan kudu nindakake rong proses, nanging iki rada kontras karo ideologi Docker.

Persyaratan "siji wadhah, siji proses" ana gandhengane karo PID Namespace. Nalika proses karo PID 1 diwiwiti ing Namespace, yen dumadakan mati, banjur kabeh wadhah mati uga. Yen ana rong proses: siji urip lan liyane mati, wadhah kasebut isih bakal urip. Nanging iki minangka pitakonan Praktik Paling Apik, kita bakal ngomong babagan kasebut ing materi liyane.

Kanggo nyinaoni fitur lan program lengkap kursus kasebut kanthi luwih rinci, tututi link: "Kursus video Docker".

Pengarang: Marcel Ibraev, administrator Kubernetes sing disertifikasi, praktik insinyur ing Southbridge, speaker lan pangembang kursus Slurm.

Source: www.habr.com

Add a comment