亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

關于docker的15個小tip(技巧)

2024-09-01 13:49:40
字體:
來源:轉載
供稿:網友

1. 獲取最近運行容器的id

這是我們經常會用到的一個操作,按照官方示例,你可以這樣做(環境ubuntu):

$ ID=$(docker run ubuntu echo hello world)hello world$ docker commit $ID helloworldfd08a884dc79

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

$ alias dl='docker ps -l -q'$ docker run ubuntu echo hello worldhello world$ dl1904cf045887$ docker commit `dl` helloworldfd08a884dc79

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

2.盡量在Dockerfile中指定要安裝的軟件,而不用Docker容器的shell直接安裝軟件

說實話,我有時候也喜歡在shell中安裝軟件,也許你也一樣,喜歡在shell中把所有軟件安裝都搞定。但是,搞來搞去,最后還是發現,你還是需要在Doockerfile中指定安裝文件。在shell中安裝軟件,你要這樣做:

$ docker run -i -t ubuntu bash #登陸到docker容器root@db0c3967abf8:/#

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

apt-get install postgresql 

然后再調用exit:

root@db0c3978abf8:/# exit

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

$ docker commit -run=”{“Cmd”:[“postgres”,”-too -many -opts”] }” `dl` postgres

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

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

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

3.超-超-超級用戶

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

# 添加docker用戶組$ sudo groupadd docker# 把自己加到docker用戶組中$ sudo gpasswd -a myusername docker# 重啟docker后臺服務$ sudo service docker restart# 注銷,然后再登陸$ exit

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

4. 清理垃圾

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

$ docker rm $(docker ps -a -q)

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

5. docker inspect輸出結果的解析利器:jq

要對docker inspect的輸出結果進行過濾,一般情況下,用grep命令,你需要這樣操作:

$docker inspect `dl` | grep IPAddress | cut -d ‘“‘ -f 4 172.17.0.52 

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

$docker inspect `dl` | jq -r ‘.[0].NetworkSettings.IPAddress' 172.17.0.52 

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

6.鏡像有哪些環境變量?

有時候,你需要知道自己創建的鏡像有哪些環境變量。簡單!只要這樣:

$ docker run ubuntu env 

輸出結果如下:

HOME=/PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bincontainer=lxcHOSTNAME=5e1560b7f757

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

7.RUN命令 vs CMD命令

Docker的新手用戶比較容易混淆RUN和CMD這兩個命令。

RUN命令在構建(Build)Docker時執行,這時CMD命令不執行。CMD命令在RUN命令執行時才執行。我們來理清關系,假設Dockerfile內容如下:

FROM thelanddownunder

MAINTAINER crocdundee 

我們要向系統中安裝一些軟件,那么:

# docker build將會執行下面的命令:RUN apt-get updateRUN apt-get install softwares# dokcer run默認執行下面的命令:CMD [“softwares”] 

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

8.CMD命令 vs ENTRYPOINT命令

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

FROM ubuntuCMD [“echo”] 

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

FROM ubuntuENTRYPOINT [“echo”] 

運行第一個容器:

docker run image1 echo hello

得到的結果:

hello

運行第二個容器:

docker run image2 echo hello

得到的結果:

echo hello

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

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

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

查看主機的ip:

$ ip -4 -o addr show eth0 

得到結果:

2: eth0 inet 162.243.139.222/24 

查看Docker容器的ip:

$ docker run ubuntu ip -r -o addr show eth0

得到結果:

149: eth0   inet 172.17.0.43/16

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

10.基于命令行的瘦客戶端,使用UNIX Socket和Docker后臺服務的REST接口進行通信

Docker默認是用UNIX socket通信的,一直到大概0.5、0.6的版本還是用端口來通信,但現在則改成UNIX socket,所以從外部無法控制Docker容器的內部細節。下面我們來搞點有趣的事情,從主機鏈接到docker的UNIX socket:

# 像HTTP客戶端一樣連接到UNIX socket$ nc -U / /var/run/docker.sock 

連接成功后,輸入:

GET /images/json HTTP/1.1 

輸入后連敲兩個回車,第二個回車表示輸入結束。然后,得到的結果應該是:

HTTP/1.1 200 OKContent-Type: application/jsonDate: Tue, 05 Nov 2013 23:18:09 GMTTransfer-Encoding: chunked16aa[{“Repository”:”postgres”,”Tag”:”......

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

11.把鏡像的依賴關系繪制成圖

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

# 生成一個依賴關系的圖表$ docker images -viz | dot -T png -o docker.png

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

python -m SimpleHTTPServer

然后在別的機器上用瀏覽器打開:http://machinename:8000/docker.png 

OK,依賴關系一目了然!

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

12.Docker把東西都存到哪里去了?

Docker實際上把所有東西都放到/var/lib/docker路徑下了。切換成super用戶,到/var/lib/docker下看看,你能學到很多有趣的東西。執行下面的命令:

$ sudo su# cd /var/lib/docker# ls -Fcontainers/ graph/ repositories volumes/

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

13.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就明白了。

14.運行幾個Docker后臺程序,再退出容器,會發生什么?

OK,倒數第二個要點。如果在Docker中運行幾個后臺程序,再退出Docker容器,會發生什么?答案是:不要這么做!因為這樣做后臺程序就全丟了。

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

RUN pg_ctl start

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

$ docker run -i -t postgresimage bash

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

15.容器之間進行友好溝通:鏈接

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

$ docker run -d -name loldb loldbimage

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

$ docker run -link /loldb:cheez otherimage env

順便得到cheez的環境變量:

CHEEZ_PORT=tcp://172.17.0.8:6379CHEEZ_PORT_1337_TCP=tcp://172.17.0.8.6379CHEEZ_PORT_1337_TCP_ADDR=tcp://172.17.0.12CHEEZ_PORT_1337_TCP_PORT=6379CHEEZ_PORT_1337_TCP_PROTO=tcp

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色中色综合影院手机版在线观看| 最近2019中文字幕第三页视频| 国产激情久久久久| 国产精品xxxxx| y97精品国产97久久久久久| 国产精品人人做人人爽| 国产视频在线一区二区| 中文字幕一精品亚洲无线一区| 美女久久久久久久久久久| 国产午夜精品全部视频播放| 欧美性生交xxxxxdddd| 久久久久久久久亚洲| 国产精品爽爽爽| 欧美不卡视频一区发布| 北条麻妃一区二区三区中文字幕| 久久久精品国产亚洲| 久久精品国产亚洲精品2020| 色婷婷综合成人av| 91av福利视频| 91日本在线视频| 亚洲精品福利视频| 在线看日韩欧美| 国产情人节一区| 国产成人97精品免费看片| 亚洲国产精品电影在线观看| 伊人伊成久久人综合网小说| 国产精品激情av电影在线观看| 国产精品免费视频久久久| 国内精品久久久久久久久| 欧美日韩国产一中文字不卡| 亚洲国产精品高清久久久| 97精品国产97久久久久久春色| 亚洲视频电影图片偷拍一区| 久久精品国产欧美亚洲人人爽| 亚洲成人网久久久| 久久久久久18| 亚洲片在线资源| 美女精品久久久| 欧美成人午夜免费视在线看片| 欧美xxxx14xxxxx性爽| 欧美视频13p| 日韩免费av片在线观看| 亚洲国产精品人人爽夜夜爽| 欧美在线国产精品| 国产亚洲a∨片在线观看| 亚洲精品永久免费精品| 久久精品国产96久久久香蕉| 影音先锋欧美在线资源| 欧美成人免费播放| 91丝袜美腿美女视频网站| 成人日韩在线电影| 国产精品久久久久久久久久东京| 欧美中文字幕在线| 亚洲精品中文字幕av| 91精品久久久久久久久青青| 欧美网站在线观看| 国产成人在线一区二区| 欧美一区深夜视频| 亚洲第一精品自拍| 精品成人在线视频| 懂色av影视一区二区三区| 黄色成人av在线| 亚洲在线观看视频网站| 亚洲日韩欧美视频| 欧美在线视频在线播放完整版免费观看| 欧美激情按摩在线| 欧美日韩精品在线视频| 亚洲精品不卡在线| 精品久久久久久久久国产字幕| 黑人巨大精品欧美一区二区一视频| 亚洲一区二区三区在线视频| 深夜福利一区二区| 欧美日韩xxx| 热久久视久久精品18亚洲精品| 国模精品视频一区二区三区| 亚洲第一免费网站| 国产精品老牛影院在线观看| 日韩精品免费综合视频在线播放| 欧美在线观看视频| 久久天天躁狠狠躁老女人| 日韩av一区在线| 日本精品视频在线观看| 欧美午夜激情在线| 38少妇精品导航| 亚洲国产欧美在线成人app| 国产欧美日韩丝袜精品一区| 国产69久久精品成人| 疯狂做受xxxx欧美肥白少妇| 欧美亚洲日本黄色| 中文字幕亚洲欧美日韩在线不卡| 亚洲伦理中文字幕| 亚洲偷欧美偷国内偷| 亚洲人在线视频| 国产欧美日韩丝袜精品一区| 国产免费观看久久黄| 奇米四色中文综合久久| 欧美性猛交xxxx免费看漫画| 亚洲精品视频在线播放| 精品久久国产精品| 日韩av影视在线| 久久久99久久精品女同性| 日韩中文字幕在线视频播放| 一本色道久久88亚洲综合88| 国产mv久久久| 97热在线精品视频在线观看| 黄色成人在线免费| 欧美黑人性生活视频| 久久在线观看视频| 亚洲精品国精品久久99热一| 久久久久久国产精品| 国产精品免费一区豆花| 欧美性猛xxx| 亚洲人成网站色ww在线| 国产一区二区三区欧美| 欧美日韩国产丝袜美女| 久久男人av资源网站| 久久久久久亚洲精品不卡| 亚洲国产精品资源| 中文字幕在线观看亚洲| 国产精品6699| 国产成人亚洲综合| 亚洲精品视频在线播放| 成人福利免费观看| 中文字幕视频在线免费欧美日韩综合在线看| 久久久久久久国产精品| 国产精品久久久久久久app| 欧美大片免费观看在线观看网站推荐| 成人性生交大片免费看视频直播| 久久伊人精品一区二区三区| 国产精品老女人视频| 日本精品一区二区三区在线播放视频| 日韩国产激情在线| 国产啪精品视频| 国产婷婷成人久久av免费高清| 欧美第一页在线| 国语自产在线不卡| 国产一级揄自揄精品视频| 国产成人午夜视频网址| 久久久久久久一区二区三区| 日韩黄色av网站| 日韩av在线一区| 91大神在线播放精品| 国产一区二区三区三区在线观看| 亚洲另类激情图| 亚洲国产精品久久久久久| 亚洲大尺度美女在线| 91精品国产91久久| 欧美精品一二区| 中文字幕日韩av| 亚洲乱码国产乱码精品精| 国产精品久久一区主播| 国产97色在线| 亚洲精选一区二区| 精品欧美激情精品一区| 色妞在线综合亚洲欧美| 成人免费视频在线观看超级碰| 97碰碰碰免费色视频| 成人国产精品免费视频| 欧美老女人bb| 国产黑人绿帽在线第一区| 国产主播欧美精品| 亚洲美女视频网| 中文字幕在线看视频国产欧美在线看完整| 久久精品中文字幕免费mv|