Docker mengasingkan sumber: 1. Sistem fail 3. Komunikasi antara proses 4. Pengguna dan kumpulan pengguna untuk kebenaran 5. PID dan hos dalam proses PID; nama, dsb.
Persekitaran pengendalian tutorial ini: sistem linux5.9.8, versi docker-1.13.1, komputer Dell G3.
Intipati bekas docker ialah proses pada mesin hos.
Docker mencapai pengasingan sumber melalui ruang nama, pengehadan sumber melalui cgroup dan kecekapan tinggi melalui operasi fail *copy-on-write*.
Mekanisme ruang nama menyediakan penyelesaian pengasingan sumber.
PID, IPC, Rangkaian dan sumber sistem lain tidak lagi global, tetapi tergolong dalam Ruang Nama tertentu.
Sumber di bawah setiap ruang nama berkaitan dengan sumber di bawah ruang nama lain yang Telus, tidak kelihatan .
Salah satu tujuan utama ruang nama melaksanakan kernel Linux adalah untuk melaksanakan perkhidmatan (bekas) ringan Proses dalam ruang nama yang sama boleh melihat perubahan satu sama lain dan tidak tahu apa-apa tentang proses luaran.
Apakah ruang nama yang boleh diasingkan
Agar bekas tidak mengganggu bekas lain, ia perlu dapat:
Sistem fail perlu diasingkan
Rangkaian juga perlu diasingkan
Antara-proses komunikasi juga perlu diasingkan
Pengguna dan kumpulan pengguna juga perlu diasingkan untuk mendapatkan kebenaran
PID dalam proses juga perlu diasingkan daripada PID dalam hos
Bekas juga mesti mempunyai nama hos mereka sendiri
Dengan pengasingan di atas, kami percaya bahawa bekas boleh diasingkan daripada perumah dan bekas lain.
Kebetulan ruang nama Linux boleh melakukan ini.
namespace | 隔离内容 | 系统调用参数 |
---|---|---|
UTS | 主机名与域名 | CLONE_NEWUTS |
IPC | 信号量、消息队列和共享内存 | CLONE_NEWIPC |
Network | 网络设备、网络栈、端口等 | CLONE_NEWNET |
PID | 进程编号 | CLONE_NEWPID |
Mount | 挂载点(文件系统) | CLONE_NEWNS |
User | 用户和用户组 | CLONE_NEWUSER |
Ruang nama UTS
Ruang nama UTS (Sistem perkongsian MASA UNIX) menyediakan pengasingan nama hos dan domain, supaya setiap bekas Docker boleh mempunyai nama hos dan nama domain bebas, dalam rangkaian boleh dilihat sebagai nod bebas dan bukannya proses pada mesin hos.
Dalam Docker, setiap imej pada asasnya dinamakan nama hos selepas nama perkhidmatan yang diberikannya dan tidak akan memberi kesan kepada hos.
Ruang nama IPC
Sumber IPC yang direka untuk Komunikasi Antara Proses (IPC) termasuk semafor biasa, baris gilir mesej dan memori dikongsi.
Apabila memohon sumber IPC, anda memohon ID 32-bit yang unik secara global.
Ruang nama IPC mengandungi pengecam IPC sistem dan sistem fail yang melaksanakan baris gilir mesej POSIX.
Proses dalam ruang nama IPC yang sama boleh dilihat antara satu sama lain, tetapi proses dalam ruang nama yang berbeza tidak kelihatan antara satu sama lain.
Ruang nama PID
Pengasingan ruang nama PID sangat praktikal, ia menomborkan semula proses PID, iaitu, dua proses di bawah ruang nama yang berbeza boleh mempunyai PID yang sama, setiap satu Ruang nama PID mempunyai prosedur pengiraan sendiri.
Kernel mengekalkan struktur pokok untuk semua ruang nama PID Yang paling atas dicipta apabila sistem dimulakan dan dipanggil ruang nama akar. Ruang nama PID yang baru dibuat dipanggil ruang nama kanak-kanak, dan ruang nama PID asal ialah ruang nama kanak-kanak bagi ruang nama PID yang baru dibuat, dan ruang nama PID asal ialah ruang nama induk bagi ruang nama PID yang baru dibuat.
Dengan cara ini, ruang nama PID yang berbeza akan membentuk sistem hierarki Nod induk yang dimilikinya boleh melihat proses dalam nod anak dan boleh menjejaskan proses dalam nod anak melalui isyarat dan kaedah lain. Walau bagaimanapun, nod anak tidak dapat melihat apa-apa dalam ruang nama PID nod induk.
ruang nama lekapkan
ruang nama lekapkan menyediakan sokongan untuk mengasingkan sistem fail melalui mata lekap sistem fail yang diasingkan.
Selepas pengasingan, perubahan dalam struktur fail dalam ruang nama pelekap yang berbeza tidak akan menjejaskan satu sama lain.
ruang nama rangkaian
Ruang nama rangkaian terutamanya menyediakan pengasingan sumber rangkaian, termasuk peralatan rangkaian, IPv4, timbunan protokol IPv6, jadual penghalaan IP, tembok api, /proc/ direktori bersih , /sys/class/net direktori, soket, dsb.
ruang nama pengguna
ruang nama pengguna mengasingkan pengecam dan atribut berkaitan pemasangan
operasi ruang nama
API ruang nama termasuk clone() setns() unshare() dan beberapa fail di bawah /proc
Untuk menentukan ruang nama yang diasingkan, anda perlu menentukan satu atau lebih daripada 6 parameter berikut yang diasingkan oleh | 6 parameter ialah CLONE_NEWUTS, CLONE_NEWIPC, CLONE_NEWPID, CLONE_NEWNET, CLONE_NEWUSER yang dinyatakan dalam jadual di atas Proses ialah pendekatan yang paling biasa dan cara paling asas untuk Docker menggunakan ruang nama.
clone() ialah pelaksanaan yang lebih umum bagi fork() panggilan sistem Linux Anda boleh mengawal bilangan fungsi yang digunakan melalui bendera. Terdapat lebih daripada 20 jenis bendera CLONE_*, yang mengawal semua aspek proses klon.
child_func diluluskan dalam fungsi utama program yang dijalankan oleh proses kanak-kanakint clone(int(*child_func)(void *),void *child_stack,int flags, void *arg);
child_stack diluluskan dalam ruang tindanan yang digunakan oleh proses kanak-kanak
Nombor ruang nama dalam kurungan segi empat sama
ls -l /proc/10/ns
Jika nombor ruang nama yang ditunjuk oleh dua proses adalah sama, maka ia berada dalam yang sama Tujuan menetapkan pautan dalam ruang nama
ialah walaupun semua proses di bawah ruang nama ini telah tamat, ruang nama ini akan sentiasa wujud dan proses seterusnya boleh bergabung. Memasang fail direktori /proc/[pid]/ns menggunakan kaedah --bind juga boleh berfungsi sebagai pautan
touch ~/utsmount --bind /proc/10/ns/uts ~/uts
Biasanya untuk tidak menjejaskan pemanggil proses dan untuk menjadikan ruang nama pid yang baru ditambah berkuat kuasa, proses itu akan ditambah dalam setns() Selepas fungsi dilaksanakan, gunakan clone() untuk mencipta proses anak untuk terus melaksanakan arahan dan biarkan proses asal tamat berjalan.
Untuk menggunakan ruang nama yang baru ditambah, adalah perlu untuk memperkenalkan siri execve() fungsi ini boleh melaksanakan perintah pengguna Yang paling biasa digunakan ialah memanggil /bin /bash dan terima parameter
nyahkongsi()
int setns(int fd, in nstype); #fd 表示要加入namespace的文件描述符。是一个指向/proc/[pid]/ns目录的文件描述符,打开目录链接可以获得 #nstype 调用者可以检查fd指向的namespace类型是否符合实际要求,该参数为0则不检查
Pengasingan ruang nama pada proses asal melalui nyahkongsi()
Nyahkongsi sangat serupa dengan Nyahkongsi tidak perlu untuk memulakan proses baru, ia boleh dilakukan pada proses asal untuk digunakan.docker tidak menggunakan
panggilan sistem fork()
fork bukan milik API ruang nama
cgroup ialah mekanisme yang disediakan oleh kernel Linux Mekanisme ini boleh menyepadukan (atau memisahkan) satu siri tugasan sistem dan subtugasnya ke dalam sumber hierarki yang berbeza mengikut keperluan , dengan itu menyediakan rangka kerja bersatu untuk pengurusan sumber sistem.
cgroups ialah satu lagi alat kernel yang berkuasa dalam Linux Dengan cgroups, anda bukan sahaja boleh mengehadkan sumber yang diasingkan mengikut ruang nama, tetapi juga menetapkan pemberat untuk sumber, mengira penggunaan dan mengawal permulaan tugas (proses atau daerah). Berhenti dan tunggu. Secara terang-terangan: cgroups boleh mengehadkan dan merekodkan sumber fizikal (termasuk CPU, Memori, IO, dsb.) yang digunakan oleh kumpulan tugas Ia merupakan asas membina satu siri alatan pengurusan virtualisasi seperti Docker.
Peranan cgroup
cgroups menyediakan antara muka bersatu untuk pengurusan sumber pada peringkat pengguna yang berbeza, daripada kawalan sumber individu kepada peringkat sistem pengendalian Untuk virtualisasi, cgroups menyediakan empat fungsi utama.
Pembelajaran yang disyorkan: "tutorial video buruh pelabuhan"
Atas ialah kandungan terperinci Pekerja pelabuhan sumber mana yang diasingkan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!