欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于docker的15個(gè)小tip(技巧)

 更新時(shí)間:2016年12月16日 15:41:31   作者:ElNinoT  
本篇文章主要介紹了docker的15個(gè)小tip(技巧),具有一定的參考價(jià)值,有需要的可以了解一下。

1. 獲取最近運(yùn)行容器的id

這是我們經(jīng)常會(huì)用到的一個(gè)操作,按照官方示例,你可以這樣做(環(huán)境ubuntu):

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

hello world

$ docker commit $ID helloworld

fd08a884dc79

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

$ alias dl='docker ps -l -q'

$ docker run ubuntu echo hello world

hello world

$ dl

1904cf045887

$ docker commit `dl` helloworld

fd08a884dc79

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

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

說實(shí)話,我有時(shí)候也喜歡在shell中安裝軟件,也許你也一樣,喜歡在shell中把所有軟件安裝都搞定。但是,搞來(lái)搞去,最后還是發(fā)現(xiàn),你還是需要在Doockerfile中指定安裝文件。在shell中安裝軟件,你要這樣做:

$ docker run -i -t ubuntu bash #登陸到docker容器

root@db0c3967abf8:/#

然后輸入下面的命令來(lái)安裝文件:

apt-get install postgresql 

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

root@db0c3978abf8:/# exit

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

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

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

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

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

3.超-超-超級(jí)用戶

你可能需要一直用超級(jí)用戶來(lái)操作docker,就像早期示例里一直提示的:

# 添加docker用戶組

$ sudo groupadd docker

# 把自己加到docker用戶組中

$ sudo gpasswd -a myusername docker

# 重啟docker后臺(tái)服務(wù)

$ sudo service docker restart

# 注銷,然后再登陸

$ exit

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

4. 清理垃圾

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

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

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

5. docker inspect輸出結(jié)果的解析利器:jq

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

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

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

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

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

6.鏡像有哪些環(huán)境變量?

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

$ docker run ubuntu env 

輸出結(jié)果如下:

HOME=/

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

container=lxc

HOSTNAME=5e1560b7f757

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

7.RUN命令 vs CMD命令

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

RUN命令在構(gòu)建(Build)Docker時(shí)執(zhí)行,這時(shí)CMD命令不執(zhí)行。CMD命令在RUN命令執(zhí)行時(shí)才執(zhí)行。我們來(lái)理清關(guān)系,假設(shè)Dockerfile內(nèi)容如下:

FROM thelanddownunder

MAINTAINER crocdundee 

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

# docker build將會(huì)執(zhí)行下面的命令:

RUN apt-get update

RUN apt-get install softwares

# dokcer run默認(rèn)執(zhí)行下面的命令:

CMD [“softwares”] 

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

8.CMD命令 vs ENTRYPOINT命令

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

FROM ubuntu

CMD [“echo”] 

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

FROM ubuntu

ENTRYPOINT [“echo”] 

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

docker run image1 echo hello

得到的結(jié)果:

hello

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

docker run image2 echo hello

得到的結(jié)果:

echo hello

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

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

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

查看主機(jī)的ip:

$ ip -4 -o addr show eth0 

得到結(jié)果:

2: eth0 inet 162.243.139.222/24 

查看Docker容器的ip:

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

得到結(jié)果:

149: eth0   inet 172.17.0.43/16

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

10.基于命令行的瘦客戶端,使用UNIX Socket和Docker后臺(tái)服務(wù)的REST接口進(jìn)行通信

Docker默認(rèn)是用UNIX socket通信的,一直到大概0.5、0.6的版本還是用端口來(lái)通信,但現(xiàn)在則改成UNIX socket,所以從外部無(wú)法控制Docker容器的內(nèi)部細(xì)節(jié)。下面我們來(lái)搞點(diǎn)有趣的事情,從主機(jī)鏈接到docker的UNIX socket:

# 像HTTP客戶端一樣連接到UNIX socket

$ nc -U / /var/run/docker.sock 

連接成功后,輸入:

GET /images/json HTTP/1.1 

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

HTTP/1.1 200 OK

Content-Type: application/json

Date: Tue, 05 Nov 2013 23:18:09 GMT

Transfer-Encoding: chunked

16aa

[{“Repository”:”postgres”,”Tag”:”......

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

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

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

# 生成一個(gè)依賴關(guān)系的圖表

$ docker images -viz | dot -T png -o docker.png

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

python -m SimpleHTTPServer

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

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

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

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

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

$ sudo su

# cd /var/lib/docker

# ls -F

containers/ graph/ repositories volumes/

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

13.Docker源代碼:Go, Go, Go, Golang!

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

commands.go

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

api.go

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

server.go

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

buildfile.go

Dockerfile的解析器

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

14.運(yùn)行幾個(gè)Docker后臺(tái)程序,再退出容器,會(huì)發(fā)生什么?

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

Dockerfile中用RUN命令去開啟一個(gè)后臺(tái)程序,如:

RUN pg_ctl start

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

$ docker run -i -t postgresimage bash

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

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

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

$ docker run -d -name loldb loldbimage

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

$ docker run -link /loldb:cheez otherimage env

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

CHEEZ_PORT=tcp://172.17.0.8:6379

CHEEZ_PORT_1337_TCP=tcp://172.17.0.8.6379

CHEEZ_PORT_1337_TCP_ADDR=tcp://172.17.0.12

CHEEZ_PORT_1337_TCP_PORT=6379

CHEEZ_PORT_1337_TCP_PROTO=tcp

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • docker安裝ros2詳細(xì)步驟介紹

    docker安裝ros2詳細(xì)步驟介紹

    大家好,本篇文章主要講的是docker安裝ros2詳細(xì)步驟介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Docker基礎(chǔ)和常用命令詳解

    Docker基礎(chǔ)和常用命令詳解

    這篇文章主要介紹了Docker基礎(chǔ)和常用命令方法的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • docker離線安裝社區(qū)版(docker-18.06.3-ce)

    docker離線安裝社區(qū)版(docker-18.06.3-ce)

    在一些特定的環(huán)境下,由于網(wǎng)絡(luò)限制或者其他原因,我們可能需要在Linux系統(tǒng)上進(jìn)行離線安裝Docker,本文就來(lái)介紹一下docker離線安裝社區(qū)版,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Docker使用自定義網(wǎng)橋

    Docker使用自定義網(wǎng)橋

    這篇文章主要為大家詳細(xì)介紹了Docker使用自定義網(wǎng)橋的相關(guān)資料 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 詳解Docker Swarm概念與用法

    詳解Docker Swarm概念與用法

    這篇文章主要介紹了Docker Swarm概念與用法,幫助大家更好的理解和使用docker容器,感興趣的朋友可以了解下
    2020-09-09
  • docker限制容器內(nèi)存的方法詳解

    docker限制容器內(nèi)存的方法詳解

    在服務(wù)器中使用 docker 時(shí),如果不對(duì) docker 的可調(diào)用內(nèi)存進(jìn)行限制,當(dāng) docker 內(nèi)的程序出現(xiàn)不可預(yù)測(cè)的問題時(shí),就很有可能因?yàn)閮?nèi)存爆炸導(dǎo)致服務(wù)器主機(jī)的癱瘓,本文將介紹使用 docker 進(jìn)行容器內(nèi)存限制的方法,感興趣的朋友一起看看吧
    2023-11-11
  • idea鏈接不上虛擬機(jī)的docker里的mongodb問題及解決

    idea鏈接不上虛擬機(jī)的docker里的mongodb問題及解決

    這篇文章主要介紹了idea鏈接不上虛擬機(jī)的docker里的mongodb問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 使用Docker配置redis sentinel哨兵的方法步驟

    使用Docker配置redis sentinel哨兵的方法步驟

    本文主要介紹了Docker配置redis sentinel哨兵的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Deepin使用docker安裝mysql數(shù)據(jù)庫(kù)過程詳解

    Deepin使用docker安裝mysql數(shù)據(jù)庫(kù)過程詳解

    這篇文章主要介紹了Deepin使用docker安裝mysql數(shù)據(jù)庫(kù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • docker容器無(wú)法ping域名問題及解決

    docker容器無(wú)法ping域名問題及解決

    這篇文章主要介紹了docker容器無(wú)法ping域名問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08

最新評(píng)論