本文介紹docker中的contanier,基于操作系統(tǒng)介紹什么是container。
Container是具有指定配置的Linux進(jìn)程(processes)。我們進(jìn)行如下操作:
## 啟動(dòng)一個(gè)redis進(jìn)程 ? ~ docker run -d --name=db redis:alpine ## 顯示容器運(yùn)行的進(jìn)程 ? ~ docker top db PID USER TIME COMMAND 2288 999 0:00 redis-server ## 查看系統(tǒng)是否存在redis-server進(jìn)程 ? ~ ps aux | grep redis-server donggang 10761 0.0 0.0 4258876 200 s007 R+ 6:57下午 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn redis-server ## 查看dockerd的進(jìn)程樹 ? ~ pstree -c -p -A $(pgrep dockerd)
在linux系統(tǒng)中,一個(gè)container對(duì)應(yīng)一個(gè)標(biāo)準(zhǔn)的進(jìn)程。所有的container進(jìn)程都是dockerd進(jìn)程生成的。Linux是基于文件系統(tǒng)的,進(jìn)程的信息都存儲(chǔ)在/proc
目錄中。 每個(gè)進(jìn)程對(duì)應(yīng)一個(gè)目錄,可以通過進(jìn)程ID獲得對(duì)應(yīng)的目錄位置。
## 設(shè)置DBPID變量,方便后續(xù)測試 ? ~ DBPID=$(pgrep redis-server) ? ~ echo Redis is $DBPID Redis is 6950 ## 找到對(duì)應(yīng)的進(jìn)程目錄文件,該容器相關(guān)配置都保存在該目錄下 ? ~ ls /proc/$DBPID attr cmdline environ io mem ns pagemap sched stack task autogroup comm exe limits mountinfo numa_maps patch_state schedstat stat timers auxv coredump_filter fd loginuid mounts oom_adj personality sessionid statm uid_map cgroup cpuset fdinfo map_files mountstats oom_score projid_map setgroups status wchan clear_refs cwd gid_map maps net oom_score_adj root smaps syscall ## 通過文件獲取容器db的目錄 ? ~ cat /proc/$DBPID/environ HOSTNAME=a1f8a38c84d4SHLVL=2REDIS_DOWNLOAD_SHA=6624841267e142c5d5d5be292d705f8fb6070677687c5aad1645421a936d22b3HOME=/home/redisPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binREDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.6.tar.gzREDIS_VERSION=5.0.6PWD=/data# ## 通過docker api獲取, ? ~ docker exec -it db env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=a1f8a38c84d4 TERM=xterm REDIS_VERSION=5.0.6 REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-5.0.6.tar.gz REDIS_DOWNLOAD_SHA=6624841267e142c5d5d5be292d705f8fb6070677687c5aad1645421a936d22b3 HOME=/root
容器的一個(gè)基礎(chǔ)部分就是namespace,namespace限制某個(gè)進(jìn)程只能獲取系統(tǒng)的某些部分,比如網(wǎng)絡(luò)接口或這進(jìn)程。 當(dāng)一個(gè)容器開始運(yùn)行時(shí),容器運(yùn)行時(shí)(container runtime)比如docker將會(huì)創(chuàng)建namespace,容器對(duì)應(yīng)的進(jìn)程將在這個(gè)namespace中運(yùn)行,
有以下種類的namespace: Mount(mnt)、Process ID(pid)、Network(net)、Interprocess Communication(ipc)、UTC(hostnames) 、UserId(user)、Control group(cgroup)。有關(guān)Linux的namspace介紹移步于https://en.wikipedia.org/wiki/Linux_namespaces
## bash運(yùn)行在"沙箱中" ? ~ sudo unshare --fork --pid --mount-proc bash ## 打印進(jìn)程信息 [root@master ~]# ps PID TTY TIME CMD 1 pts/0 00:00:00 bash 12 pts/0 00:00:00 ps [root@master ~]# exit ## 退出沙箱 exit ## 打印進(jìn)程信息 ? ~ ps PID TTY TIME CMD 4673 pts/0 00:00:00 zsh 9088 pts/0 00:00:00 ps 16860 pts/0 00:00:00 zsh 18119 pts/0 00:00:00 zsh
我們可以通過工具unshare
創(chuàng)建一個(gè)隔離沙箱。使其中執(zhí)行的進(jìn)程不共享父進(jìn)程的Pid等namespace。
Namespace本質(zhì)上仍然是文件,它存儲(chǔ)在磁盤中,所以Namespace是可以共享的。工具nsenter可以在指定的namespace運(yùn)行一個(gè)程序。
## 獲取容器db的namespace資源 ? ~ ls -lha /proc/$DBPID/ns 總用量 0 dr-x--x--x 2 polkitd 1000 0 10月 30 19:17 . dr-xr-xr-x 9 polkitd 1000 0 10月 30 19:17 .. lrwxrwxrwx 1 polkitd 1000 0 10月 30 19:18 ipc -> ipc:[4026533033] lrwxrwxrwx 1 polkitd 1000 0 10月 30 19:18 mnt -> mnt:[4026533031] lrwxrwxrwx 1 polkitd 1000 0 10月 30 19:17 net -> net:[4026533036] lrwxrwxrwx 1 polkitd 1000 0 10月 30 19:18 pid -> pid:[4026533034] lrwxrwxrwx 1 polkitd 1000 0 10月 30 19:18 user -> user:[4026531837] lrwxrwxrwx 1 polkitd 1000 0 10月 30 19:18 uts -> uts:[4026533032] ## 在container db中執(zhí)行ps程序 ? ns nsenter --target $DBPID -m -u -i -p /bin/ps aux PID USER TIME COMMAND 1 redis 1:03 redis-server 37 root 0:00 /bin/ps aux
docker可以通過語法container:<container-name>
共享namespace,下面的例子中我們創(chuàng)建一個(gè)web容器,該容器網(wǎng)絡(luò)共享db container的網(wǎng)絡(luò)namespace。
? ns docker run -d --name=web --net=container:db nginx:alpine Unable to find image 'nginx:alpine' locally alpine: Pulling from library/nginx 89d9c30c1d48: Already exists 110ad692b782: Pull complete Digest: sha256:085e84650dbe56f27ca3ed00063a12d5b486e40c3d16d83c4e6c2aad1e4045ab Status: Downloaded newer image for nginx:alpine 4f982d745f346a7087c42c55e455448d21794641df7005c4d76299f781ba474f ? ns WEBPID=$(pgrep nginx | tail -n1) ? ns echo nginx is $WEBPID nginx is 21499 ? ns ls -alh /proc/$WEBPID/ns | grep net lrwxrwxrwx 1 101 101 0 10月 31 09:19 net -> net:[4026533036] ? ns ls -alh /proc/$DBPID/ns | grep net lrwxrwxrwx 1 polkitd 1000 0 10月 30 19:17 net -> net:[4026533036]
Chroot能夠是容器進(jìn)程擁有獨(dú)立的根目錄(root directory/
),chroot --help
能夠更改當(dāng)前 運(yùn)行的進(jìn)程及其子進(jìn)程的根目錄。 chroot不能夠起到隔離的作用,仍然可以通過相對(duì)路徑訪問新根以外的地址
CGroups技術(shù)限制進(jìn)程消耗資源,
AppArmor描述了進(jìn)程可以訪問系統(tǒng)中哪些部分。Seccomp提供了限制可以進(jìn)行哪些系統(tǒng)調(diào)用,阻止安裝內(nèi)核模塊或更改文件權(quán)限等方面的功能。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/127926.html
摘要:利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外層掛接一個(gè)寫讀寫層。容器的啟動(dòng)過程,對(duì)于理解容器至關(guān)重要,需要深入的理解。同時(shí),對(duì)于終止?fàn)顟B(tài)的容器,我們可以采用來啟動(dòng)。歡迎訂閱我的公眾號(hào),第一時(shí)間獲取圖表君的新文章。 上篇文章我們介紹了Docker三大概念中的Image,這篇我們來介紹Container,上篇文章中我們了解到了Image是運(yùn)行在Container中的,實(shí)際...
摘要:純分享直接上干貨操作系統(tǒng)并發(fā)支持進(jìn)程管理內(nèi)存管理文件系統(tǒng)系統(tǒng)進(jìn)程間通信網(wǎng)絡(luò)通信阻塞隊(duì)列數(shù)組有界隊(duì)列鏈表無界隊(duì)列優(yōu)先級(jí)有限無界隊(duì)列延時(shí)無界隊(duì)列同步隊(duì)列隊(duì)列內(nèi)存模型線程通信機(jī)制內(nèi)存共享消息傳遞內(nèi)存模型順序一致性指令重排序原則內(nèi)存語義線程 純分享 , 直接上干貨! 操作系統(tǒng)并發(fā)支持 進(jìn)程管理內(nèi)存管...
閱讀 1560·2025-02-07 13:29
閱讀 1002·2024-11-07 18:25
閱讀 131495·2024-02-01 10:43
閱讀 1323·2024-01-31 14:58
閱讀 1144·2024-01-31 14:54
閱讀 83571·2024-01-29 17:11
閱讀 3869·2024-01-25 14:55
閱讀 2390·2023-06-02 13:36