摘要:實現前述目的的方式有兩種在一個文件中指定一個基礎鏡像及需要完成的修改或通過運行一個鏡像,對其進行修改并提交。容器對外公開服務是必要的,因此允許公開容器的特定端口。鏡像必須完全可移植,不允許例外。
Docker是一個相對較新且發展非常快速的項目,可用來創建非常輕量的“虛擬機”。注意,這里的引號非常重要,Docker創建的并非真正的虛擬機,而更像是打了激素的chroot,嗯,是大量的激素。
Docker能做什么?Docker可以解決虛擬機能夠解決的問題,同時也能夠解決虛擬機由于資源要求過高而無法解決的問題。Docker能處理的事情包括:
隔離應用依賴 創建應用鏡像并進行復制 創建容易分發的即啟即用的應用 允許實例簡單、快速地擴展 測試應用并隨后銷毀它們
Docker背后的想法是創建軟件程序可移植的輕量容器,讓其可以在任何安裝了Docker的機器上運行,而不用關心底層操作系統。
概念鏡像
Docker的鏡像類似虛擬機的快照,但更輕量,非常非常輕量。
創建Docker鏡像有幾種方式,多數是在一個現有鏡像基礎上創建新鏡像,因為幾乎你需要的任何東西都有了公共鏡像,包括所有主流Linux發行版,你應該不會找不到你需要的鏡像。
要創建一個鏡像,你可以拿一個鏡像,對它進行修改來創建它的子鏡像。實現前述目的的方式有兩種:在一個文件中指定一個基礎鏡像及需要完成的修改;或通過“運行”一個鏡像,對其進行修改并提交。
鏡像擁有唯一ID,以及一個供人閱讀的名字和標簽對。鏡像可以命名為類似ubuntu:latest、ubuntu:precise、django:1.6、django:1.7等等。
其實,鏡像是一個json,它指定了從該鏡像運行的容器的特性,union裝載點保存在哪里,要公開什么端口等等。
容器
你可以從鏡像中創建容器,這等同于從快照中創建虛擬機,不過更輕量。應用是由容器運行的。
舉個例子,你可以下載一個Ubuntu的鏡像(有個叫docker registry的鏡像公共倉庫),通過安裝Gunicorn和Django應用及其依賴項來完成對它的修改,然后從該鏡像中創建一個容器,在它啟動后運行你的應用。
容器與虛擬機一樣,是隔離的。它們也擁有一個唯一ID和唯一的供人閱讀的名字。容器對外公開服務是必要的,因此Docker允許公開容器的特定端口。
與虛擬機相比,容器有一個很大的差異,它們被設計用來運行單進程,無法很好地模擬一個完整的環境(如果那是你需要的,請看看LXC)。你可能會嘗試運行runit或supervisord實例來啟動多個進程,但(以我的愚見)這真的沒有必要。
單進程與多進程之爭非常精彩。你應該知道的是,Docker設計者極力推崇“一個容器一個進程的方式”,如果你要選擇在一個容器中運行多個進程,那唯一情況是:出于調試目的,運行類似ssh的東西來訪問運行中的容器,不過docker exec命令解決了這個問題。
【容器和虛擬機的第二個巨大差異是:當你停止一個虛擬機時,可能除了一些臨時文件,沒有文件會被刪除;當你停止一個Docker容器,對初始狀態(創建容器所用的鏡像的狀態)做的所有變化都會丟失。】(譯者注:該論述不正確,已與作者確認,感謝lostsnow指正)
容器是設計來運行一個應用的,而非一臺機器。你可能會把容器當虛擬機用,但如我們所見,你將失去很多的靈活性,因為Docker提供了用于分離應用與數據的工具,使得你可以快捷地更新運行中的代碼/系統,而不影響數據。
數據卷
數據卷讓你可以不受容器生命周期影響進行數據持久化。它們表現為容器內的空間,但實際保存在容器之外,從而允許你在不影響數據的情況下銷毀、重建、修改、丟棄容器。Docker允許你定義應用部分和數據部分,并提供工具讓你可以將它們分開。使用Docker時必須做出的最大思維變化之一就是:容器應該是短暫和一次性的。
卷是針對容器的,你可以使用同一個鏡像創建多個容器并定義不同的卷。卷保存在運行Docker的宿主文件系統上,你可以指定卷存放的目錄,或讓Docker保存在默認位置。保存在其他類型文件系統上的都不是一個卷,稍后再具體說。
鏈接
鏈接是Docker的另一個重要部分。
容器啟動時,將被分配一個隨機的私有IP,其它容器可以使用這個IP地址與其進行通訊。這點非常重要,原因有二:一是它提供了容器間相互通信的渠道,二是容器將共享一個本地網絡。我曾經碰到一個問題,在同一臺機器上為兩個客戶啟動兩個elasticsearch容器,但保留集群名稱為默認設置,結果這兩臺elasticsearch服務器立馬變成了一個自主集群。注:限制容器間通訊是可行的,請閱讀Docker的高級網絡文檔做進一步了解。
要開啟容器間通訊,Docker允許你在創建一個新容器時引用其它現存容器,在你剛創建的容器里被引用的容器將獲得一個(你指定的)別名。我們就說,這兩個容器鏈接在了一起。
因此,如果DB容器已經在運行,我可以創建web服務器容器,并在創建時引用這個DB容器,給它一個別名,比如dbapp。在這個新建的web服務器容器里,我可以在任何時候使用主機名dbapp與DB容器進行通訊。
Docker更進一步,要求你聲明容器在被鏈接時要開放哪些端口給其他容器,否則將沒有端口可用。
在創建鏡像時有一點要注意。Docker允許你在一個鏡像中指定卷和端口。從這個鏡像創建的容器繼承了這些設置。但是,Docker不允許你在鏡像上指定任何不可移植的內容。
例如,你可以在鏡像里定義卷,只要它們被保存在Docker使用的默認位置。這是因為如果你在宿主文件系統里指定了一個特定目錄來保存卷,其他使用這個鏡像的宿主無法保證這個目錄是存在的。
你可以定義要公開的端口,但僅限那些在創建鏈接時公開給其他容器的端口,你不能指定公開給宿主的端口,因為你無從知曉使用那個鏡像的宿主有哪些端口可用。
你也不能在鏡像上定義鏈接。使用鏈接要求通過名字引用其他容器,但你無法預知每個使用那個鏡像的宿主如何命名容器。
鏡像必須完全可移植,Docker不允許例外。
它需要完成的東西?**
兩個詞:cgroups和union文件系統。Docker使用cgroup來提供容器隔離,而union文件系統用于保存鏡像并使容器變得短暫。
第一步,安裝Docker。
Docker命令工具需要root權限才能工作。你可以將你的用戶放入docker組來避免每次都要使用sudo。
第二步,使用以下命令從公共registry下載一個鏡像:
docker pull ubuntu:latest
這個公共registry上有你需要的幾乎所有東西的鏡像:Ubuntu、Fedora、Postgresql、MySQL、Jenkins、Elasticsearch、Redis等等。Docker開發人員在這個公共registry里維護著數個鏡像,不過你能從上面拉取大量來自用戶發布的自建自建鏡像。
也許你需要或想要一個私有的registry(用于開發應用之類的容器),你可以先看看這個。現在,有好幾個方式可以設置你自己的私有registry。你也可以買一個。
第三步,列出你的鏡像:
docker images
第四步,從該鏡像上創建一個容器。
docker run --rm -ti ubuntu /bin/bash
--rm:告訴Docker一旦運行的進程退出就刪除容器。這在進行測試時非常有用,可免除雜亂[圖片]-ti:告訴Docker分配一個偽終端并進入交互模式。這將進入到容器內,對于快速原型開發或嘗試很有用,但不要在生產容器中打開這些標志[圖片]ubuntu:這是容器立足的鏡像[圖片]/bin/bash:要運行的命令,因為我們以交互模式啟動,它將顯示一個容器的提示符
在運行run命令時,你可指定鏈接、卷、端口、窗口名稱(如果你沒提供,Docker將分配一個默認名稱)等等。
現在,我們在后臺運行一個容器:
docker run -d ubuntu ping 8.8.8.8
輸出的是分配的ID.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/27126.html
摘要:時間年月日星期六說明本文部分內容均來自慕課網。必填用于執行命令,當執行完畢后,將產生一個新的文件層。可選指定此鏡像啟動時默認執行命令。可選用于指定需要暴露的網絡端口號。可選向鏡像中掛載一個卷組。 時間:2017年09月16日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com 教學源碼:無 學習源碼:無 第一章:課程簡介 1-1 課程介紹 Docke...
摘要:編程書籍的整理和收集最近一直在學習深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后也找了很多的書和文章,隨著不斷的學習,也整理了下自己的學習筆記準備分享出來給大家后續的文章和總結會繼續分享,先分享一部分的 編程書籍的整理和收集 最近一直在學習deep learning深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后...
閱讀 3280·2023-04-26 02:09
閱讀 2574·2021-11-24 09:39
閱讀 3268·2021-11-16 11:52
閱讀 3614·2021-10-26 09:50
閱讀 2771·2021-10-08 10:05
閱讀 2456·2021-09-22 15:25
閱讀 3299·2019-08-30 13:14
閱讀 908·2019-08-29 17:06