国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - 服務器知識 - 關于docker的15個小tip(技巧)

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

2021-01-03 18:22ElNinoT 服務器知識

本篇文章主要介紹了docker的15個小tip(技巧),具有一定的參考價值,有需要的可以了解一下。

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

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

?
1
2
3
4
5
6
7
$ ID=$(docker run ubuntu echo hello world)
 
hello world
 
$ docker commit $ID helloworld
 
fd08a884dc79

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
$ 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命令將返回最近運行的容器的id,通過設置別名(alias),dl命令就是獲取最近容器的id。這樣,就無需再輸入冗長的docker ps -l -q命令了。通過兩個斜引號“,可以獲取dl命令的值,也就是最近運行的容器的id。

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

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

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

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

?
1
apt-get install postgresql

然后再調用exit:

?
1
root@db0c3978abf8:/# exit

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

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

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

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

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

3.超-超-超級用戶

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 添加docker用戶組
 
$ sudo groupadd docker
 
# 把自己加到docker用戶組中
 
$ sudo gpasswd -a myusername docker
 
# 重啟docker后臺服務
 
$ sudo service docker restart
 
# 注銷,然后再登陸
 
$ exit

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

4. 清理垃圾

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

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

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

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

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

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

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

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

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

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

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

?
1
$ docker run ubuntu env

輸出結果如下:

?
1
2
3
4
5
6
7
HOME=/
 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 
container=lxc
 
HOSTNAME=5e1560b7f757

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

7.RUN命令 vs CMD命令

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

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

FROM thelanddownunder

MAINTAINER crocdundee 

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

?
1
2
3
4
5
6
7
8
9
# docker build將會執行下面的命令:
 
RUN apt-get update
 
RUN apt-get install softwares
 
# dokcer run默認執行下面的命令:
 
CMD [“softwares”]

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

8.CMD命令 vs ENTRYPOINT命令

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

?
1
2
3
FROM ubuntu
 
CMD [“echo”]

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

?
1
2
3
FROM ubuntu
 
ENTRYPOINT [“echo”]

運行第一個容器:

?
1
docker run image1 echo hello

得到的結果:

hello

運行第二個容器:

?
1
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:

?
1
$ ip -4 -o addr show eth0

得到結果:

2: eth0 inet 162.243.139.222/24 

查看Docker容器的ip:

?
1
$ 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:

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

連接成功后,輸入:

?
1
GET /images/json HTTP/1.1

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

?
1
2
3
4
5
6
7
8
9
10
11
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”:”......

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

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

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

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

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

?
1
python -m SimpleHTTPServer

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

OK,依賴關系一目了然!

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

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

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

?
1
2
3
4
5
6
7
$ sudo su
 
# cd /var/lib/docker
 
# ls -F
 
containers/ 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命令去開啟一個后臺程序,如:

?
1
RUN pg_ctl start

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

?
1
$ docker run -i -t postgresimage bash

然后調用 ps aux查看進程,你會發現postgres的進程并沒有跑起來。 RUN命令會影響文件系統。因此,不要再Dockerfile中用啟動后臺程序,要把后臺程序啟動成前臺進程。或者,像一些高手提議的那樣,寫一個啟動腳 本,在腳本中啟動這些后臺程序或進程。

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

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

?
1
$ docker run -d -name loldb loldbimage

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

?
1
$ docker run -link /loldb:cheez otherimage env

順便得到cheez的環境變量:

?
1
2
3
4
5
6
7
8
9
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

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/elnino/p/3899136.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久久国产精品久久久久久电车 | 久久久91精品国产一区二区三区 | 欧美亚洲视频在线观看 | 国产免费亚洲 | 一级电影免费在线观看 | 先锋av资源 | 视频一区二区三区中文字幕 | 日韩精品免费一区二区夜夜嗨 | 夜夜操天天操 | 亚洲高清黄色 | 久草.com| 成人免费在线视频 | 欧美午夜一区二区三区 | 日韩国产精品一区二区三区 | 亚洲成人免费 | 一级片在线观看 | 国产综合欧美 | 久久精品中文字幕 | 91视频.com | 日韩国产欧美视频 | 成人免费观看视频 | 欧美一级电影在线 | 黄色三级免费片 | 6080yy午夜一二三区久久 | 日韩欧一区二区三区 | 中文在线观看视频 | 欧美大片一区二区 | 欧美日韩在线一区二区 | 成人aⅴ视频 | 国产伊人久 | 亚洲最新无码中文字幕久久 | 国产精品久久久久久亚洲调教 | 精品一区二区三区免费毛片爱 | 国产一级一级毛片女人精品 | 婷婷综合网 | 一区二区三区国产好的精 | 黄色免费看 | 亚洲免费观看在线视频 | 免费一区在线观看 | 精品久久久久久国产 | 国产精品毛片久久久久久 |