GNU/Linux >> Belajar Linux >  >> Linux

Demystifying namespace dan container di Linux

Kontainer telah mengambil dunia dengan badai. Apakah Anda memikirkan Kubernetes, Docker, CoreOS, Silverblue, atau Flatpak ketika Anda mendengar istilah tersebut, jelas bahwa aplikasi modern berjalan dalam container untuk kenyamanan, keamanan, dan skalabilitas.

Wadah bisa membingungkan untuk dipahami. Apa artinya berlari dalam wadah? Bagaimana proses dalam wadah dapat berinteraksi dengan komputer lain yang mereka jalankan? Open source tidak menyukai misteri, jadi artikel ini menjelaskan backend teknologi container, sama seperti artikel saya di Flatpak menjelaskan frontend umum.

Ruang nama

Namespace adalah hal yang umum di dunia pemrograman. Jika Anda tinggal di tempat-tempat yang sangat teknis di dunia komputer, maka Anda mungkin pernah melihat kode seperti ini:

using namespace std;

Atau Anda mungkin pernah melihat ini dalam XML:

<book xmlns="http://docbook.org/ns/docbook" xml:lang="en">

Jenis frasa ini memberikan konteks untuk perintah yang digunakan nanti dalam file kode sumber. Satu-satunya alasan C++ mengetahui, misalnya, apa yang dimaksud programmer ketika mereka mengetik cout adalah karena C++ mengetahui cout namespace adalah kata yang bermakna.

Wadah Linux

  • Apa itu container Linux?
  • Pengantar terminologi wadah
  • Unduh:Containers Primer
  • Operator Kubernetes:Mengotomatiskan platform orkestrasi container
  • eBook:Pola Kubernetes untuk mendesain aplikasi cloud-native
  • Apa itu Kubernetes?

Jika itu terlalu teknis untuk Anda bayangkan, Anda mungkin terkejut mengetahui bahwa kita semua juga menggunakan ruang nama setiap hari dalam kehidupan nyata. Kami tidak menyebutnya ruang nama, tetapi kami menggunakan konsep tersebut sepanjang waktu. Misalnya, frasa "Saya penggemar Perusahaan" memiliki satu arti dalam perusahaan TI yang melayani bisnis besar (yang biasa disebut "perusahaan"), tetapi mungkin memiliki arti yang berbeda di konvensi fiksi ilmiah. Pertanyaan "mesin apa yang sedang berjalan?" memiliki satu arti di garasi dan arti yang berbeda dalam pengembangan web. Kita tidak selalu mendeklarasikan namespace dalam percakapan biasa karena kita manusia, dan otak kita dapat beradaptasi dengan cepat untuk menentukan konteks, tetapi untuk komputer, namespace harus dideklarasikan secara eksplisit.

Untuk container, namespace adalah yang mendefinisikan batas-batas "kesadaran" proses tentang apa lagi yang berjalan di sekitarnya.

lsns

Anda mungkin tidak menyadarinya, tetapi mesin Linux Anda secara diam-diam mempertahankan ruang nama berbeda yang spesifik untuk proses tertentu. Dengan menggunakan versi terbaru util-linux paket, Anda dapat membuat daftar ruang nama yang ada di mesin Anda:

$ lsns
        NS TYPE   NPROCS   PID USER    COMMAND
4026531835 cgroup     85  1571 seth /usr/lib/systemd/systemd --user
4026531836 pid        85  1571 seth /usr/lib/systemd/systemd --user
4026531837 user       80  1571 seth /usr/lib/systemd/systemd --user
4026532601 user        1  6266 seth /usr/lib64/firefox/firefox [...]
4026532928 net         1  7164 seth /usr/lib64/firefox/firefox [...]
[...]

Jika versi util-linux . Anda tidak menyediakan lsns perintah, Anda dapat melihat entri namespace di /proc :

$ ls /proc/*/ns
1571
6266
7164
[...]
$ ls /proc/6266/ns
ipc net pid user uts [...]

Setiap proses yang berjalan di mesin Linux Anda dihitung dengan ID proses (PID). Setiap PID diberi namespace. PID dalam namespace yang sama dapat memiliki akses satu sama lain karena mereka diprogram untuk beroperasi dalam namespace yang diberikan. PID di ruang nama yang berbeda tidak dapat berinteraksi satu sama lain secara default karena mereka berjalan dalam konteks yang berbeda, atau ruang nama . Inilah sebabnya mengapa proses yang berjalan di "wadah" di bawah satu namespace tidak dapat mengakses informasi di luar wadahnya atau informasi yang berjalan di dalam wadah yang berbeda.

Membuat ruang nama baru

Fitur biasa dari perangkat lunak yang menangani container adalah manajemen namespace otomatis. Administrator manusia yang memulai aplikasi atau lingkungan kemas baru tidak harus menggunakan lsns untuk memeriksa ruang nama mana yang ada dan kemudian membuat yang baru secara manual; perangkat lunak yang menggunakan ruang nama PID melakukannya secara otomatis dengan bantuan kernel Linux. Namun, Anda dapat meniru prosesnya secara manual untuk mendapatkan pemahaman yang lebih baik tentang apa yang terjadi di balik layar.

Pertama, Anda perlu mengidentifikasi proses yang tidak berjalan di komputer Anda. Untuk contoh ini, saya akan menggunakan shell Z (Zsh) karena saya menjalankan shell Bash di mesin saya. Jika Anda menjalankan Zsh di komputer, gunakan Bash atau tcsh atau shell lain yang sedang tidak Anda jalankan. Tujuannya adalah untuk menemukan sesuatu yang dapat Anda buktikan tidak berjalan. Anda dapat membuktikan ada sesuatu yang tidak berjalan dengan pidof perintah, yang menanyakan sistem Anda untuk menemukan PID aplikasi apa pun yang Anda beri nama:

$ pidof zsh
$ sudo pidof zsh

Selama tidak ada PID yang dikembalikan, aplikasi yang Anda tanyakan tidak berjalan.

Batalkan pembagian

berhenti berbagi perintah menjalankan program di namespace tidak dibagikan dari proses induknya. Ada banyak jenis ruang nama yang tersedia, jadi bacalah berhenti berbagi halaman manual untuk semua opsi yang tersedia.

Untuk membuat namespace baru untuk perintah pengujian Anda:

$ sudo unshare --fork --pid --mount-proc zsh
%

Karena Zsh adalah shell interaktif, Zsh dengan mudah membawa Anda ke namespace-nya saat diluncurkan. Tidak semua proses melakukan itu, karena beberapa proses berjalan di latar belakang, meninggalkan Anda pada prompt di namespace aslinya. Selama Anda tetap berada di sesi Zsh, Anda dapat melihat bahwa Anda telah meninggalkan namespace biasa dengan melihat PID dari proses bercabang baru Anda:

% pidof zsh
pid 1

Jika Anda mengetahui sesuatu tentang ID proses Linux, maka Anda tahu bahwa PID 1 selalu dicadangkan, sebagian besar berdasarkan proses booting, untuk aplikasi inisialisasi (systemd pada sebagian besar distribusi di luar Slackware, Devuan, dan mungkin beberapa instalasi khusus Arch) . Hampir tidak mungkin bagi Zsh, atau aplikasi apa pun yang bukan aplikasi inisialisasi boot, untuk menjadi PID 1 (karena tanpa sistem init, komputer tidak akan tahu cara boot). Namun, sejauh shell Anda tahu dalam demonstrasi ini, Zsh menempati slot PID 1.

Terlepas dari apa yang dikatakan shell Anda sekarang, PID 1 di sistem Anda tidak telah diganti. Buka terminal kedua atau tab terminal di komputer Anda dan lihat PID 1:

$ ps 1
init

Dan kemudian temukan PID dari Zsh:

$ pidof zsh
7723

Seperti yang Anda lihat, sistem "host" Anda melihat gambaran besar dan memahami bahwa Zsh sebenarnya berjalan sebagai beberapa PID bernomor tinggi (mungkin tidak akan menjadi 7723 di komputer Anda, kecuali secara kebetulan). Zsh melihat dirinya sebagai PID 1 hanya karena cakupannya terbatas pada (atau terkandung dalam) namespace-nya. Setelah Anda memasukkan proses ke dalam namespacenya sendiri, proses turunannya diberi nomor mulai dari 1, tetapi hanya di dalam namespace tersebut.

Namespace, bersama dengan teknologi lain seperti cgroups dan banyak lagi, membentuk dasar containerisasi. Memahami bahwa namespace ada dalam konteks namespace yang lebih luas dari lingkungan host (dalam demonstrasi ini, itu adalah komputer Anda, tetapi di dunia nyata host biasanya server atau hybrid cloud) dapat membantu Anda memahami bagaimana dan mengapa aplikasi dalam container bertindak cara yang mereka lakukan. Misalnya, wadah yang menjalankan blog Wordpress tidak "tahu" bahwa itu tidak berjalan dalam wadah; ia tahu bahwa ia memiliki akses ke kernel dan beberapa RAM dan file konfigurasi apa pun yang Anda berikan, tetapi ia mungkin tidak dapat mengakses direktori home Anda atau direktori mana pun yang tidak secara khusus Anda beri izin untuk mengaksesnya. Selain itu, proses runaway di dalam perangkat lunak blog tersebut tidak dapat memengaruhi proses lain di sistem Anda, karena sejauh yang diketahui, "pohon" PID hanya kembali ke 1, dan 1 adalah wadah yang menjalankannya.

Container adalah fitur Linux yang kuat, dan semakin populer setiap hari. Sekarang setelah Anda memahami cara kerjanya, coba jelajahi teknologi container seperti Kubernetes, Silverblue, atau Flatpak, dan lihat apa yang dapat Anda lakukan dengan aplikasi container. Container adalah Linux, jadi mulailah, periksa dengan cermat, dan pelajari sambil jalan.


Linux
  1. Apa Itu Podman Dan Bagaimana Cara Menginstal Podman Di Linux

  2. Apa perbedaan antara wadah Linux dan gambar?

  3. Linux – Sysfs dan Devtmpfs?

  1. Ruang Nama Linux

  2. Apa itu Docker (dan wadah Linux?)

  3. Linux – Kernel:Dukungan Namespaces?

  1. Linux – Bagaimana Cara Mendaftar Namespace Di Linux?

  2. Linux – Apa itu Namespace Uts?

  3. Cara Membuat dan Meluncurkan Kontainer Linux LXC dengan Perintah LXC