




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
123456789fromflaskimportimportsocketimportosapp=Flask(namehtml=o{name}!</h3>""<b>Hostname:</b>returnhtml.format(name=os.getenv("NAME","world"), =="mainapp.run(host='',在這段代碼中,我使用Flask框架啟動了一個Web服務器,而它唯一的功能是:如果當前環境中有“NAME”這個環境變量,就把它打印在“o”后,否則就打印“oworld”,最后再打印出當前環境的hostname。這個應用的依賴,則被定義在了同下的requirements.txt代碼$cat代碼代碼123456789#使提供的Python開發鏡像作為基FROMpython:2.7-#將工切換為WORKDIR#將當 下的所有內ADD./app#使用pip命令安裝這個應用所需要RUNpipinstall--trusted-host-r#允許外EXPOSE80端設置環境變17ENVNAME#設置容器進程為:pythonapp.pyPythonCMD["python",亮的詞語),描述我們所要構建的Docker鏡像。并且這些原語,都是按順序處理的。Python代碼代碼FROMRUNapt-getupdate-yRUNapt-getinstall-ypython-pippython-devbuild-其中,RUNs命令的意思。而WORKDIR,意思是在這一句之后,Dockerfile后面的操作都以這一句指定的/app CMD,Dockerfilepythonapp.pyapp.pyapp/app.py。所以,CMDpython”,“app.pydocker另外,在使用Dockerfile時,你可能還會看到一個叫作ENTRYPOINTCMDDockerENTRYPOINTCMD不指定ENTRYPOINT時,比如在我們這個例子里,實際上運行在容器里的完整進程是:/bin/shc“pythonapp.pyCMDENTRYPOINTENTRYPOINTCMD當前(即Dockerfile所在的)里的文件,到指定容器內的當中。讀懂這個Dockerfile之后,我再把上述內容,保存到當前 代碼代碼$ Docker制作這個鏡像了,在當前執行:代碼代碼1$dockerbuild-oworld其中,-tTag,即:起一個好聽的名字。dockerbuild當前下的Dockerfile文件,然后按照順序,執行文件中的原語。而這個過程,實際上可以DockerDockerfile并沒有明顯地修改文件的操作(比如,ENV原語),它對應的層也會存在。只不過在外界看代碼代碼1234$dockerimageIMAGE法,查看這些新增的層在AuFS路徑下對應的文件和了。dockerrun代碼代碼1$dockerrun-p 代碼代碼1$dockerrun-poworldpythondockerps代碼代碼123$dockerCONTAINERd"python10secondsp4000:80Docker804000代碼代碼$ oWorld!</h3><b>Hostname:</b>否則,我就得先用dockerinspect命令查看容器的IP地址,然后“http://<容器IP地DockerHub上給的人,我要怎么做呢為了能夠上傳鏡像,我首先需要一個DockerHub賬號,然后使用dockerlogin命令登dockertag代碼代碼1$dockeroworld 注意:你自己做實驗時,請將"geektime"替換成你自己的DockerHub賬戶名稱,比如zhangsan/ docker代碼1$dockerpushgeektime/DockerHub此外,我還可以使用dockercommit指令,把一個正在運行的容器,直接提交為一個鏡像。一代碼代碼$dockerexec-itd3 d:/app#touch445d:/app#$dockercommit d 這里,我使用了dockerexec命令進入到了容器當中。在了解了LinuxNamespace的機制后,你應該會很自然地想到一個問題:dockerexec是怎么做到進入容器里的呢?比如,通過如下指令,你可以看到當前正在運行的Docker容器的進程號(PID)是代碼代碼$dockerinspect--format'{{.State.Piddproc25686Namespace410-]510-]610-]710-]lrwxrwxrwx1rootroot0Aug1314:05pid_for_children-> lrwxrwxrwx1rootroot0Aug1314:05user-> lrwxrwxrwx1rootroot0Aug1314:05uts-> LinuxNamespaceproc/[進程號]/ns應的虛擬文件,并且到一個真實的Namespace文件上。有了這樣一個可以“holdLinuxNamespaceNamespace一些很有意義事情了,比如:加入到一個已經存在的Namespace當中。入”這個進程所在容器的目的,這正是dockerexec的實現原理。代碼代碼1#definemain(intargc,char*argv[])intfd=open(argv[1],if(setns(fd,0)==-1)}execvp(argv[2],}Namespace文件的路徑,比如/proc/25686/ns/net;而第二個參數,則是你要在這個Namespace里運行的進程,比如/bin/bash。文件的描述符fd交給setns()使用。在setns()執行后,當前進程就加入了這個文件對應的LinuxNamespace當中了。Namespace中:1gcc-oset_ns2./set_ns/proc/25686/ns/net34 Link HWaddr inet inet6addr:fe80::42:acff:fe11:2/64UPBROADCASTRUNNING RXpackets:12errors:0dropped:0overruns:0TXpackets:10errors:0dropped:0overruns:0collisions:0 RXbytes:976(976.0 TXbytes:796(796.013 Linkencap:Local inet inet6addr:::1/128UPLOOPBACK RXpackets:0errors:0dropped:0overruns:0collisions:0RXbytes:0(0.0TXbytes:0(0.0實際上,在setns()之后我看到的這兩個網卡,正是我面啟動的Docker容器里的網卡。也bin/bash(PID=25686)NetworkNamepace,它看到的網絡設備與這個容器里是一樣的,即:/bin/bash在宿主機上,你可以用ps指令找到這個set_nsbin/bash進程,其真實的PID代碼代碼#在宿主機psaux|grep 284990.00.0199443612S 0:00PID=28499Namespace,你就會代碼代碼12345$ls-llrwxrwxrwx1rootroot0Aug1314:18/proc/28499/ns/net->]$ls-llrwxrwxrwx1rootroot0Aug1314:05/proc/25686/ns/net->]在 (PID=25686)指向的NetworkNamespace文件完全一樣。這說明這兩個進程,共享了這個名叫net:[ ]的NetworkNamespace。NetworkNamespacenet代碼代碼1$dockerrun-it--netdbusybox這樣,我們新啟動的這個容器,就會直接加入到ID=4ddf d的容器,也就是我們前面的創建的Python應用容器(PID=25686)的NetworkNamespace中。所以,這里ifconfig而如果我指定–net=host,就意味著這個容器不會為進程啟用NetworkNamespace。這就意味著,這個容器拆除了NetworkNamespace的“墻”,所以,它會和宿主機上的其他普dockerexecLinuxNamespacedockercommitdockercommit,實際上就是在容器運行起來后,把最上層的“可讀寫層”,加上原先容器鏡而正如前所說,InitdockercommitDockerDockerHub代碼1$dockerpushgeektime/當然可以,這個統一存放鏡像的系統,就叫作DockerRegistry。感的話,你可以查Docker的文檔,以及VMware的Harbor項目Docker:Volume(數據卷)rootfsMountNamespace,構建出了一個同宿主 這正是DockerVolume要解決的問題:Volume機制,允許你將宿主機上指定的 在Docker項目里,它支持兩種Volume方式,可以把宿主機 掛載進容器的/test目代碼$dockerrun-v/test$dockerrun-v/home:/test 掛載進了容器的/test目 ,那么Docker就會默認在宿主機上創建一個臨 MountNamespaceMountNamespacechroot(pivot_root)之前,容器進 rootfschrootVolume(比如 ),掛載到指定的容 (比如 )在宿主機上對應 (/[可讀寫層上,這個更重要的是,由于執行這個掛載操作時,“容器進程”已經創建了,也就意味著此時Mount容器內部的這個掛載點的。這就保證了容器的性不會被Volume打破。注意:這里提到的"容器進程",是Docker創建的一個容器初始化進程(dockerinit),而不是應用進程(ENTRYPOINT+CMD)。dockerinit會負責完成 、配置hostname等一系列需要在容器內進行的的PID=1的進程。而這里要使用到的掛載技術,就是Linux的綁定掛載(bindmount)機制。它的主要作用就 其實,如果你了解Linux內核的話,就會明白,綁定掛載實際上是一個inodeLinux操作系統中,inode可以理解為存放文件內容的“對象”,而dentry,也 是這個inode所使用的“指針”正如上圖所示,mountbindhometesthometest/test的dentry,重定向到了/home的inode。這樣當我們修改 的inode。這也就是為何,一旦執行umount命令,/test 復:因為修改真正發生在的,是/home 所以,在一個正確的時機,進行一次綁定掛載,Docker就可以成功地將一個宿主機上的 這樣,進程在容器里對這個/test 那么,這個/test commit提交掉呢?這個原因其實我們前面已經提到過。容器的鏡像操作,比如dockercommit機空間的。而由于MountNamespace的作用,宿主機并不知道這個綁定掛載的存在。以,在宿主機看來,容器中可讀寫層的 不過,由于Docker一開始還是要創建/test這個 作為掛載點,所以執行了dockercommit之后,你會發現新產生的鏡像里,會多出來一個空的/test 作,又不是掛載操作,MountNamespace對它可起不到“障眼法”的作用。 oworld容器,給它一個Volume,掛載在容器里的 上代碼代碼$dockerrun-d-v容器啟動之后,我們來查看一下這個Volume代碼代碼$dockervolume VOLUME 然后,使用這個ID,可以找到它在Docker工 下的volumes路徑代碼1$ls這個_data文件夾,就是這個容器的Volume在宿主機上對應的臨時 接下來,我們在容器的Volume里,添加一個文件text.txt:代碼$dockerexec-itcf53b766fa6fcdtouch這時,我們再回到宿主機,就會發現text.txt已經出現在了宿主機上對應的臨 里代碼$ls可是,如果你在宿主機上查看該容器的可讀寫層,雖然可以看到這個/test 的(關于如何找到這個AuFS文件系統的路徑,請參考我上一次的內容):11$lsVolumedockercommit以上內容,就是DockerVolume的原理了總的主要場景。熟悉了這些操作,你也就基本上摸清了Docker容器的功能。LinuxNamespace、Cgroupsrootfs這個容器進程“pythonapp.py”,運行在由LinuxNamespace和Cgroups構成的環境合掛載在一起的rootfsrootfsDockerDockerInit/etc/hosts容器的Volume的掛載點,也出現在這一層。思考DockerNamespacecgroupNamespace?它是Linux4.6之后新增加的一個Namespace,你知道它的作用嗎?如果你執行dockerrun-v/home:/test的時候,容器鏡像里的/test下本來就有內容的話,你會發現,在宿主機的/home下,也會出現這些內容。這是怎么回事?為什么它們沒有被綁定掛載隱呢?(提示:Docker的“copyData”功能)PythonCPUMemory限制,然后啟動它。根據我們前面介紹CgroupsCgroups歸科技所有 精選留言
一步 這樣把原理刨根究底的講解出來,很好,理解的很透徹黃文 收貨很大,感謝!請教一個問題,請問在容器內部如何獲取宿主機的 謝謝作者回復單靠容器,在開的情況下是拿不到的。但是有了kbenetes之后這些系統信息都可以從環境變量里拿到。這個功能叫donardpi 這節干貨滿滿啊與路同 有預感專欄會破2假裝 聽來清晰易懂,省去不少學習時間蔡鵬 dockerrun時指定-v掛載宿主機 到容器 ,即使容器原有 內有數據,也會被我宿主 作者回復這個行為其實是可配置的陶希 想知道云服務器等技術是不是也是通過namespace+cgroup作者回復當然多 一切從問題出發,根據問題理解答案,總結問題如下:一、docker鏡像如何制作的兩種方式是什么?二、容器既然是一個封閉的進程,那么外接程序是如何進入容器這個進程的呢?三、dockercot對掛載點oume內容修改的影響是什么?四、容器與宿主機如何進行文件讀寫?或volume五、Docker的copyData六、bindmount機制是什么?七、cgroupNamespace的作用是什么? 非常感謝老師的講解,咱們這個有群可以互相交流嗎? 作者回復如果你用的是k ontners這種基于虛擬化的容器,才可以實現。但原生其實也不提供這個功能。擇 在等更新,沙發!Leon 謝謝老師!前4節高屋建瓴地介紹了ocker和K8S的演進歷史,接著4節ocker基礎深入淺出地介紹了重要的基礎知識,受益匪淺,這4節ocker基礎再次讓我體會到了醍醐灌頂的感覺。多 課程干貨滿滿,一堂課下來不聽上幾遍根本無法掌握課中的知識點,一切從問題出發,能明白課中解決了什么問題或提出了什么問題,從這個角度出發,更正理清課中講的知識點,總結內容如下:一、docker鏡像如何制作的兩種方式是什么?二、容器既然是一個封閉的進程,那么外接程序是如何進入容器這個進程的呢?三、dockercot對掛載點oume內容修改的影響是什么?四、容器與宿主機如何進行文件讀寫?或oue是為了解決什么題?五、ocker的copyata功能是什么?解決了什么問題?六、bindmount機制是什么?七、cgroupNamespace的作用是什么?獸 講得非常不錯,曾經翻遍了幾乎所有Docker文檔,都沒中來得深刻,謝謝。 話,這些CMD執行的yum命令修改的內容還屬于只讀層?作者回復任何鏡像里的內容,都屬于只讀層。commit之后的東西當然也屬于只讀層。一 你好,磊哥,謝謝你講得這么詳細,我有一點不是很清楚:容器中的主進程在系統調用或調用一些lib時,調用到的和容器只讀層提供的lib嗎作者回復 !有些地方自己折騰狠難理解到!多謝老師高維指點。 請問docker掛載有何限制沒,是否隨便一個 都可以掛載?在容器里應該是root用戶,豈是可以對 無節制地操作,哪怕原本主機 中有些文件并不允許當前用戶?是否可以相應限制作者回復。至于用戶權限,是有 namespace可以做一定的限制 如果在docker容器中部署oracle,實際生產環境有沒有人這么干?作者回復好像oracle自己就有個方案? 所以說dockerexec每次都會創建一個和容器共享namespace的新進程?作者回復可以這么理解,i.e.spawnanewprocessinexisting藍色天 Linux基礎薄弱,理解起來有點吃力作者回復不太理解的地方,可以提出來微 很清 確實清晰了很多了不過還是有不清楚的點作者回復可以提出來討論 老師您好!請問,搭建的Harbor服務器,在項目管理頁面的右上角會顯示我有作者回復不了解 老師好,又來問您問題了。生產中有沒有什么好的工具管理本地的dockerregistry,比如磁盤作者回復harbor孫 4.6內核之前,查看/proc/$PID/cgroup,或者掛載cgroup時,在容器中會看到整個系統的這個問題感覺像陷阱,掛載后改變的是home的inode值(/test的inode),有數據就作者回復2.docker 掛載文件夾能理解,但是如果掛載宿主機的某一文件到容器,為什么需要容器事先存在同名的這個文件呢?作者回復不需要啊,文件 都不需要事先存在韓懿 豆沙 你好我用dockerrun起了app這個容器之后,查看aufs里層的信息,讀寫層為什么會和init層是同一個層呢?不是一個會被打包一個不會被打包么?#cat/sys/fs/aufs/si_cc04a4d4a9a38631/br[0- 作者回復你沒分清楚 和 的區別 干貨很多,要反復琢磨一下了!追尋云的痕 docker-ee的實現不是基于Hyper-V作者回復在windows上一共就兩種方案hyperv和wincontainer,它必然得支持 只會最后這個。dockerrun-p8000:80--cpuset-cpus="1"-m500M 木 張老師,能把搭建dockerk8s的環境簡要說一下嗎,比如使用ubuntu還是centos、rhel,什么作者回復看部署那篇 ;老師,有個地方還是不太明白,以下是你些的原文:ENTRYPOINTCMDdockerinit會負責完成根的準備、掛載設備和、配hostnameexecv讓應用進程取代自己,成為容器里的PID=1的進程。我有以下疑問:2、這里的dockerinit和應用進程在宿主機中是兩個不同的進程id么4、一個容器內部是否只有一個進程?,或者說容器只是一個房間(由aepce和cgrop組成),而其他的進程都是走進了這個房間,讓大家以為這個房間就是一個系統,里面包含了這么多進程,其實在宿主機的角度他們都是一個個進程,只是共享了amepace和cgrop而已,這樣理解對么?作者回復是。替換當然就是為了保證pd不變。注意,容器里的其他進程都是1號進程的子進程,不存在獨立的說法。甄心 為什作者回復因為被到單獨的netns里了 贊 請教一個問題,為啥子鏡像的entrypoint會覆蓋母鏡像的entrypoint的作者回復因為dockerfile順序buildShJin、 那么老師,請問有沒有辦法通過 -it的方式進入容器作者回復權限控制的辦法很多,但這也啥意義呢?我手寫一個 行的語言代碼就可以加入容器的amespace啊。所以不隨便給人root權限比較重要吧。 抱歉:再次進入image還是dockerrunimage,但沒有指定volumn作者回復因為volume除非刪除掉它還是在那臺主機上,你在別的機器上拉鏡像試試江宇 寫的不錯點 作者回復再次進入image是什 請問老師,鏡像只提供文件系統,系統調用使用的宿主機的內核?這個感覺很模糊,不是很理解作者回復默念三遍內核共享侯強亮 公司研發環境用的oracle的12c容 cetos7都是版本3的內核,針對k8s,到目前為止有遇到過因為內核bg的問題必須從3切換到版本4的內核的場景嗎,比如切換到btu?篇幅問題具體問題不方便在這里描述。主要是想了解下,是否有遇到過cetos有些比較棘手的問題,而不得不試圖切換到其它os的場景呢 docket里面的用戶和真實系統的會 docker啟動用戶用root好不 如果查看alpine:latest的掛 ,應該如何查找換句話說就是如何通過dockerimage的唯一id來查找出內部id(si_xxx)?作者回復遺憾的是,這個ID沒有對應關系,最方便的做法是查看mnt 變化小魚 老師的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年血氧飽和度分析儀項目建議書
- 國際游戲市場拓展與本土化運營策略調整合同
- 農業產業股權投資協議(SPA)-精準農業技術應用
- 電商平臺網店債權債務清理及代償協議
- 烘焙行業品牌授權保密補充合同
- 高端論壇私人保鏢住宿與參會安全合同
- 精美影視作品全網獨播權授權合同
- 八大浪費培訓
- 藝術替身薪酬保密協議及隱私保護服務條款
- Web前端開發技術項目教程(HTML5 CSS3 JavaScript)(微課版) 課件 6.1任務引入 制作非遺項目申報指南區域
- 2025-2030年中國緩釋和和控釋肥料行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025年河北省秦皇島市海港區中考一模數學試卷(原卷版+解析版)
- 衛生法律法規的試題及答案
- 2025年注冊測繪師考試測繪地理信息數據處理與應用試題
- 2025屆湖北省黃岡市黃州中學高考生物三模試卷含解析
- 二手車貨車合同協議書
- 2024-2025部編版小學道德與法治二年級下冊期末考試卷及答案
- 測井試題及答案完整版
- 人格性格測試題及答案
- 2025-2030年中國電子變壓器市場運行前景及投資價值研究報告
- 山東某年產10萬噸甲醇工程施工組織設計(土建 安裝)
評論
0/150
提交評論