GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Apa itu Doker? Bagaimana cara kerjanya?

Dalam panduan komprehensif ini, saya telah menjelaskan apa itu Docker, evolusinya, konsep inti Linux yang mendasari, dan cara kerjanya.

Docker telah menjadi standar de facto dalam hal implementasi berbasis container. Docker adalah dasar untuk orkestrasi berbasis container dari implementasi skala kecil hingga aplikasi perusahaan skala besar.

Docker mendapatkan begitu banyak popularitas dan adopsi di komunitas DevOps dengan cepat karena dikembangkan untuk portabilitas dan dirancang untuk arsitektur layanan mikro modern.

Di blog ini, Anda akan belajar,

  1. Apa itu Docker?
  2. Pelajari tentang Docker dan lihat mengapa Docker bermanfaat dan berbeda dari teknologi container lainnya.
  3. Arsitektur inti Docker dan komponen utamanya
  4. Evolusi container dan konsep dasar Linux Containers
  5. Apa itu container, dan fitur Linux apa yang membuatnya bekerja?
  6. Perbedaan antara proses, penampung, dan VM

Di sini, idenya adalah untuk memahami dasar-dasar Anda dengan benar untuk memahami apa sebenarnya Docker dan cara kerjanya.

Apa itu Docker?

Docker adalah proyek sumber terbuka populer yang ditulis dan dikembangkan oleh Dotcloud (Perusahaan PaaS).

Ini adalah mesin penampung yang menggunakan fitur Kernel Linux seperti ruang nama dan grup kontrol untuk membuat wadah di atas sistem operasi. Jadi Anda bisa menyebutnya virtualisasi tingkat OS.

Docker awalnya dibangun di atas Linux container (LXC) . Kemudian Docker mengganti LXC dengan libcontainer runtime containernya (sekarang bagian dari runc). Saya telah menjelaskan konsep inti LXC &wadah menjelang akhir artikel.

Anda mungkin bertanya bagaimana Docker berbeda dari Linux Container (LXC) karena semua konsep dan implementasinya terlihat serupa?

Selain hanya sebagai teknologi container, Docker memiliki komponen wrapper yang terdefinisi dengan baik yang membuat aplikasi pengemasan menjadi mudah . Sebelum Docker, menjalankan container tidak mudah. Artinya, ia melakukan semua pekerjaan untuk memisahkan aplikasi Anda dari infrastruktur dengan mengemas semua persyaratan sistem aplikasi ke dalam sebuah wadah.

Misalnya, jika Anda memiliki file jar Java, Anda dapat menjalankannya di server mana pun yang telah menginstal Java. Dengan cara yang sama, setelah Anda mengemas wadah dengan aplikasi yang diperlukan menggunakan Docker, Anda dapat menjalankannya di host lain yang telah menginstal Docker.

Kami akan menyiapkan dan menjalankan container dengan menjalankan beberapa perintah ¶meter Docker.

Perbedaan Antara Docker &Kontainer

Docker adalah teknologi atau alat yang dikembangkan untuk mengelola container secara efisien.

Jadi, bisakah saya menjalankan container tanpa Docker?

Ya! tentu saja. Anda dapat menggunakan teknologi LXC untuk menjalankan container di server Linux. Selain itu, alat terbaru seperti Podman menawarkan alur kerja serupa seperti Docker.

Hal-hal yang harus Anda ketahui tentang Docker:

  1. Docker bukan LXC
  2. Docker bukan Solusi Mesin Virtual.
  3. Docker bukan sistem manajemen konfigurasi dan bukan pengganti Chef, Puppet, Ansible, dll.
  4. Docker bukan platform sebagai teknologi layanan.
  5. Docker bukan penampung.

Apa yang Membuat Docker Begitu Hebat?

Docker memiliki alur kerja yang efisien untuk memindahkan aplikasi dari laptop pengembang ke lingkungan pengujian ke produksi. Anda akan lebih memahaminya saat melihat contoh praktis mengemas aplikasi ke dalam gambar Docker.

Tahukah Anda bahwa memulai wadah buruh pelabuhan membutuhkan waktu kurang dari satu detik ?

Ini sangat cepat, dan dapat berjalan di host mana pun dengan Kernel Linux yang kompatibel. (Mendukung Windows juga)

Catatan: Anda tidak dapat menjalankan wadah Windows di host Linux karena tidak ada dukungan Kernel Linux untuk Windows. Anda dapat membaca tentang wadah Windows dari sini

Docker menggunakan sistem file gabungan Copy-on-write untuk penyimpanan gambarnya. Oleh karena itu, ketika perubahan dilakukan pada wadah, hanya perubahan yang akan ditulis ke disk menggunakan salinan pada model tulis.

Dengan Copy on write, Anda akan mengoptimalkan lapisan penyimpanan bersama untuk semua container Anda.

Statistik Adopsi Docker

Berikut adalah data tren google di Docker. Anda dapat melihatnya telah menjadi topik yang meledak selama lima tahun terakhir.

Berikut adalah hasil survei dari Datadog, yang menunjukkan peningkatan adopsi Docker.

Arsitektur Inti Docker

Bagian berikut akan melihat arsitektur Docker dan komponen terkaitnya. Kita juga akan melihat bagaimana setiap komponen bekerja sama untuk membuat Docker bekerja.

Arsitektur Docker telah berubah beberapa kali sejak awal. Ketika saya menerbitkan versi pertama artikel ini, Docker dibangun di atas LXC

Berikut adalah beberapa perubahan arsitektur penting yang terjadi pada Docker

  1. Docker dipindahkan dari LXC ke libcontainer pada tahun 2014
  2. runc – CLI untuk memutar container yang mengikuti semua spesifikasi OCI.
  3. containerd – Docker memisahkan komponen container management-nya ke containerd pada tahun 2016

OCI:Open Container Initiative adalah standar industri terbuka untuk runtime dan spesifikasi container.

Ketika Docker awalnya diluncurkan, ia memiliki arsitektur monolitik. Sekarang dipisahkan menjadi tiga komponen berbeda berikut.

  1. Mesin Docker (dokter)
  2. docker-containerd (containerd)
  3. docker-runc (runc)

Docker dan organisasi besar lainnya berkontribusi pada runtime container standar dan lapisan manajemen. Oleh karena itu containerd dan runc sekarang menjadi bagian dari Cloud Native Foundation dengan kontributor dari semua organisasi.

Catatan: Saat menginstal Docker, semua komponen ini diinstal. Anda tidak perlu menginstalnya secara terpisah. Untuk penjelasan, kami menunjukkannya sebagai komponen yang berbeda.

Sekarang mari kita lihat setiap komponen Docker.

Mesin Docker

Mesin Docker terdiri dari daemon buruh pelabuhan, antarmuka API, dan CLI Docker. Docker daemon (dockerd) berjalan terus menerus sebagai dockerd layanan sistemd. Ia bertanggung jawab untuk membangun image buruh pelabuhan.

Untuk mengelola gambar dan menjalankan container, dockerd memanggil docker-containerd API.

docker-containerd (containerd)

containerd adalah layanan daemon sistem lain selain yang bertanggung jawab untuk mengunduh gambar buruh pelabuhan dan menjalankannya sebagai wadah. Itu memperlihatkan API-nya untuk menerima instruksi dari dockerd layanan

docker-runc

runc adalah runtime container yang bertanggung jawab untuk membuat namespace dan cgroup yang diperlukan untuk container. Kemudian menjalankan perintah kontainer di dalam ruang nama tersebut. runc runtime diimplementasikan sesuai spesifikasi OCI.

Baca seri posting blog 3 bagian yang luar biasa ini untuk memahami lebih lanjut tentang runtime container.

Bagaimana Docker Bekerja?

Kami telah melihat blok bangunan inti Docker.

Sekarang mari kita pahami alur kerja Docker menggunakan komponen Docker.

Komponen Docker

Berikut arsitektur buruh pelabuhan tingkat tinggi official resmi berikut diagram menunjukkan alur kerja Docker yang umum.

Ekosistem Docker terdiri dari empat komponen berikut

  1. Daemon Docker (dokter)
  2. Klien Docker
  3. Gambar Docker
  4. Registry Docker
  5. Kontainer Docker

Apa itu Daemon Docker?

Docker memiliki arsitektur client-server. Docker Daemon (dockerd ) atau server bertanggung jawab atas semua tindakan yang terkait dengan container.

Daemon menerima perintah dari klien Docker melalui CLI atau REST API. Klien Docker dapat berada di host yang sama dengan daemon atau ada di host lain.

Secara default, daemon buruh pelabuhan mendengarkan docker.sock soket UNIX. Jika Anda memiliki kasus penggunaan untuk mengakses API buruh pelabuhan dari jarak jauh, Anda perlu mengeksposnya melalui port Host. Salah satu kasus penggunaan tersebut adalah menjalankan Docker sebagai agen Jenkins.

Jika Anda ingin menjalankan Docker di dalam Docker, Anda dapat menggunakan docker.sock dari mesin host.

Apa itu Gambar Docker?

Gambar adalah blok bangunan dasar Docker. Ini berisi pustaka OS, dependensi, dan alat untuk menjalankan aplikasi.

Gambar dapat dibuat sebelumnya dengan dependensi aplikasi untuk membuat wadah. Misalnya, jika Anda ingin menjalankan server web Nginx sebagai wadah Ubuntu, Anda perlu membuat image Docker dengan biner Nginx dan semua pustaka OS yang diperlukan untuk menjalankan Nginx.

Apa itu Dockerfile?

Docker memiliki konsep Dockerfile yang digunakan untuk membangun citra. A Dockerfile file teks yang berisi satu perintah (instruksi) per baris.

Berikut adalah contoh Dockerfile.

Gambar buruh pelabuhan diatur dalam mode berlapis. Setiap instruksi pada Dockerfile menambahkan lapisan dalam gambar. Lapisan gambar paling atas yang dapat ditulis adalah sebuah wadah.

Setiap gambar dibuat dari gambar dasar.

Misalnya, jika Anda dapat menggunakan gambar dasar Ubuntu dan membuat gambar lain dengan aplikasi Nginx. Gambar dasar dapat berupa gambar induk atau gambar yang dibuat dari gambar induk. Lihat artikel buruh pelabuhannya untuk mengetahui lebih banyak tentangnya.

Anda mungkin bertanya dari mana gambar dasar ini (Gambar induk) berasal? Ada utilitas buruh pelabuhan untuk membuat gambar dasar induk awal. Dibutuhkan perpustakaan OS yang diperlukan dan memanggangnya menjadi gambar dasar. Anda tidak perlu melakukan ini karena Anda akan mendapatkan gambar dasar resmi untuk distro Linux.

Lapisan atas gambar dapat ditulis dan digunakan oleh wadah yang sedang berjalan. Lapisan lain dalam gambar bersifat hanya-baca.

Apa itu Registri Docker?

Ini adalah repositori (penyimpanan) untuk gambar Docker.

Registri dapat bersifat publik atau pribadi. Misalnya, Docker Inc menyediakan layanan registri yang dihosting yang disebut Docker Hub. Ini memungkinkan Anda mengunggah dan mengunduh gambar dari lokasi pusat.

Catatan: Secara default, ketika Anda menginstal buruh pelabuhan, itu mencari gambar dari hub Docker publik kecuali jika Anda menentukan registri khusus di pengaturan Docker.

Pengguna hub Docker lainnya dapat mengakses semua gambar Anda jika repositori Anda bersifat publik. Anda juga dapat membuat registri pribadi di Docker Hub.

Hub Docker bertindak seperti git, tempat Anda dapat membuat gambar secara lokal di laptop, mengkomitnya, lalu didorong ke hub Docker.

Kiat: Saat menggunakan buruh pelabuhan di jaringan/proyek perusahaan, siapkan registri buruh pelabuhan Anda sendiri daripada menggunakan hub buruh pelabuhan publik. Semua penyedia cloud memiliki layanan penampung penampungnya sendiri.

Apa itu Kontainer Docker?

Wadah Docker dibuat dari gambar yang ada. Ini adalah lapisan gambar yang dapat ditulis.

Jika Anda mencoba menghubungkan lapisan gambar dan wadah, inilah tampilannya untuk gambar berbasis ubuntu.

Anda dapat mengemas aplikasi Anda dalam sebuah wadah, mengkomitnya, dan menjadikannya gambar emas untuk membangun lebih banyak wadah darinya.

Kontainer dapat dimulai, dihentikan, dikomit, dan diakhiri. Jika Anda menghentikan sebuah container tanpa melakukan commit, semua perubahan container akan hilang.

Idealnya, container diperlakukan sebagai objek yang tidak dapat diubah, dan tidak disarankan untuk membuat perubahan pada container yang sedang berjalan. Sebagai gantinya, buat perubahan pada container yang sedang berjalan hanya untuk tujuan pengujian.

Dua atau lebih wadah dapat dihubungkan bersama untuk membentuk arsitektur aplikasi berjenjang. Namun, menghosting aplikasi skalabel tinggi dengan Docker telah dipermudah dengan munculnya alat orkestrasi container seperti kubernetes.

Evolusi Kontainer

Jika Anda berpikir containerization adalah teknologi baru, ternyata tidak. Google telah menggunakan teknologi container dalam infrastrukturnya selama bertahun-tahun.

Konsep kontainer dimulai pada tahun 2000-an. Sebenarnya, akarnya kembali ke 1979 ketika kami memiliki chroot, sebuah konsep untuk mengubah direktori root dari suatu proses.

Berikut adalah daftar proyek berbasis kontainer yang dimulai pada tahun 2000.

Tahun Teknologi
2000 Jail FreeBSD memperkenalkan konsep container.
2003 Proyek server Linux-V dirilis dengan konsep virtualisasi tingkat OS
2005 Solaris Zones– proyek virtualisasi tingkat OS diperkenalkan
2007 Google merilis makalah tentang Generic Process Containers
2008 Rilis awal wadah LXC
2011 penjaga cloudfoundry mengumumkan
2013 lcmcty– Sumber terbuka oleh Google
2013 Proyek Docker diumumkan oleh DotCloud
2014 Roket. (rkt) diumumkan oleh CoreOS
2016 Pratinjau wadah Windows dirilis sebagai bagian dari server Windows 2016

Apa itu wadah Linux (LXC)?

Sekarang mari kita pahami apa itu Linux Container.

Dalam lingkungan virtual yang khas, satu atau lebih mesin virtual berjalan di atas server fisik menggunakan hypervisor seperti Xen, Hyper-V, dll.

Di sisi lain, Container berjalan di atas kernel sistem operasi. Anda dapat menyebutnya virtualisasi tingkat OS. Sebelum masuk ke konsep container yang mendasarinya, Anda perlu memahami dua konsep kunci Linux.

  1. Ruang pengguna: Semua kode yang diperlukan untuk menjalankan program pengguna (aplikasi, proses) disebut userspace. Saat Anda memulai tindakan program, misalnya, untuk membuat file, proses di ruang pengguna membuat panggilan sistem ke ruang Kernal.
  2. Ruang Kernel :Ini adalah jantung dari sistem operasi, di mana Anda memiliki kode kernel, yang berinteraksi dengan perangkat keras sistem, penyimpanan, dll.

Kontainer adalah Proses.

Anda memulai proses ketika Anda memulai aplikasi, misalnya, server web Nginx. Proses itu sendiri adalah instruksi mandiri dengan isolasi terbatas.

Bagaimana jika kita dapat mengisolasi proses dengan hanya file dan konfigurasi yang diperlukan untuk menjalankan dan mengoperasikan. Itulah yang dilakukan sebuah wadah.

Sebuah wadah adalah sebuah proses dengan isolasi komponen ruang pengguna yang cukup untuk memberikan perasaan sistem operasi yang terpisah.

Proses wadah induk mungkin memiliki proses anak. Jadi, Anda dapat mengatakan bahwa wadah juga merupakan grup proses .

Misalnya, ketika Anda memulai layanan Nginx, itu memulai proses induk Nginx. Proses induk mencakup proses turunannya seperti pengelola cache, pemuat cache, dan pekerja.

Jadi, saat Anda memulai wadah Nginx, Anda memulai proses master Nginx di lingkungan yang terisolasi.

Saya akan menunjukkannya kepada Anda secara praktis di bagian di bawah ini.

Setiap container memiliki ruang pengguna yang terisolasi, dan Anda dapat menjalankan beberapa container pada satu host.

Apakah itu berarti wadah memiliki seluruh OS ?

Tidak. Tidak seperti VM dengan kernelnya, container berisi file yang diperlukan terkait dengan distro tertentu dan menggunakan kernel host bersama.

Yang lebih menarik, Anda dapat menjalankan kontainer berbasis distro Linux yang berbeda pada satu host yang berbagi ruang kernel yang sama.

Misalnya, Anda dapat menjalankan RHEL, CentOS, wadah berbasis SUSE di server Ubuntu. Hal ini dimungkinkan karena hanya userspace yang berbeda untuk semua distro Linux, dan kernel space yang sama.

Konsep yang Mendasari Kontainer Linux

Gambar berikut memberikan representasi visual dari container Linux.

Wadah diisolasi menggunakan dua fitur kernel Linux yang disebut ruang nama dan grup kontrol.

Analogi dunia nyata adalah bangunan Apartemen. Meskipun merupakan satu bangunan besar, setiap kondominium/rusun terisolasi untuk rumah tangga individu yang memiliki identitas sendiri dengan meteran air, gas, dan listrik. Kami menggunakan beton, struktur baja, dan bahan konstruksi lainnya untuk membuat isolasi ini. Anda tidak memiliki visibilitas ke rumah lain kecuali mereka mengizinkan Anda masuk.

Demikian pula, Anda dapat menghubungkan ini dengan satu host yang berisi banyak wadah. Untuk mengisolasi container dengan CPU, memori, alamat IP, titik pemasangan, proses, Anda memerlukan dua fitur kernel Linux disebut ruang nama dan grup kontrol.

Ruang Nama Linux

Wadah adalah tentang memiliki lingkungan yang terisolasi dengan baik untuk menjalankan layanan (Proses). Untuk mencapai tingkat isolasi tersebut, sebuah container harus memiliki sistem file, alamat IP, titik mount, ID proses, dll. Anda dapat mencapainya dengan menggunakan Ruang Nama Linux.

Namespace bertanggung jawab atas titik pemasangan container, pengguna, alamat IP, manajemen proses, dll. Jadi pada dasarnya, ini menetapkan batasan untuk container.

Berikut ini adalah ruang nama utama di Linux

  1. ruang nama pid :Bertanggung jawab untuk mengisolasi proses (PID:ID Proses).
  2. ruang nama bersih :Ini mengelola antarmuka jaringan (NET:Networking).
  3. ruang nama ipc :Ini mengelola akses ke sumber daya IPC (IPC:InterProcess Communication).
  4. mnt namespace :Bertanggung jawab untuk mengelola titik pemasangan sistem file (MNT:Mount).
  5. mengatasi namespace :Mengisolasi pengidentifikasi kernel dan versi. (UTS:Sistem Pembagian Waktu Unix).
  6. ruang nama usr: Mengisolasi ID pengguna. Dengan kata sederhana, ini mengisolasi id pengguna antara host dan container.
  7. Ruang nama grup: Ini mengisolasi informasi grup kontrol dari proses container

Dengan menggunakan ruang nama di atas, sebuah wadah dapat memiliki antarmuka jaringan, alamat IP, dll. Setiap wadah akan memiliki ruang nama dan proses yang berjalan di dalam ruang nama tersebut tidak akan memiliki hak istimewa di luar ruang nama.

Menariknya, Anda dapat membuat daftar namespace di mesin Linux menggunakan lsns perintah.

Grup Kontrol Linux

Kami tidak menentukan batas memori atau CPU apa pun saat memulai layanan. Sebagai gantinya, kami menyerahkannya kepada kernel untuk memprioritaskan dan mengalokasikan sumber daya untuk layanan.

Namun, Anda dapat secara eksplisit menetapkan batas memori CPU untuk layanan Anda menggunakan fitur kernel Linux yang disebut CGroups . Ini bukan pendekatan langsung; Anda perlu membuat beberapa konfigurasi tambahan dan penyesuaian untuk membuatnya berfungsi.

Karena Anda dapat menjalankan beberapa kontainer di dalam sebuah host, harus ada mekanisme untuk membatasi penggunaan sumber daya, akses perangkat, dll. Di sinilah kelompok kontrol berperan.

Grup kontrol Linux mengelola sumber daya yang digunakan oleh sebuah wadah. Anda dapat membatasi sumber daya CPU, memori, jaringan, dan IO dari grup kontrol Linux container.

Jadi apa yang terjadi jika saya tidak membatasi sumber daya CPU &Memori sebuah container?

Satu penampung mungkin menggunakan semua sumber daya host, membiarkan penampung lain mogok karena tidak tersedianya sumber daya.

Alat seperti Docker mengabstraksi semua konfigurasi backend yang kompleks dan memungkinkan Anda menentukan batas sumber daya ini dengan parameter sederhana.

Mengapa Container Lebih Baik Dari VM?

Kontainer memiliki beberapa keunggulan utama dibandingkan VM. Mari kita lihat itu.

Utilisasi &Biaya Sumber Daya

  1. Anda dapat menggunakan VM untuk menjalankan aplikasi Anda secara mandiri, yang berarti satu layanan per VM. Tapi itu masih bisa kurang dimanfaatkan. Dan mengubah ukuran VM bukanlah tugas yang mudah untuk aplikasi produksi.
  2. Di sisi lain, container dapat berjalan dengan kebutuhan CPU dan memori yang sangat minim. Selain itu, Anda bahkan dapat menjalankan beberapa wadah di dalam VM untuk pemisahan aplikasi. Selain itu, mengubah ukuran penampung membutuhkan waktu beberapa detik.

Penyediaan &Penerapan

  1. Menyediakan VM dan menerapkan aplikasi di dalamnya mungkin memerlukan waktu beberapa menit hingga berjam-jam, bergantung pada alur kerja yang terlibat. Bahkan rollback membutuhkan waktu.
  2. Tetapi Anda dapat menerapkan penampung dalam hitungan detik dan memutarnya kembali dalam hitungan detik juga.

Manajemen Drift

  1. Manajemen drift di VM tidak mudah. Anda harus memiliki otomatisasi dan proses yang lengkap untuk memastikan semua lingkungan serupa. Mengikuti model penerapan yang tidak dapat diubah menghindari penyimpangan di lingkungan VM.
  2. Setelah dicadangkan, gambar akan sama di semua lingkungan untuk container. Jadi untuk perubahan apa pun, Anda harus mulai membuat perubahan di dev env dan membuat ulang image container.

FAQ Docker

Apa perbedaan containerd &runc?

containerd bertanggung jawab untuk mengelola container dan runc bertanggung jawab untuk menjalankan container (membuat namespace, cgroup, dan menjalankan perintah di dalam container) dengan input dari containerd

Apa perbedaan antara mesin Docker &daemon Docker?

Mesin Docker terdiri dari daemon buruh pelabuhan, antarmuka istirahat, dan CLI buruh pelabuhan. Daemon Docker adalah layanan dockerd systemd yang bertanggung jawab untuk membangun image buruh pelabuhan dan mengirimkan instruksi buruh pelabuhan ke runtime containerd.


Docker
  1. Apa itu Server Web, dan Bagaimana Cara Kerja Server Web?

  2. Apa itu containerd, Dan Bagaimana Hubungannya dengan Docker dan Kubernetes?

  3. Cara Menetapkan IP Statis ke Wadah Docker

  1. Cara Mendaftar Kontainer Docker

  2. Apa itu DNS dan Bagaimana Cara Kerjanya?

  3. Bagaimana rm bekerja? Apa yang rm lakukan?

  1. Apa itu NGINX? Bagaimana cara kerjanya?

  2. Cara Menjalankan MySQL Dalam Wadah Docker

  3. Cara SSH Ke Wadah Docker