自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何優(yōu)雅使用Docker?請收下這15個快捷有效的小技巧

新聞 前端
獲取最近運(yùn)行容器的id 這是我們經(jīng)常會用到的一個操作,按照官方示例,你可以這樣做,但是這種方式要求你必須給ID賦值,如果是直接敲命令,這樣做就不太方便了。

獲取最近運(yùn)行容器的id 這是我們經(jīng)常會用到的一個操作,按照官方示例,你可以這樣做,但是這種方式要求你必須給ID賦值,如果是直接敲命令,這樣做就不太方便了。

 Tip1

獲取最近運(yùn)行容器的id 這是我們經(jīng)常會用到的一個操作,按照官方示例,你可以這樣做(環(huán)境ubuntu):

這種方式在編寫腳本的時候很有用,比如你想在腳本中批量獲取id,然后進(jìn)一步操作。但是這種方式要求你必須給ID賦值,如果是直接敲命令,這樣做就不太方便了。 這時,你可以換一種方式:

docker ps -l -q命令將返回最近運(yùn)行的容器的id,通過設(shè)置別名(alias),dl命令就是獲取最近容器的id。這樣,就無需再輸入冗長的docker ps -l -q命令了。通過兩個斜引號“,可以獲取dl命令的值,也就是最近運(yùn)行的容器的id。

Tip2

盡量在Dockerfile中指定要安裝的軟件,而不用Docker容器的shell直接安裝軟件。 說實(shí)話,我有時候也喜歡在shell中安裝軟件,也許你也一樣,喜歡在shell中把所有軟件安裝都搞定。但是,搞來搞去,最后還是發(fā)現(xiàn),你還是需要在Doockerfile中指定安裝文件。在shell中安裝軟件,你要這樣做:

然后輸入下面的命令來安裝文件:

然后再調(diào)用exit:

退出docker容器,再給docker commit命令傳遞一個復(fù)雜的JSON字符串來提交新的鏡像:

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

1.在一個小巧的Dockerfile中,指定當(dāng)前操作的鏡像為FROM命令的參數(shù)

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

Tip3

超-超-超級用戶

你可能需要一直用超級用戶來操作docker,就像早期示例里一直提示的:

Wow!連續(xù)三個sudo!三次化身“超級用戶”,真可謂是“超-超-超級用戶”??!別擔(dān)心,設(shè)置完畢,以后你就再也不用打那么多sudo了!

Tip4

清理垃圾

如果你想刪除所有停止運(yùn)行的容器,用這個命令:

順便說一句,docker ps命令很慢,不知道為啥這么慢,按理說Go語言是很快的啊。docker ps -a -q命令列出所有容器的id,然后根據(jù)id刪除容器。docker rm命令遇到正在運(yùn)行的容器就會失效,所以這個命令完美的刪除了所有沒在運(yùn)行的容器。

Tip5

docker inspect輸出結(jié)果的解析利器:jq 要對docker inspect的輸出結(jié)果進(jìn)行過濾,一般情況下,用grep命令,你需要這樣操作:

哦!看上去很復(fù)雜,用jq吧,專業(yè)解析docker inspect輸出結(jié)果,具有更強(qiáng)的可讀性,方便易用:

其中第一個’.’代表所有的結(jié)果。’[0]’代表數(shù)組的第一個元素。就像JavaScript訪問一個JSON對象一樣,簡單方便。

Tip6

鏡像有哪些環(huán)境變量? 有時候,你需要知道自己創(chuàng)建的鏡像有哪些環(huán)境變量。簡單!只要這樣:

輸出結(jié)果如下:

調(diào)用env查看環(huán)境變量,對于后面要講到的“鏈接”(-link)很有用,在連接兩個容器時候需要用到這些環(huán)境變量,具體請看最后一個要點(diǎn)“鏈接”。

Tip7

RUN命令 vs CMD命令

Docker的新手用戶比較容易混淆RUN和CMD這兩個命令。 RUN命令在構(gòu)建(Build)Docker時執(zhí)行,這時CMD命令不執(zhí)行。CMD命令在RUN命令執(zhí)行時才執(zhí)行。我們來理清關(guān)系,假設(shè)Dockerfile內(nèi)容如下:

我們要向系統(tǒng)中安裝一些軟件,那么:

Build時執(zhí)行RUN,RUN時執(zhí)行CMD,也就是說,CMD才是鏡像最終執(zhí)行的命令。

Tip8

CMD命令 vs ENTRYPOINT命令

又是兩條容易混淆的命令!具體細(xì)節(jié)我們就不說了,舉個例子,假設(shè)一個容器的Dockerfile指定CMD命令,如下:

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

運(yùn)行第一個容器:

得到的結(jié)果:

運(yùn)行第二個容器:

得到的結(jié)果:

看到不同了吧?實(shí)際上,CMD命令是可覆蓋的,docker run后面輸入的命令與CMD指定的命令匹配時,會把CMD指定的命令替換成docker run中帶的命令。而ENTRYPOINT指定的命令只是一個“入口”,docker run后面的內(nèi)容會全部傳給這個“入口”,而不是進(jìn)行命令的替換,所以得到的結(jié)果就是“echo hello”。

Tip9

Docker容器有自己的IP地址嗎?

剛接觸Docker的人或許會有這樣的疑問:Docker容器有自己的IP地址嗎?Docker容器是一個進(jìn)程?還是一個虛擬機(jī)?嗯…也許兩者兼具?哈哈,其實(shí),Docker容器確實(shí)有自己的IP,就像一個具有IP的進(jìn)程。只要分別在主機(jī)和Docker容器中執(zhí)行查看ip的命令就知道了。

查看主機(jī)的ip:

得到結(jié)果:

查看Docker容器的ip:

得到結(jié)果:

兩者并不相同,說明Docker容器有自己的ip。

Tip10

基于命令行的瘦客戶端,使用UNIX Socket和Docker后臺服務(wù)的REST接口進(jìn)行通信。Docker默認(rèn)是用UNIX socket通信的,一直到大概0.5、0.6的版本還是用端口來通信,但現(xiàn)在則改成UNIX socket,所以從外部無法控制Docker容器的內(nèi)部細(xì)節(jié)。下面我們來搞點(diǎn)有趣的事情,從主機(jī)鏈接到docker的UNIX socket:

連接成功后,輸入:

輸入后連敲兩個回車,第二個回車表示輸入結(jié)束。然后,得到的結(jié)果應(yīng)該是:

有一天,我不小心把提交的名稱打錯了,名字開頭打成”-xxx”(我把命令和選項(xiàng)的順序搞混了),所以當(dāng)我刪除的時候出了問題,docker rm -xxx,會把-xxx當(dāng)成參數(shù)而不是鏡像的名稱。所以我只得通過socket直接連到容器來調(diào)用REST Server把錯誤的東西刪掉。

Tip11

把鏡像的依賴關(guān)系繪制成圖

docker images命令有一個很拉風(fēng)的選項(xiàng):-viz,可以把鏡像的依賴關(guān)系繪制成圖并通過管道符號保存到圖片文件:

這樣,主機(jī)的當(dāng)前路徑下就生成了一張png圖,然后,用python開啟一個微型的HTTP服務(wù)器:

然后在別的機(jī)器上用瀏覽器打開:

OK,依賴關(guān)系一目了然!

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

Tip12

Docker把東西都存到哪里去了? Docker實(shí)際上把所有東西都放到/var/lib/docker路徑下了。切換成super用戶,到/var/lib/docker下看看,你能學(xué)到很多有趣的東西。執(zhí)行下面的命令:

可以看到不少目錄,containers目錄當(dāng)然就是存放容器(container)了,graph目錄存放鏡像,文件層(file system layer)存放在graph/imageid/layer路徑下,這樣你就可以看看文件層里到底有哪些東西,利用這種層級結(jié)構(gòu)可以清楚的看到文件層是如 何一層一層疊加起來的。

Tip13

Docker源代碼:Go, Go, Go, Golang! Docker的源代碼全部是用Go語言寫的。Go是一門非??岬恼Z言。其實(shí),不只是Docker,很多優(yōu)秀的軟件都是用Go寫的。對我來說,Docker源文件中,有4個是我非常喜歡閱讀的:

commands.go docker的命令行接口,是對REST API的一個輕量級封裝。Docker團(tuán)隊不希望在命令中出現(xiàn)邏輯,因此commands.go只是向REST API發(fā)送指令,確保其較小的顆粒性。

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

server.go 大部分REST API的實(shí)現(xiàn)

buildfile.go Dockerfile的解析器

有的伙計驚嘆”Wow!Docker是怎么實(shí)現(xiàn)的?!我無法理解!”沒關(guān)系,Docker是開源軟件,去看它的源代碼就可以了。如果你不太清楚Dockerfile中的命令是怎么回事,直接去看buildfile.go就明白了。

Tip14

運(yùn)行幾個Docker后臺程序,再退出容器,會發(fā)生什么? OK,倒數(shù)第二個要點(diǎn)。如果在Docker中運(yùn)行幾個后臺程序,再退出Docker容器,會發(fā)生什么?答案是:不要這么做!因?yàn)檫@樣做后臺程序就全丟了。

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

這樣的話,RUN命令開啟的后臺程序就會丟失。調(diào)用容器的bash連到容器的shell:

然后調(diào)用 ps aux查看進(jìn)程,你會發(fā)現(xiàn)postgres的進(jìn)程并沒有跑起來。 RUN命令會影響文件系統(tǒng)。因此,不要再Dockerfile中用啟動后臺程序,要把后臺程序啟動成前臺進(jìn)程?;蛘撸褚恍└呤痔嶙h的那樣,寫一個啟動腳 本,在腳本中啟動這些后臺程序或進(jìn)程。

Tip15

容器之間進(jìn)行友好溝通:鏈接

這是最拉風(fēng)的功能!我把它留到最后壓軸!這是0.6.5中最重要的新功能,我們前面已經(jīng)提過兩次了。運(yùn)行一個容器,給它一個名稱,在下面的例子中,我們通過-name參數(shù)給容器指定名稱”loldb”:

再運(yùn)行另一個容器,加上-link參數(shù)來連接到第一個容器(別名為loldb),并給第二個容器也指定一個別名(這里用的是cheez):

順便得到cheez的環(huán)境變量:

這樣,我們就在兩個容器間建立起一個網(wǎng)絡(luò)通道(bridge),基于此,我們可以建立一個類似rails的程序:一個容器可以訪問數(shù)據(jù)庫容器而不對外暴露其他接口。非??幔?shù)據(jù)庫容器只需要知道第一個容器的別名(在本例中為cheez)和要打開的端口號。所以數(shù)據(jù)庫容器也可以env命令來查看這個端口是否打開。

責(zé)任編輯:張燕妮 來源: Go語言中文網(wǎng)
相關(guān)推薦

2017-12-14 14:17:08

Windows使用技巧手冊

2022-11-04 08:16:22

2021-10-11 08:20:30

Javascript 高階函數(shù)前端

2022-04-02 09:56:44

pipPython

2021-02-16 00:17:39

電腦技巧系統(tǒng)

2024-01-30 08:43:26

IF 語句JavaScripJS

2021-11-10 18:52:42

SQL技巧優(yōu)化

2020-11-11 08:22:40

前端開發(fā)JavaScript

2022-06-27 17:03:58

LibreOffic

2020-08-18 07:52:06

GitHub程序開源

2023-07-19 15:16:33

遠(yuǎn)程辦公技巧

2020-08-19 09:22:14

Python語言工具

2020-12-31 10:33:05

Python開發(fā)編程

2021-12-27 14:33:47

Python語言開發(fā)

2020-01-06 09:41:28

JavaScript瀏覽器工具

2023-01-29 08:17:40

2022-08-26 17:48:34

數(shù)據(jù)庫建表數(shù)據(jù)庫

2023-10-09 18:13:14

MySQL數(shù)據(jù)庫查詢

2025-02-17 08:50:00

CSS代碼JavaScript

2015-07-27 09:36:09

storyboard
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號