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.