這個階段閒來無事,爲了不荒度光陰,總得找點事情來做做或者學習下其他的東西,也是一閃靈光,打算學習虛擬技術,從Docker開始吧。
什麼是docker呢,官方定義:docker是以Docker容器爲資源分割和調度的基本單位,封裝了整個軟件運行時環境,爲開發者和系統管理者而設計的,用於構建、發佈和運行分佈式應用的平臺。它是一個跨平臺、可移植並簡單易用的容器解決方案。
我搞了一段時間,目前的理解就是:在系統中被單獨隔離出來的一個資源單位,你可以在這個資源單位中幹你想幹的事情。對於容器及其docker的理解,不是建立在表面的文字描述,而是在實踐的基礎上,進行總結和歸納,誠然,我的總結也可能有一定的侷限性,就學習而言,理解內涵首當其中,操作實踐是爲深入。對於運維而言,docker提供了很大的幫助。
對於他的優點,沒有真正意義上的使用過,是不能知曉的,所謂可移植性、跨平臺、高資源利用率等等只有使用過才知道。
爲什麼從docker開始入手呢,除了方便藉助SEL實驗室出的那本書(書寫的很不錯,值得推薦),還有蒐羅各式各樣的資料和技術博客來學習。當前,docker幾乎是容器的代名詞,很多人以爲docker就是容器。其實,這是錯誤的認識,除了docker 還有coreos。所以,容器世界裏並不是只有docker一家。既然不是一家就很容易出現分歧。任何技術出現都需要一個標準來規範它,不然各搞各的很容易導致技術實現的碎片化,出現大量的衝突和冗餘。因此,在2015年,由Google,Docker、CoreOS、IBM、微軟、紅帽等廠商聯合發起的OCI(Open Container Initiative)組織成立了,並於2016年4月推出了第一個開放容器標準。標準主要包括runtime運行時標準和image鏡像標準。標準的推出,有助於替成長中市場帶來穩定性,讓企業能放心採用容器技術,用戶在打包、部署應用程序後,可以自由選擇不同的容器Runtime;同時,鏡像打包、建立、認證、部署、命名也都能按照統一的規範來做。
兩種標準主要包含以下內容:
- 容器運行時標準 (runtime spec)
a). creating:使用 create 命令創建容器,這個過程稱爲創建中 b). created:容器創建出來,但是還沒有運行,表示鏡像和配置沒有錯誤,容器能夠運行在當前平臺 c). running:容器的運行狀態,裏面的進程處於 up 狀態,正在執行用戶設定的任務 d). stopped:容器運行完成,或者運行出錯,或者 stop 命令之後,容器處於暫停狀態。這個狀態,容器還有很多信息保存在平臺中,並沒有完全被刪除
- 容器鏡像標準(image spec)
a). 文件系統:以 layer 保存的文件系統,每個 layer 保存了和上層之間變化的部分,layer 應該保存哪些文件,怎麼表示增加、修改和刪除的文件等; b). config 文件:保存了文件系統的層級信息(每個層級的 hash 值,以及歷史信息),以及容器運行時需要的一些信息(比如環境變量、工作目錄、命令參數、mount 列表),指定了鏡像在某個特定平臺和系統的配置。比較接近我們使用 docker inspect 看到的內容; c). manifest 文件:鏡像的 config 文件索引,有哪些 layer,額外的 annotation 信息,manifest 文件中保存了很多和當前平臺有關的信息; d). index 文件:可選的文件,指向不同平臺的 manifest 文件,這個文件能保證一個鏡像可以跨平臺使用,每個平臺擁有不同的 manifest 文件,使用 index 作爲索引。
這麼冗長和複雜的標準,我是硬着頭皮看完的,能理解一些,要深入理解的話,須得動手操作。
就從安裝開始吧!
1.安裝docker
我是在基於Debian的KaliLinux中學習和安裝的,Ubuntu命令什麼的和它都一樣。鍵入安裝命令:
apt insatall docker *
爲了防止缺少依賴關係,我特地的加上通配符 ‘*’,表示安裝以docker開頭的所有東西。
安裝成功後進行一些基本命令的使用,可能你在安裝中會出現些許問題,或者是命令鍵入錯誤,或是更新源有問題、或是其他內核的Linux命令不一致等等,耐心看錯誤提醒,搜尋解決辦法。
查看環境信息:
docker info
仔細看,你剛安裝的docker容器信息、鏡像信息、服務器版本等等好多信息都可以看見
2.生命週期管理
包括docker的啓動、停止、重啓等。
開啓docker:service docker start即可。即開啓容器docker這個服務。
有幾個重要的命令:
1)核心命令之一。使用docker run --help查看可用選項,有很多命令,初期是用不到的,先做了解
docker run
這個命令用來基於特定的鏡像創建一個容器,並根據選項來控制該容器。使用docker run時,Docker將自動爲每個新容器分配唯一的ID作爲標識。
此時就創建並且運行了一個新的docker,順便使用--name命名爲helloworld。
2)既然分配了唯一ID,那就得知道它的ID、name、創建時間運行狀態等其他信息。
docker ps -a
一目瞭然,十分清楚,這條命令也很常用。
docker ps是列出當前運行的容器,加上-a參數是列出所有已經創建的容器
3)容器的開啓、停止重啓
docker start/stop/restart
比較簡單,不舉例
4)從鏡像倉庫中下載各種需要的鏡像
docker pull
Docker Registry是存儲容器鏡像的倉庫。
docker官方倉庫有許多即拿即用的鏡像資源,通過pull可以有效利用。體現“一次編譯,到處運行”特性
使用pull時可以從官方、私人、其他公共庫獲取鏡像。
如獲取Ubuntu的鏡像:
docker push:將本地的image或者repository推送到官方等鏡像庫中。和docker pull相反。
5)查詢已存在的鏡像
docker images
我已經下了好幾個,爲後面的簡單練習做準備,只不過下載的比較慢,因爲倉庫的話不是國內的,如果中斷,重複下載即可。
根據ID確定具體容器,也可以使用容器名來確定。
使用-i來開啓交互模式,始終保持輸入流開放。
使用-a附加標準輸入、輸出或錯誤輸出。
此外docker stop 或者docker restart 可以使用-t來設定時間
3.容器的運維操作
容器的操作是重中之重,Docker爲用戶提供了豐富的容器運維操作命令
1)attach:對開發人員特別有用,可以轉到正在運行的容器,觀察該容器的運行情況,或與容器的主進程進行交互。
先查看正在運行的docker,然後選擇要連接的docker的ID,前幾位即可,不必全部把ID打出來,再docker attach。
2)inspect:查看鏡像和容器的詳細信息,默認會列出所有信息,可以通過format參數來指定輸出的格式
docker inspect
3)ps:查看容器相關信息,-a查看所有容器,-l查看最新創建容器,包括不在運行中的容器.這個提過,不再贅述。
4.其他子命令:
commit:可以將容器固話成一個新的鏡像
events、history、logs
用於查看系統日誌信息:events會打印實時系統事件;history指定鏡像的歷史版本信息;logs進程運行日誌
這些不太常用,瞭解下即可。
一些常用操作:
docker stop $(docker ps -aq):停止所有容器
docker rm $(docker ps -aq):刪除所有容器
docker rmi $(docker images -aq):刪除所有鏡像
docker image prune --force --all:刪除不使用的鏡像
docker container prune -f:刪除所有停止的容器
docker ps -aq:列出所有容器Id
爲什麼說常用呢,因爲剛開始配置一些環境和容器,會碰到好些未知錯誤,也無從解決,只能刪掉,然後重新搞,再慢慢找出問題所在,後面刪的多了,重新搞的多了也就慢慢知道了哪裏有問題,也就會解決了。
對於docker初期的瞭解認識以及簡單的操作命令大概就是這個樣子,多做練習,理解方能深入。