15 個 Docker 技巧和提示

2021-08-03 05:17:38 字數 3119 閱讀 2825

好的 docker ps 輸出

將 docker ps 輸出通過管道重定向到 less -s,避免折行:

docker ps -a | less -s
跟隨 logs

docker logs 預設情況下不會觀察日誌,除非你使用 -f 引數:

docker logs -f
docker inspect 輸出漂亮的 json

docker inspect 預設輸出大量的 json,可以通過 jq 提取需要的那些值:

# list ip addresses for all containers connected to 'bridge' network

docker network inspect bridge -f '}' | jq '. |

也可以像下面這樣在 docker inspect 中使用內建的模板:

# is the last run container still running?

docker inspect --format '}' $(docker ps -lq)

docker 命令完成

docker cli 語法非常豐富,而且還在不斷充實:新增新的命令和引數。要記住每個命令和引數幾乎不可能,所以在終端上能自動完成這些命令很有必要。

命令完成是乙個終端外掛程式,通過 tab 鍵,它會自動完成或建議你接下來要輸入的內容。docker 命令完成功能對命令和選項都能生效。docker 團隊為 bash shell 和 zsh shell 下的 docker、docker-machine 和 docker-compose 命令提供完成功能。

使用一段時間 docker 之後,沒用的東西開始增長:不用的卷、網路、已退出的容器和不用的映像等。

prune:執行全部

prune 是個非常有用的命令(可在 vaume 和 network 子命令中使用),但它從 docker 1.13 開始才有。如果你使用舊的 docker 版本,下面的命令可用於代替 prune 命令。

docker system prune
移除懸空卷

懸空卷是不被任何容器使用的卷。若要移除它們,需要結合兩個命令:首先列出懸空卷的 id 然後移除它們。

docker volume rm $(docker volume ls -q -f "dangling=true")
刪除已退出的容器

這個操作與上面的步驟相同。首先列出要刪除(通過過濾)的容器(僅 id)然後刪除它們(參考 rm -f 強制刪除)。

docker rm $(docker ps -q -f "status=exited")
刪除懸空映像

懸空映像是未標記的映像,它們是映像樹的葉節點(不是中間層)。

docker rmi $(docker images -q -f "dangling=true")

docker 內部有乙個儲存 ip 位址的 ip 位址池。這些 ip 位址預設對外不可見,需要通過橋接進行訪問。

查詢埠對映

docker run 接收明確的埠對映引數,你也可以使用 -p 來自動對映所有埠。後者的優勢在於可以防止衝突, 可以通過下面的命令查詢已經分配的埠:

docker port # 或

docker inspect --format '}'

容器 ip

每個容器在私有子網中都有自己的 ip (預設是 172.17.0.0/16)。重啟可以改變 ip,如果你需要,可以查詢:

docker inspect --format '}'

docker 會檢查衝突並會在必要的時候使用不同的子網。

接管主機的網路棧

docker run --net=host 允許使用主機的網路棧。不要幹這種事情 :)

使用另一容器的網路棧

$ docker run --net=container: ...
新容器可以附加到另乙個容器使用的網路介面。目標容器可以通過 id 或名稱指定。

可附加的覆蓋網路

使用集群模式的 docker 引擎可以在一人管理節點的覆蓋網路上建立多個主機。建立集群服務的時候你可以將其附加到之前建立的覆蓋網路。

有時候你需要將新的 docker 容器(填充不同的網路工具)附加到已經存在的覆蓋網路,以檢查網路配置或除錯問題。你可以使用 docker run 命令來完成,不需要建立全新的除錯服務。

docker 1.13 為 docker network create 命令新增了乙個新選項:attachable。這個選項允許手工附加容器。

# create an attachable overlay network

docker network create --driver overlay --attachable mynet

# create net-tools container and attach it to mynet overlay network

docker run -it --rm --net=mynet net-tools sh

在 docker 容器中執行的某個程序可能會有很多原因失敗。某些情況下,可以通過重新執行失敗的容器來修復。如果你在使用 docker 業務流引擎,像 swarm 或 kubernetes,失敗的服務會自動重啟。

如果沒有自動重啟,那麼你可能希望根據容器中主程序的退出**來重啟容器,或者直接重啟容器(不管退出**)。docker 1.12 給 docker run 命令新增了 restart 引數來處理這種情況。

總是重啟

配置重啟策略為總是重啟,這樣一但容器退出,docker 就會重啟它。

docker run --restart=always my_image
失敗時重啟容器

配置重啟策略為失敗時重啟,最大重啟嘗試次數為 10。

docker run --restart=on-failure:10 my_image

谷歌15個技巧

如果你曾經使用過sublime text,那麼你一定知道沒有 go to anything 這個功能的覆蓋你不可能活下去。所以你會很高興聽到dev tools 也有這個功能。當devtools開啟的時候,你可以按下ctrl p 在mac上使用cmd p 來快速的尋找和開啟你工程中的任意檔案。但是如果...

VC小技巧15個

vc小技巧15個 一 一次只執行乙個程式例項 二 裝載游標 三 獲得主框架 獲得應用程式主視窗的指標 example afxgetmainwnd showwindow sw showmaxmized 使程式最大化 四 重新建立字型的 if m fontlogo.m hobject m fontlog...

VC小技巧15個

一 一次只執行乙個程式例項二 裝載游標三 獲得主框架 獲得應用程式主視窗的指標 example afxgetmainwnd showwindow sw showmaxmized 使程式最大化 四 重新建立字型的 if m fontlogo.m hobject m fontlogo.detach m ...