docker 以進(jìn)程為核心, 對(duì)系統(tǒng)資源進(jìn)行隔離使用的管理工具. 隔離是通過 cgroups (control groups 進(jìn)程控制組) 這個(gè)操作系統(tǒng)內(nèi)核特性來實(shí)現(xiàn)的. 包括用戶的參數(shù)限制、 帳戶管理、 資源(CPU,內(nèi)存,磁盤I/O,網(wǎng)絡(luò))使用的隔離等. docker 在運(yùn)行時(shí)可以為容器內(nèi)進(jìn)程指定用戶和組. 沒有指定時(shí)默認(rèn)是 root .但因?yàn)楦綦x的原因, 并不會(huì)因此喪失安全性. 傳統(tǒng)上, 特定的應(yīng)用都以特定的用戶來運(yùn)行, 在容器內(nèi)進(jìn)程指定運(yùn)行程序的所屬用戶或組并不需要在 host 中事先創(chuàng)建.
故城網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
進(jìn)程控制組cgroups主要可能做以下幾件事:
與 cgroups(控制進(jìn)程組) 相關(guān)聯(lián)的概念是 namespaces (命令空間).
命名空間主要有六種名稱隔離類型:
雖然新命名空間與其他同級(jí)對(duì)象隔離, 但其 "父 " 命名空間中的進(jìn)程仍會(huì)看到子命名空間中的所有進(jìn)程 (盡管具有不同的 PID 編號(hào))。
普通用戶 docker run 容器內(nèi) root
如 busybox, 可以在 docker 容器中以 root 身份運(yùn)行軟件. 但 docker 容器本身仍以普通用戶執(zhí)行.
考慮這樣的情況
echo test | docker run -i busybox cat
前面的是當(dāng)前用戶當(dāng)前系統(tǒng)進(jìn)程,后面的轉(zhuǎn)入容器內(nèi)用戶和容器內(nèi)進(jìn)程運(yùn)行.
當(dāng)在容器內(nèi) PID 以1運(yùn)行時(shí), Linux 會(huì)忽略信號(hào)系統(tǒng)的默認(rèn)行為, 進(jìn)程收到 SIGINT 或 SIGTERM 信號(hào)時(shí)不會(huì)退出, 除非你的進(jìn)程為此編碼. 可以通過 Dockerfile STOPSIGNAL signal指定停止信號(hào).
如:
STOPSIGNAL SIGKILL
創(chuàng)建一個(gè) Dockerfile
FROM alpine:latest RUN apk add --update htop && rm -rf /var/cache/apk/* CMD ["htop"]
$ docker build -t myhtop . #構(gòu)建鏡像 $ docker run -it --rm --pid=host myhtop #與 host 進(jìn)程運(yùn)行于同一個(gè)命名空間
普通用戶 docker run 容器內(nèi)指定不同用戶 demo_user
docker run --user=demo_user:group1 --group-add group2 <image_name> <command>
這里的 demo_user 和 group1(主組), group2(副組) 不是主機(jī)的用戶和組, 而是創(chuàng)建容器鏡像時(shí)創(chuàng)建的.
當(dāng)Dockerfile里沒有通過USER指令指定運(yùn)行用戶時(shí), 容器會(huì)以 root 用戶運(yùn)行進(jìn)程.
docker 指定用戶的方式
Dockerfile 中指定用戶運(yùn)行特定的命令
USER <user>[:<group>] #或 USER <UID>[:<GID>]
docker run -u(--user)[user:group] 或 --group-add 參數(shù)方式
$ docker run busybox cat /etc/passwd root:x:0:0:root:/root:/bin/sh ... www-data:x:33:33:www-data:/var/www:/bin/false nobody:x:65534:65534:nobody:/home:/bin/false $ docker run --user www-data busybox id uid=33(www-data) gid=33(www-data)
docker 容器內(nèi)用戶的權(quán)限
對(duì)比以下情況, host 中普通用戶創(chuàng)建的文件, 到 docker 容器下映射成了 root 用戶屬主:
$ mkdir test && touch test/a.txt && cd test $ docker run --rm -it -v `pwd`:/mnt -w /mnt busybox /bin/sh -c 'ls -al /mnt/*' -rw-r--r-- 1 root root 0 Oct 22 15:36 /mnt/a.txt
而在容器內(nèi)卷目錄中創(chuàng)建的文件, 則對(duì)應(yīng) host 當(dāng)前執(zhí)行 docker 的用戶:
$ docker run --rm -it -v `pwd`:/mnt -w /mnt busybox /bin/sh -c 'touch b.txt' $ ls -al -rw-r--r-- 1 xwx staff 0 10 22 23:36 a.txt -rw-r--r-- 1 xwx staff 0 10 22 23:54 b.txt
docker volume 文件訪問權(quán)限
創(chuàng)建和使用卷, docker 不支持相對(duì)路徑的掛載點(diǎn), 多個(gè)容器可以同時(shí)使用同一個(gè)卷.
$ docker volume create hello #創(chuàng)建卷 hello $ docker run -it --rm -v hello:/world -w /world busybox /bin/sh -c 'touch /world/a.txt && ls -al' #容器內(nèi)建個(gè)文件 total 8 drwxr-xr-x 2 root root 4096 Oct 22 16:38 . drwxr-xr-x 1 root root 4096 Oct 22 16:38 .. -rw-r--r-- 1 root root 0 Oct 22 16:38 a.txt $ docker run -it --rm -v hello:/world -w /world busybox /bin/sh -c 'rm /world/a.txt && ls -al' #從容器內(nèi)刪除 total 8 drwxr-xr-x 2 root root 4096 Oct 22 16:38 . drwxr-xr-x 1 root root 4096 Oct 22 16:38 ..
外部創(chuàng)建文件, 容器內(nèi)指定用戶去刪除
$ touch c.txt && sudo chmod root:wheel c.txt $ docker run -u 100 -it --rm -v `pwd`:/world -w /world busybox /bin/sh -c 'rm /world/c.txt && ls -al'
實(shí)際是可以刪除的
rm: remove '/world/c.txt'? y total 4 drwxr-xr-x 4 100 root 128 Oct 23 16:09 . drwxr-xr-x 1 root root 4096 Oct 23 16:09 .. -rw-r--r-- 1 100 root 0 Oct 22 15:36 a.txt -rw-r--r-- 1 100 root 0 Oct 22 15:54 b.txt
docker 普通用戶的1024以下端口權(quán)限
$ docker run -u 100 -it --rm -p 70:80 busybox /bin/sh -c 'nc -l -p 80' nc: bind: Permission denied #用戶id 100 時(shí), 不能打開80端口 $ docker run -u 100 -it --rm -p 70:8800 busybox /bin/sh -c 'nc -l -p 8800' #容器端口大于1024時(shí)則可以 ... $ docker run -it --rm -p 70:80 busybox /bin/sh -c 'nc -l -p 80' #容器內(nèi)是 root 也可以 ...
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
文章名稱:Docker運(yùn)行時(shí)的用戶與組管理的方法
當(dāng)前URL:http://www.ekvhdxd.cn/article34/gchspe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、自適應(yīng)網(wǎng)站、營銷型網(wǎng)站建設(shè)、網(wǎng)站收錄、微信小程序、小程序開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)