Docker, apa itu dan apa tujuannya

111

Saya pernah mendengar tentang Docker beberapa hari yang lalu dan ingin menyeberanginya.

Tapi nyatanya, saya tidak tahu apa tujuan dari "wadah" ini?

Apa itu wadah?

Bisakah itu menggantikan mesin virtual yang didedikasikan untuk pengembangan?

Apa tujuan, dengan kata sederhana, menggunakan Docker di perusahaan? Keuntungan utama?

mfrachet.dll
sumber
Saya merasa lebih mudah shivab.com/blog/docker/2019/01/10/…
illusionist

Jawaban:

116

VM: Menggunakan perangkat lunak VM, misalnya, Ubuntu dapat diinstal di dalam Windows. Dan mereka berdua akan lari pada saat bersamaan. Ini seperti membangun PC, dengan komponen intinya seperti CPU, RAM, Disk, Kartu Jaringan dll, di dalam sistem operasi dan merakitnya agar berfungsi seolah-olah itu adalah PC nyata. Dengan cara ini, PC virtual menjadi "tamu" di dalam PC sebenarnya yang dengan sistem operasinya, yang disebut host.

Penampung: Ini sama seperti di atas tetapi alih-alih menggunakan seluruh sistem operasi, ia memotong komponen "yang tidak perlu" dari OS virtual untuk membuat versi minimalnya. Ini mengarah pada pembuatan LXC (Linux Containers). Ini lebih cepat dari Mesin VM.

Docker: Kontainer buruh pelabuhan, tidak seperti mesin virtual dan kontainer, tidak memerlukan atau menyertakan sistem operasi terpisah. Sebaliknya, ini bergantung pada fungsionalitas kernel Linux dan menggunakan isolasi sumber daya.
Tujuan Docker: Fokus utamanya adalah untuk mengotomatiskan penerapan aplikasi di dalam wadah perangkat lunak dan otomatisasi virtualisasi tingkat sistem operasi di Linux. Ini lebih ringan dari Container standar dan boot dalam hitungan detik. ggg

(Perhatikan bahwa tidak ada OS Tamu yang diperlukan dalam kasus Docker)

JerryGoyal
sumber
1
Saya mencoba mencari sumber daya terkait alur kerja pengembangan-penerapan buruh pelabuhan tetapi sepertinya saya tidak dapat menemukan apa pun. Mari kita beri contoh saya memiliki lingkungan lampp dengan laravel + angular4. Apakah saya membagikan file tertentu kepada rekan satu tim saya? Bagaimana cara mengedit sumber aplikasi (php html js / ts) jika saya memasukkannya ke dalam wadah? Bisakah kita tetap menggunakan git / svn pada kode sumber kita?
anaval
13
VM adalah singkatan dari "Mesin virtual". Tidak perlu menyebutnya "Mesin VM" karena kemudian menjadi "Mesin mesin virtual". :)
Dzhuneyt
32

[Catatan, jawaban ini berfokus pada wadah Linux dan mungkin tidak sepenuhnya berlaku untuk sistem operasi lain. ]

Apa itu wadah?

Ini adalah Aplikasi : Penampung adalah cara untuk menjalankan aplikasi yang diisolasi satu sama lain. Daripada memvirtualisasikan perangkat keras untuk menjalankan beberapa sistem operasi, container mengandalkan virtualisasi sistem operasi untuk menjalankan banyak aplikasi. Artinya, Anda dapat menjalankan lebih banyak container pada perangkat keras yang sama daripada VM karena Anda hanya memiliki satu salinan OS yang berjalan, dan Anda tidak perlu mengalokasikan memori dan inti CPU untuk setiap instance aplikasi Anda. Sama seperti aplikasi lain, ketika sebuah container membutuhkan CPU atau Memori, ia mengalokasikannya, dan kemudian membebaskannya setelah selesai, memungkinkan aplikasi lain untuk menggunakan sumber daya terbatas yang sama nanti.

Mereka memanfaatkan ruang nama kernel : Setiap penampung secara default akan menerima lingkungan dengan ruang nama berikut ini:

  • Mount: filesystems, /di penampung akan berbeda dengan /di host.
  • PID: id proses, pid 1 dalam wadah adalah aplikasi yang Anda luncurkan, pid ini akan berbeda jika dilihat dari host.
  • Jaringan: kontainer berjalan dengan antarmuka loopbacknya sendiri (127.0.0.1) dan IP pribadi secara default. Docker menggunakan teknologi seperti jaringan jembatan Linux untuk menghubungkan banyak kontainer bersama dalam lan pribadinya sendiri.
  • IPC: komunikasi antarproses
  • UTS: ini termasuk nama host
  • Pengguna: Anda dapat secara opsional menggeser semua id pengguna yang akan diimbangi dari host

Masing-masing ruang nama ini juga mencegah penampung melihat hal-hal seperti sistem file atau proses pada host, atau di penampung lain, kecuali Anda secara eksplisit menghapus isolasi tersebut.

Dan alat keamanan linux lainnya : Container juga memanfaatkan fitur keamanan lain seperti SELinux, AppArmor, Capabilities, dan Seccomp untuk membatasi pengguna di dalam container, termasuk pengguna root, agar tidak dapat keluar dari container atau berdampak negatif pada host.

Kemas aplikasi Anda dengan dependensinya untuk portabilitas : Mengemas aplikasi ke dalam container melibatkan perakitan tidak hanya aplikasi itu sendiri, tetapi semua dependensi yang diperlukan untuk menjalankan aplikasi itu, menjadi gambar portabel. Gambar ini adalah sistem file dasar yang digunakan untuk membuat wadah. Karena kami hanya mengisolasi aplikasi, sistem file ini tidak menyertakan kernel dan utilitas OS lain yang diperlukan untuk memvirtualisasikan seluruh sistem operasi. Oleh karena itu, gambar untuk penampung harus jauh lebih kecil daripada gambar untuk mesin virtual yang setara, membuatnya lebih cepat untuk diterapkan ke node di seluruh jaringan. Hasilnya, container telah menjadi pilihan populer untuk menerapkan aplikasi ke cloud dan pusat data jarak jauh.

Bisakah itu menggantikan mesin virtual yang didedikasikan untuk pengembangan?

Itu tergantung : Jika lingkungan pengembangan Anda menjalankan Linux, dan Anda juga tidak memerlukan akses ke perangkat keras, atau memiliki akses langsung ke perangkat keras fisik dapat diterima, maka Anda akan menemukan migrasi ke wadah Linux cukup mudah. Target ideal untuk kontainer buruh pelabuhan adalah aplikasi seperti API berbasis web (misalnya aplikasi REST), yang Anda akses melalui jaringan.

Apa tujuan, dengan kata sederhana, menggunakan Docker di perusahaan? Keuntungan utama ?

Dev atau Ops : Docker biasanya dibawa ke lingkungan di salah satu dari dua jalur. Pengembang mencari cara untuk mengembangkan dan menguji aplikasi mereka secara lebih cepat, dan operasi yang ingin menjalankan lebih banyak beban kerja pada perangkat keras yang lebih sedikit daripada yang dapat dilakukan dengan mesin virtual.

Atau Devops : Salah satu target ideal adalah memanfaatkan Docker dengan segera dari alat penerapan CI / CD, mengompilasi aplikasi dan segera membuat image yang digunakan untuk pengembangan, CI, prod, dll. Container sering kali mengurangi waktu untuk memindahkan aplikasi dari kode check-in hingga tersedia untuk pengujian, membuat pengembang lebih efisien. Dan jika dirancang dengan benar, gambar yang sama yang telah diuji dan disetujui oleh pengembang dan alat CI dapat digunakan dalam produksi. Karena gambar tersebut mencakup semua dependensi aplikasi, risiko kerusakan dalam produksi yang bekerja dalam pengembangan berkurang secara signifikan.

Skalabilitas : Satu manfaat utama terakhir dari container yang akan saya sebutkan adalah bahwa container dirancang untuk skalabilitas horizontal. Saat Anda memiliki aplikasi stateless dengan beban berat, penampung jauh lebih mudah dan lebih cepat untuk diskalakan karena ukuran gambarnya yang lebih kecil dan overhead yang berkurang. Karena alasan ini, Anda melihat kontainer digunakan oleh banyak perusahaan berbasis web yang lebih besar, seperti Google dan Netflix.

BMitch
sumber
2
+1 Saya sepenuhnya setuju dengan jawaban Anda, terutama dengan bagian "dapatkah itu menggantikan mesin virtual". Saya melihat banyak komentar di tempat lain yang menekankan bahwa Docker bukanlah Mesin Virtual, tetapi, dari pengalaman, untuk banyak kasus penggunaan, ini berfungsi dengan baik atau bahkan merupakan alternatif yang lebih baik. Apa yang Anda maksud ketika Anda mengatakan "dapat diterima untuk memiliki akses langsung ke perangkat keras fisik"?
Tyress
2
@tyress jika host Anda adalah Linux, Anda dapat memasang perangkat langsung ke wadah Linux. Saya telah melihatnya selesai dengan perangkat suara, tetapi apa pun di / dev dapat ditambahkan. Ini mengabaikan beberapa isolasi penampung, tetapi masuk akal untuk tugas-tugas tertentu seperti aplikasi desktop.
BMitch
Itu mengagumkan. Saya tidak memikirkan itu.
Tyress
@BMitch: jawaban yang sangat bersih dan elegan, terima kasih !! Saya rasa sekarang saya dapat memvisualisasikan apa itu kontainer .. namun, akan lebih bagus jika Anda dapat memperbarui jawaban Anda dengan bagaimana kontainer terkait dengan buruh pelabuhan? Dalam perbandingan container dan VM, apakah buruh pelabuhan setara dengan hypervisor?
rahulaga_dev
1
Docker adalah alat yang mengimplementasikan kontainer, bersama dengan menyediakan ekosistem lain yang dibutuhkan seperti registri di hub buruh pelabuhan dan lingkungan desktop yang menyematkan VM untuk menjalankan kontainer Linux.
BMitch
6

Pertanyaan yang sama muncul di kepala saya beberapa hari yang lalu dan apa yang saya temukan setelah membahasnya, mari kita pahami dengan kata-kata yang sangat sederhana.

Mengapa orang akan berpikir tentang buruh pelabuhan dan kontainer ketika semuanya tampak baik-baik saja dengan proses arsitektur dan pengembangan aplikasi saat ini !!

Mari kita ambil contoh bahwa kita sedang mengembangkan aplikasi menggunakan layanan nodeJs, MongoDB, Redis, RabbitMQ dll [Anda dapat memikirkan layanan lainnya].

Sekarang kita menghadapi hal-hal berikut ini sebagai masalah dalam pengembangan aplikasi dan proses pengiriman jika kita melupakan keberadaan buruh pelabuhan atau alternatif lain dari aplikasi containerizing.

  1. Kompatibilitas layanan (nodeJs, mongoDB, Redis, RabbitMQ dll.) Dengan OS (bahkan setelah menemukan versi yang kompatibel dengan OS, jika terjadi sesuatu yang tidak terduga terkait dengan versi, maka kita perlu melihat kembali kompatibilitas tersebut dan memperbaikinya).

  2. Jika dua komponen sistem memerlukan pustaka / ketergantungan dengan versi berbeda dalam aplikasi di OS (Itu perlu relook setiap kali jika terjadi perilaku aplikasi yang tidak terduga karena masalah versi pustaka dan ketergantungan).

  3. Yang terpenting, Jika orang baru bergabung dengan tim, kami merasa sangat sulit untuk mengatur lingkungan baru, orang harus mengikuti serangkaian besar instruksi dan menjalankan ratusan perintah untuk akhirnya mengatur lingkungan Dan itu membutuhkan waktu dan usaha.

    Orang-orang harus memastikan bahwa mereka menggunakan versi OS yang benar dan memeriksa kompatibilitas layanan dengan OS. Dan setiap pengembang harus mengikuti ini setiap kali saat menyiapkan.

  4. Kami juga memiliki lingkungan yang berbeda seperti dev, pengujian, dan produksi . Jika Satu pengembang merasa nyaman menggunakan satu OS dan lainnya merasa nyaman dengan OS lain Dan dalam hal ini, kami tidak dapat menjamin bahwa aplikasi kami akan berperilaku dengan cara yang sama dalam dua situasi berbeda ini .

Semua ini membuat hidup kita sulit dalam proses pengembangan , pengujian dan pengiriman aplikasi.

Jadi kami membutuhkan sesuatu yang menangani masalah kompatibilitas dan memungkinkan kami membuat perubahan dan modifikasi pada komponen sistem apa pun tanpa memengaruhi komponen lain.

Sekarang kita berpikir tentang buruh pelabuhan karena tujuannya adalah untuk mengemas aplikasi dan mengotomatiskan penerapan aplikasi dan mengirimkannya dengan sangat mudah.

masukkan deskripsi gambar di sini

Bagaimana buruh pelabuhan memecahkan masalah di atas-

  1. Kita dapat menjalankan setiap komponen layanan (nodeJs, MongoDB, Redis, RabbitMQ) dalam wadah yang berbeda dengan dependensi dan pustaka sendiri di OS yang sama tetapi dengan lingkungan yang berbeda.

  2. Kita hanya perlu menjalankan konfigurasi buruh pelabuhan sekali saja sehingga semua pengembang tim kita dapat memulai dengan perintah jalankan buruh pelabuhan sederhana, kita telah menghemat banyak waktu dan tenaga di sini :) .

Jadi kontainer adalah lingkungan yang terisolasi dengan semua dependensi dan pustaka yang digabungkan dengan proses dan antarmuka jaringan serta pemasangannya sendiri .

Semua kontainer menggunakan sumber daya OS yang sama sehingga membutuhkan lebih sedikit waktu untuk boot dan menggunakan CPU secara efisien dengan biaya perangkat keras yang lebih sedikit.

Saya harap ini bisa membantu.

Siyaram Malav
sumber
2

Izinkan saya mencoba memberikan jawaban sesederhana mungkin:

Tapi nyatanya, saya tidak tahu apa tujuan dari "wadah" ini?

Apa itu wadah?

Sederhananya: paket yang berisi perangkat lunak . Lebih khusus lagi, aplikasi dan semua dependensinya digabungkan. Lingkungan aplikasi reguler dan non-docker terhubung langsung ke OS, sedangkan container Docker adalah lapisan abstraksi OS.

Dan penampung berbeda dari gambar karena penampung adalah contoh runtime dari sebuah gambar - mirip dengan bagaimana objek adalah contoh runtime kelas jika Anda terbiasa dengan OOP.

Bisakah itu menggantikan mesin virtual yang didedikasikan untuk pengembangan?

Container VM dan Docker adalah teknik virtualisasi, yang menyediakan abstraksi di atas infrastruktur sistem.

VM menjalankan sistem operasi "tamu" penuh dengan akses virtual ke sumber daya host melalui hypervisor. Ini berarti bahwa VM sering menyediakan lingkungan dengan lebih banyak sumber daya daripada yang sebenarnya dibutuhkan. Secara umum, VM menyediakan lingkungan dengan lebih banyak sumber daya daripada yang dibutuhkan sebagian besar aplikasi. Oleh karena itu, wadah adalah teknik yang lebih ringan. Keduanya memecahkan masalah yang berbeda.

Apa tujuan, dengan kata sederhana, menggunakan Docker di perusahaan? Keuntungan utama?

Kontainerisasi berjalan seiring dengan layanan mikro. Layanan yang lebih kecil yang membentuk aplikasi yang lebih besar sering kali diuji dan dijalankan di kontainer Docker. Ini membuat pengujian berkelanjutan lebih mudah.

Selain itu, karena container Docker bersifat read-only, mereka menerapkan prinsip utama DevOps: layanan produksi harus tetap tidak berubah

Beberapa manfaat umum menggunakannya:

  • Isolasi layanan yang bagus
  • Kemudahan pengelolaan karena container berisi semua yang dibutuhkan aplikasi
  • Enkapsulasi teknologi implementasi (dalam wadah)
  • Pemanfaatan sumber daya yang efisien (karena virtualisasi os yang ringan) dibandingkan dengan VM
  • Penerapan cepat
Joel H.
sumber