OS docker container: lalu apa bedanya dengan VM?

10

Apa gunanya menggunakan OS dalam wadah buruh pelabuhan?

Dalam repositori buruh pelabuhan, Anda menemukan gambar buruh pelabuhan Ubuntu: https://registry.hub.docker.com/_/ubuntu/ Saya pikir Docker lebih pada level "app".

Lalu apa perbedaan antara wadah buruh pelabuhan Ubuntu dan Mesin Virtual Ubuntu? Jika Anda memiliki seluruh OS dalam wadah buruh pelabuhan, bukankah tidak ada gunanya menggunakan Docker?

Terima kasih

Michael
sumber

Jawaban:

11

Anda tidak memiliki konsep Docker dasar. Ini hal yang sangat berbeda.

Hal pertama yang perlu Anda ketahui adalah filosofi Docker: jalankan satu proses yang diisolasi dalam sebuah wadah. Anda tidak akan menjalankan OS dalam wadah Docker, Anda akan menjalankan proses di dalam wadah dengan konten sistem file root berdasarkan distribusi linux yang Anda pilih. Ubuntu adalah pilihan di antara yang lainnya.

Sekarang Anda harus bertanya-tanya bagaimana mungkin untuk mendapatkan proses yang berjalan di dalam gambar dasar linux berbeda dari distribusi linux yang dijalankan oleh host Anda. Agar OS dapat dijalankan, Anda pada dasarnya membutuhkan:

  • Sistem file boot: berisi bootloader dan kernel yang akan berada di memori setelah dimuat. Kami tidak peduli tentang hal ini dalam hal wadah Docker karena kernel dibagi dengan host dan merupakan bagian umum antara semua distribusi linux.
  • Root filesystem: berisi struktur filesystem. Mungkin berbeda dari satu distribusi linux ke yang lain. Ini hanya-baca sampai urutan booting selesai.

Docker menggunakan UnionFS untuk mengelola lapisan blok disk di dalam wadah sehingga Anda dapat menumpuknya.

Di belakang layar, ia menggunakan union mount yang memungkinkan beberapa sistem file untuk dipasang pada saat yang sama, muncul seperti keseluruhan virtual. Itu sebenarnya menjatuhkan layer gambar dasar sebagai mode baca-tulis di atas sistem file root dasar dalam mode read-only.

Di sini Anda memiliki setumpuk blok disk berlapis sedemikian rupa sehingga distribusi linux dari gambar dasar berasal akan berisi sistem file yang sama sekali diinstal di host nyata, tapi itu di dalam wadah saat ini.

Hal terakhir yang kurang sekarang adalah: bagaimana Anda menjalankan hal ini terisolasi?

Jawabannya adalah: namespaces. Saya tidak akan membahas detailnya di sini karena akan sedikit menyimpang dari pertanyaan awal. Tetapi yang perlu Anda ketahui adalah bahwa sejak kernel 2.4.19, ruang nama dari berbagai jenis telah muncul sepanjang tahun. Saat ini ruang nama berikut tersedia:

  • IPC: namespace IPC (komunikasi antarproses)
  • MNT: mount namespace
  • NET: namespace jaringan
  • PID: pid namespace
  • USER: namespace pengguna (uid)
  • UTS: namespace UTS (nama host)

Namespace adalah struktur terisolasi di dalam kernel yang memungkinkan proses untuk berjalan dengan lingkungan tertentu. Misalnya namespace MNT akan menjadi fitur utama untuk mendapatkan proses yang berjalan dalam kekhususan sistem file root gambar dasar. Namespace NET akan menjadi fitur kunci lain untuk wadah untuk memiliki antarmuka jaringan tertentu untuk berkomunikasi dengan jembatan buruh pelabuhan dll.

Jadi, ya, tujuan utama dari semua ini adalah untuk menjalankan aplikasi yang terisolasi, kirimkan dari lingkungan lokal Anda ke produksi dengan mudah dengan di dalam kotak yang disebut wadah.

Sebaiknya baca dokumentasi buruh pelabuhan sebelum menggali lebih dalam.

Xavier Lucas
sumber
Terima kasih, apakah itu berarti bahwa gambar "Ubuntu" seperti ini: registry.hub.docker.com/_/ubuntu membuat "tidak masuk akal" dengan sendirinya dan berfungsi sebagai dasar untuk wadah yang lebih jelas seperti "wadah nginx"? Saya tidak tahu apakah saya masuk akal?
Michael
Ya Anda lakukan. Itulah tepatnya digunakan untuk apa. Dan biasanya Anda akan mendengar orang menyebutnya gambar dasar karena alasan ini.
Xavier Lucas
Saya telah membaca dokumentasi dan ada satu hal yang saya tidak yakin. Katakanlah ukuran gambar ubuntu adalah 140MB. Kemudian, gambar lain berdasarkan gambar ini menambahkan 10 Mb lebih banyak. Jika saya menjalankan 2 kontainer dari gambar ini, akankah masing-masing kontainer 150 MB dan saya membutuhkan 300 MB ruang disk ATAU ukuran totalnya akan tetap 150 MB? Terima kasih
Michael
Wow, saya baru saja mengunduh gambar python resmi dan ukuran virtualnya adalah 802,4 MB. Butuh beberapa saat untuk mengunduh. Jika saya menjalankan 10 kontainer dari itu, berapa banyak ruang yang akan diambil wadah? Terima kasih
Michael
2
@ Aymikep Beberapa gambar dapat menjadi besar karena ketergantungan tidak dibersihkan dengan benar. Jika Anda memulai 10 wadah dengan gambar yang sama maka itu tidak berarti ruang disk yang digunakan akan 10 kali ukuran gambar. Anda tidak memuat gambar sekali tetapi menjalankannya dari banyak wadah. Docker menggunakan copy-on-write ketika menjalankan beberapa wadah dari gambar yang sama yang pada dasarnya berarti akan berbagi gambar di antara kontainer dan membuat salinan pribadi dari file di dalam gambar hanya jika wadah menambahkan / memodifikasinya. Jadi ukuran sebenarnya yang digunakan terkait dengan aktivitas di dalam wadah, bukan berapa banyak berjalan.
Xavier Lucas