如何優雅使用Docker?請收下這15個小技巧。

Tip1python

獲取最近運行容器的id 這是咱們常常會用到的一個操做,按照官方示例,你能夠這樣作(環境ubuntu):面試

這種方式在編寫腳本的時候頗有用,好比你想在腳本中批量獲取id,而後進一步操做。可是這種方式要求你必須給ID賦值,若是是直接敲命令,這樣作就不太方便了。 這時,你能夠換一種方式:docker

docker ps -l -q命令將返回最近運行的容器的id,經過設置別名(alias),dl命令就是獲取最近容器的id。這樣,就無需再輸入冗長的docker ps -l -q命令了。經過兩個斜引號「,能夠獲取dl命令的值,也就是最近運行的容器的id。shell

Tip2數據庫

儘可能在Dockerfile中指定要安裝的軟件,而不用Docker容器的shell直接安裝軟件。 說實話,我有時候也喜歡在shell中安裝軟件,也許你也同樣,喜歡在shell中把全部軟件安裝都搞定。可是,搞來搞去,最後仍是發現,你仍是須要在Doockerfile中指定安裝文件。在shell中安裝軟件,你要這樣作:ubuntu

而後輸入下面的命令來安裝文件:api

而後再調用exit:數組

退出docker容器,再給docker commit命令傳遞一個複雜的JSON字符串來提交新的鏡像:瀏覽器

太麻煩了,不是嗎?仍是在Dockerfile中指定安裝文件吧,只要兩個步驟:bash

1.在一個小巧的Dockerfile中,指定當前操做的鏡像爲FROM命令的參數

2.而後在Dockerfile中指定一些docker的命令,如CMD, ENTERPOINT, VOLUME等等來指定安裝的軟件

Tip3

超-超-超級用戶

你可能須要一直用超級用戶來操做docker,就像早期示例裏一直提示的:

Wow!連續三個sudo!三次化身「超級用戶」,真可謂是「超-超-超級用戶」啊!別擔憂,設置完畢,之後你就不再用打那麼多sudo了!

Tip4

清理垃圾

若是你想刪除全部中止運行的容器,用這個命令:

順便說一句,docker ps命令很慢,不知道爲啥這麼慢,按理說Go語言是很快的啊。docker ps -a -q命令列出全部容器的id,而後根據id刪除容器。docker rm命令遇到正在運行的容器就會失效,因此這個命令完美的刪除了全部沒在運行的容器。

Tip5

docker inspect輸出結果的解析利器:jq 要對docker inspect的輸出結果進行過濾,通常狀況下,用grep命令,你須要這樣操做:

哦!看上去很複雜,用jq吧,專業解析docker inspect輸出結果,具備更強的可讀性,方便易用:

其中第一個’.’表明全部的結果。’[0]’表明數組的第一個元素。就像JavaScript訪問一個JSON對象同樣,簡單方便。

Tip6

鏡像有哪些環境變量? 有時候,你須要知道本身建立的鏡像有哪些環境變量。簡單!只要這樣:

輸出結果以下:

調用env查看環境變量,對於後面要講到的「連接」(-link)頗有用,在鏈接兩個容器時候須要用到這些環境變量,具體請看最後一個要點「連接」。

Tip7

RUN命令 vs CMD命令

Docker的新手用戶比較容易混淆RUN和CMD這兩個命令。 RUN命令在構建(Build)Docker時執行,這時CMD命令不執行。CMD命令在RUN命令執行時才執行。咱們來理清關係,假設Dockerfile內容以下:

咱們要向系統中安裝一些軟件,那麼:

Build時執行RUN,RUN時執行CMD,也就是說,CMD纔是鏡像最終執行的命令。

Tip8

CMD命令 vs ENTRYPOINT命令

又是兩條容易混淆的命令!具體細節咱們就不說了,舉個例子,假設一個容器的Dockerfile指定CMD命令,以下:

另外一個容器的Dockerfile指定ENTRYPOINT命令,以下:

運行第一個容器:

獲得的結果:

運行第二個容器:

獲得的結果:

看到不一樣了吧?實際上,CMD命令是可覆蓋的,docker run後面輸入的命令與CMD指定的命令匹配時,會把CMD指定的命令替換成docker run中帶的命令。而ENTRYPOINT指定的命令只是一個「入口」,docker run後面的內容會所有傳給這個「入口」,而不是進行命令的替換,因此獲得的結果就是「echo hello」。

Tip9

Docker容器有本身的IP地址嗎?

剛接觸Docker的人或許會有這樣的疑問:Docker容器有本身的IP地址嗎?Docker容器是一個進程?仍是一個虛擬機?嗯…也許二者兼具?哈哈,其實,Docker容器確實有本身的IP,就像一個具備IP的進程。只要分別在主機和Docker容器中執行查看ip的命令就知道了。

查看主機的ip:

獲得結果:

查看Docker容器的ip:

獲得結果:

二者並不相同,說明Docker容器有本身的ip。

Tip10

基於命令行的瘦客戶端,使用UNIX Socket和Docker後臺服務的REST接口進行通訊。Docker默認是用UNIX socket通訊的,一直到大概0.五、0.6的版本仍是用端口來通訊,但如今則改爲UNIX socket,因此從外部沒法控制Docker容器的內部細節。下面咱們來搞點有趣的事情,從主機連接到docker的UNIX socket:

鏈接成功後,輸入:

輸入後連敲兩個回車,第二個回車表示輸入結束。而後,獲得的結果應該是:

有一天,我不當心把提交的名稱打錯了,名字開頭打成」-xxx」(我把命令和選項的順序搞混了),因此當我刪除的時候出了問題,docker rm -xxx,會把-xxx當成參數而不是鏡像的名稱。因此我只得經過socket直接連到容器來調用REST Server把錯誤的東西刪掉。

Tip11

把鏡像的依賴關係繪製成圖

docker images命令有一個很拉風的選項:-viz,能夠把鏡像的依賴關係繪製成圖並經過管道符號保存到圖片文件:

這樣,主機的當前路徑下就生成了一張png圖,而後,用python開啓一個微型的HTTP服務器:

而後在別的機器上用瀏覽器打開:

OK,依賴關係一目瞭然!

(譯者注:要使用dot命令,主機要安裝graphviz包。另外,若是主機ip沒有綁定域名,machinename換成主機的ip便可。)

Tip12

Docker把東西都存到哪裏去了? Docker實際上把全部東西都放到/var/lib/docker路徑下了。切換成super用戶,到/var/lib/docker下看看,你能學到不少有趣的東西。執行下面的命令:

能夠看到很多目錄,containers目錄固然就是存放容器(container)了,graph目錄存放鏡像,文件層(file system layer)存放在graph/imageid/layer路徑下,這樣你就能夠看看文件層裏到底有哪些東西,利用這種層級結構能夠清楚的看到文件層是如 何一層一層疊加起來的。

Tip13

Docker源代碼:Go, Go, Go, Golang! Docker的源代碼所有是用Go語言寫的。Go是一門很是酷的語言。其實,不僅是Docker,不少優秀的軟件都是用Go寫的。對我來講,Docker源文件中,有4個是我很是喜歡閱讀的:

commands.go docker的命令行接口,是對REST API的一個輕量級封裝。Docker團隊不但願在命令中出現邏輯,所以commands.go只是向REST API發送指令,確保其較小的顆粒性。

api.go REST API的路由(接受commands.go中的請求,轉發到server.go)

server.go 大部分REST API的實現

buildfile.go Dockerfile的解析器

有的夥計驚歎」Wow!Docker是怎麼實現的?!我沒法理解!」不要緊,Docker是開源軟件,去看它的源代碼就能夠了。若是你不太清楚Dockerfile中的命令是怎麼回事,直接去看buildfile.go就明白了。

Tip14

運行幾個Docker後臺程序,再退出容器,會發生什麼? OK,倒數第二個要點。若是在Docker中運行幾個後臺程序,再退出Docker容器,會發生什麼?答案是:不要這麼作!由於這樣作後臺程序就全丟了。

Dockerfile中用RUN命令去開啓一個後臺程序,如:

這樣的話,RUN命令開啓的後臺程序就會丟失。調用容器的bash連到容器的shell:

而後調用 ps aux查看進程,你會發現postgres的進程並無跑起來。 RUN命令會影響文件系統。所以,不要再Dockerfile中用啓動後臺程序,要把後臺程序啓動成前臺進程。或者,像一些高手提議的那樣,寫一個啓動腳 本,在腳本中啓動這些後臺程序或進程。

Tip15

容器之間進行友好溝通:連接

這是最拉風的功能!我把它留到最後壓軸!這是0.6.5中最重要的新功能,咱們前面已經提過兩次了。運行一個容器,給它一個名稱,在下面的例子中,咱們經過-name參數給容器指定名稱」loldb」:

再運行另外一個容器,加上-link參數來鏈接到第一個容器(別名爲loldb),並給第二個容器也指定一個別名(這裏用的是cheez):

順便獲得cheez的環境變量:

這樣,咱們就在兩個容器間創建起一個網絡通道(bridge),基於此,咱們能夠創建一個相似rails的程序:一個容器能夠訪問數據庫容器而不對外暴露其餘接口。很是酷!數據庫容器只須要知道第一個容器的別名(在本例中爲cheez)和要打開的端口號。因此數據庫容器也能夠env命令來查看這個端口是否打開。

歡迎工做一到五年的Java工程師朋友們加入Java架構開發:744677563

本羣提供免費的學習指導 架構資料 以及免費的解答

不懂得問題均可以在本羣提出來 以後還會有職業生涯規劃以及面試指導

相關文章
相關標籤/搜索