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

Tes Global 工程師總結(jié)的24條 Docker 實(shí)用建議

云計(jì)算
Tes Global的工程師Csaba Palfi從CLI、Dockerfiles、網(wǎng)絡(luò)、卷、安全方面總結(jié)了他們學(xué)習(xí)與使用Docker過程中的經(jīng)驗(yàn),一共24條,非常實(shí)用。

Tes Global的工程師Csaba Palfi從CLI、Dockerfiles、網(wǎng)絡(luò)、卷、安全方面總結(jié)了他們學(xué)習(xí)與使用Docker過程中的經(jīng)驗(yàn),一共24條,非常實(shí)用。

在TES GLOBAL,我們已經(jīng)愛上Docker并從Docker的0.8版本開始就在生產(chǎn)環(huán)境中使用它。我們的很多開發(fā)者都參加了在DockerCon歐洲上的培訓(xùn)。下面是我們總結(jié)的一些tips,希望可以幫到已經(jīng)有Docker基礎(chǔ)的同學(xué)。

1. CLI

1.1 美化docker ps的輸出

將Docker ps的輸出通過管道到 less -S,這樣表格式的行就不會(huì)被折疊。

docker ps - a | less -S 

1.2 刷新日志

docker的日志不會(huì)即時(shí)刷新,除非你使用了-F選項(xiàng):

docker logs <containerid> -F 

1.3 從docker inspect中獲取一個(gè)單一的值

docker inspect 默認(rèn)會(huì)輸出大量的 JSON 格式的數(shù)據(jù)。你可以用 jq,來得到某一特定鍵的值?;蛘吣憧梢允褂脙?nèi)置的 go 模板功能:

最后一個(gè)docker容器現(xiàn)在運(yùn)轉(zhuǎn)正常嗎?

docker inspect --format '{{.State.Running}}' $(docker ps -lq) 

1.4 使用docker exec而不是sshd 或者 nsenter

如果你查看過 Docker 的發(fā)行版你會(huì)你會(huì)很清楚這個(gè)小技巧。exec 在是在1.3版本中添加的新功能,可以讓你在容器里面運(yùn)行一個(gè)新的進(jìn)程。這樣你就不必運(yùn)行 sshd 或者在主機(jī)上安裝 nscenter。

2. Dockerfiles

2.1 docker build支持git倉庫

你不但可以從本地的 Dockerfile 中創(chuàng)建 Docker 鏡像,你還可以簡單的給 docker build 指定一個(gè)倉庫的 URL ,然后 docker build 會(huì)為你做完余下的事情。

2.2 沒有軟件包列表

默認(rèn)的鏡像(如Ubuntu)是不包含軟件包列表的,目的是讓鏡像體積更小。因此需要在任何的基礎(chǔ)的 Dockerfile 中需要使用 apt-get update。

2.3 留意軟件包的版本

注意軟件包的安裝,因?yàn)檫@些命令也是會(huì)緩存起來的。意味著如果你清空了緩存,你可能會(huì)得到不同的版本;或者如果緩存長期不更新,你可能不會(huì)得到最新的安全更新。

2.4 小體積的基礎(chǔ)鏡像

在Docker Hub上有一個(gè)官方的真正零體積的Docker鏡像,它的名字叫做 scratch。所以如果你有這種需求,可以讓你的鏡像從零開始。而大多數(shù)的情況下,你最好還是從 busybox 開始,其大小只有2.5M。

2.5 FROM默認(rèn)會(huì)獲取最新的

如果在 FROM 關(guān)鍵字后你沒有指定一個(gè)版本的 tag ,那么默認(rèn)就會(huì)獲取最新的。請(qǐng)注意這點(diǎn),并確保盡可能的指定一個(gè)特定的版本。

2.6 shell或者是exec模式

在 Dockerfile 中可以通過兩種方式來指定命令(如 CMD RUN 等)。如果你僅僅寫下命令那么Docker 會(huì)將其包裹在 sh -c 命令中執(zhí)行。你也可以寫成一個(gè)字符串?dāng)?shù)組的形式。數(shù)組的寫法不需要依賴容器中的 shell,因?yàn)槠鋾?huì)使用 go 的 exec。Docker 的開發(fā)者建議使用后一種方式。

2.7 ADD vs COPY

ADD 和 COPY 都能在創(chuàng)建容器的時(shí)候添加本地的文件。但是 ADD 有一些額外的魔力,如添加遠(yuǎn)程的文件、unzip 或者 untar 一些文件包等。使用 ADD 之前請(qǐng)了解這種差別。

2.8 WORKDIR和ENV

每個(gè)命令都會(huì)創(chuàng)建一個(gè)新的臨時(shí)鏡像并在新的 shell 中運(yùn)行,所以如果你在Dockerfile中不能運(yùn)行  cd <directory> 或者 export <var>=<value>。使用 WORKDIR 在多個(gè)命令中設(shè)置工作目錄并使用 ENV 來設(shè)置環(huán)境變量。

2.9 CMD和ENTRYPOINT

CMD是當(dāng)一個(gè)鏡像在運(yùn)行時(shí)默認(rèn)會(huì)執(zhí)行的命令。默認(rèn)的  ENTRYPOINT 是 /bin/sh -c,然后 CMD 會(huì)以參數(shù)的形式被傳入。我們可以在 Dockerfile 中覆蓋 ENTRYPOINT 以讓我們的容器像在接受命令行參數(shù)(默認(rèn)的參數(shù)在 Dockerfile中的CMD指定)。

Dockerfile中 

 

ENTRYPOINT /bin/ls 

CMD ["-a"

我們覆蓋了命令行但是netrypoint仍然是ls 

 

docker run training/ls -l 

2.10 將ADD置于末尾

如果文件發(fā)生改變,ADD 會(huì)讓緩存失效。不要 在Dockerfile 中添加經(jīng)常變化的東西,以避免讓緩存失效。將你的代碼放在最后,將庫和依賴放在最前。對(duì)于 Node.js 的應(yīng)用來說,這意味著將 package.json 放在前面,運(yùn)行 nmp install 然后添加你的代碼。

3. Docker的網(wǎng)絡(luò)

Docker 有一個(gè)內(nèi)置的 IP 池,用來指定容器的 ip 地址。它對(duì)外是不可見的,通過橋接的網(wǎng)口可以訪問到。

3.1 查找端口的映射

docker run 接收顯式的端口映射作為參數(shù),或者你可以通過 -P 選項(xiàng)來映射所有的端口。第二種做法的好處是能防止沖突??梢酝ㄟ^以下命令查找指定的端口:

docker port containerID portNumber 

或者

docker inspect --format '{{.NetworkSettings.Ports}}' 

containerID 

3.2 容器的IP地址

每一個(gè)容器都擁有自己屬于私有網(wǎng)段的 IP 地址(默認(rèn)是172.17.0.0/16)。IP 可能會(huì)在重啟的時(shí)候發(fā)生變化,如果你想知道其地址,可以用:

docker inspect --format '{{.NetworkSettings.IPAddress}}' containerID 

Docker 會(huì)嘗試檢查沖突,在需要的情況下會(huì)使用不同的網(wǎng)段的地址。

3.3 接管主機(jī)的網(wǎng)絡(luò)

docker run --net=host 能重用網(wǎng)絡(luò)。但是請(qǐng)不要這么做。

4. 卷(volume)

一個(gè)繞過目錄或者單一文件寫時(shí)復(fù)制(copy-on-write)的文件系統(tǒng),接近零負(fù)載(綁定掛載)。

4.1 卷的內(nèi)容在docker commit的時(shí)候不會(huì)被保存

在鏡像建立后寫入你的卷沒有太多的意義。

4.2 卷默認(rèn)是可讀可寫的

但是有一個(gè) :ro 的標(biāo)志。

4.3 卷和容器是分開存在的

卷只要有一個(gè)容器使用他們就會(huì)存在。可以在容器之間通過 --volumes-from 選項(xiàng)共享。

4.4 掛載你的docker.sock

你可以僅僅掛載 docker.sock 就能讓你的容器訪問到 Docker 的 API 。然后你可以在該容器中運(yùn)行 Docker 的命令。這樣容器甚至還可以殺死自己,在一個(gè)容器里面運(yùn)行一個(gè) Docker的守護(hù)者進(jìn)程是沒有必要的。

5. 安全

5.1 以root身份運(yùn)行Docker

Docker API 能給 root 的訪問權(quán)限,因?yàn)槟憧梢詫?映射成一個(gè)卷,然后讀或者寫?;蛘吣憧梢酝ㄟ^ --net host 接管宿主機(jī)的網(wǎng)絡(luò)。不要暴露 Docker API 如果你需要請(qǐng)使用 TLS。

5.2 Dockerfile中的USER

默認(rèn)下 Docker 可以以 root 的身份運(yùn)行任何命令,但是你可以使用 USER。Docker 沒有用戶的命名空間,因此容器將用戶看作是宿主機(jī)上的用戶。但是僅僅是 UID 因而你需要在容器里面添加該用戶。

5.3 使用TLS操作Docker API

Docker 1.3版本添加了對(duì) TLS 的支持。他們使用手動(dòng)的驗(yàn)證機(jī)制:客戶端和服務(wù)端都有一個(gè) Key。把 Key 看做是 root 用戶的密碼。從1.3版本開始,Boot2docker 默認(rèn)使用 TLS 并且會(huì)為你生成 key。

另外生成 Key 需要 OpenSSL 1.0.1 以上版本的支持,然后 Docker daemon 進(jìn)程需要加上 --tls-verify 選項(xiàng)運(yùn)行,Docker 會(huì)使用安全的端口(2376)。

本文出自:http://www.open-open.com/lib/view/open1419219210718.html

 

責(zé)任編輯:Ophira 來源: OPEN經(jīng)驗(yàn)庫
相關(guān)推薦

2015-08-03 09:49:24

2018-04-18 08:36:48

Linux命令運(yùn)維

2010-10-20 10:26:28

2019-07-29 16:05:48

前端DockerNode.js

2018-08-17 15:33:37

2015-02-04 09:19:03

Web優(yōu)化

2009-04-13 11:50:14

經(jīng)驗(yàn)交流職業(yè)分析面試

2020-09-17 16:11:04

軟件開發(fā) 技術(shù)

2020-07-10 14:25:32

Python編程代碼

2010-08-17 16:55:57

HCSE高級(jí)網(wǎng)絡(luò)工程師

2021-03-12 15:18:45

算法 Facebook技術(shù)

2022-02-14 11:14:34

Java工程師開發(fā)

2013-07-17 13:03:19

創(chuàng)業(yè)者創(chuàng)業(yè)總結(jié)

2013-07-18 09:42:47

創(chuàng)業(yè)總結(jié)

2015-08-26 14:18:25

Web前端工程師價(jià)值

2009-09-08 17:50:01

2024-10-18 09:14:12

2020-08-24 09:01:07

算法開源技術(shù)

2022-03-14 18:14:17

NetOps網(wǎng)絡(luò)

2015-09-30 10:25:03

前端工程師
點(diǎn)贊
收藏

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