本文介紹docker中的contanier,基于操作系統(tǒng)介紹什么是container。
Container是具有指定配置的Linux進程(processes)。我們進行如下操作:
## 啟動一個redis進程 ? ~ docker run -d --name=db redis:alpine ## 顯示容器運行的進程 ? ~ docker top db PID USER TIME COMMAND 2288 999 0:00 redis-server ## 查看系統(tǒng)是否存在redis-server進程 ? ~ 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的進程樹 ? ~ pstree -c -p -A $(pgrep dockerd)
在linux系統(tǒng)中,一個container對應(yīng)一個標準的進程。所有的container進程都是dockerd進程生成的。Linux是基于文件系統(tǒng)的,進程的信息都存儲在/proc
目錄中。 每個進程對應(yīng)一個目錄,可以通過進程ID獲得對應(yīng)的目錄位置。
## 設(shè)置DBPID變量,方便后續(xù)測試 ? ~ DBPID=$(pgrep redis-server) ? ~ echo Redis is $DBPID Redis is 6950 ## 找到對應(yīng)的進程目錄文件,該容器相關(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
容器的一個基礎(chǔ)部分就是namespace,namespace限制某個進程只能獲取系統(tǒng)的某些部分,比如網(wǎng)絡(luò)接口或這進程。 當一個容器開始運行時,容器運行時(container runtime)比如docker將會創(chuàng)建namespace,容器對應(yīng)的進程將在這個namespace中運行,
有以下種類的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運行在"沙箱中" ? ~ sudo unshare --fork --pid --mount-proc bash ## 打印進程信息 [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 ## 打印進程信息 ? ~ 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)建一個隔離沙箱。使其中執(zhí)行的進程不共享父進程的Pid等namespace。
Namespace本質(zhì)上仍然是文件,它存儲在磁盤中,所以Namespace是可以共享的。工具nsenter可以在指定的namespace運行一個程序。
## 獲取容器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)建一個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能夠是容器進程擁有獨立的根目錄(root directory/
),chroot --help
能夠更改當前 運行的進程及其子進程的根目錄。 chroot不能夠起到隔離的作用,仍然可以通過相對路徑訪問新根以外的地址
CGroups技術(shù)限制進程消耗資源,
AppArmor描述了進程可以訪問系統(tǒng)中哪些部分。Seccomp提供了限制可以進行哪些系統(tǒng)調(diào)用,阻止安裝內(nèi)核模塊或更改文件權(quán)限等方面的功能。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/127926.html
摘要:利用鏡像創(chuàng)建并啟動一個容器分配一個文件系統(tǒng),并在只讀的鏡像層外層掛接一個寫讀寫層。容器的啟動過程,對于理解容器至關(guān)重要,需要深入的理解。同時,對于終止狀態(tài)的容器,我們可以采用來啟動。歡迎訂閱我的公眾號,第一時間獲取圖表君的新文章。 上篇文章我們介紹了Docker三大概念中的Image,這篇我們來介紹Container,上篇文章中我們了解到了Image是運行在Container中的,實際...
摘要:純分享直接上干貨操作系統(tǒng)并發(fā)支持進程管理內(nèi)存管理文件系統(tǒng)系統(tǒng)進程間通信網(wǎng)絡(luò)通信阻塞隊列數(shù)組有界隊列鏈表無界隊列優(yōu)先級有限無界隊列延時無界隊列同步隊列隊列內(nèi)存模型線程通信機制內(nèi)存共享消息傳遞內(nèi)存模型順序一致性指令重排序原則內(nèi)存語義線程 純分享 , 直接上干貨! 操作系統(tǒng)并發(fā)支持 進程管理內(nèi)存管...
閱讀 283·2024-11-07 18:25
閱讀 130362·2024-02-01 10:43
閱讀 867·2024-01-31 14:58
閱讀 828·2024-01-31 14:54
閱讀 82766·2024-01-29 17:11
閱讀 3047·2024-01-25 14:55
閱讀 1985·2023-06-02 13:36
閱讀 3032·2023-05-23 10:26