15 個 Docker 技巧和提示

greenfrog 8年前發布 | 12K 次閱讀 Docker

Docker 是個神奇的工具,我最喜歡它了。在軟件開發界它是迄今為止最閃亮的神器,數十倍的簡化了項目配置。

本文中,我會與你分享一些很酷的 Docker 技巧和提示。多數人可能熟悉這些命令,但我希望你或多或少能從本文獲益。

CLI(Command Line Interface,命令行)

好的 docker ps 輸出

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

docker ps -a | less -S

跟隨 logs

docker logs 默認情況下不會觀察日志,除非你使用 -f 參數:

docker logs <containerid> -f

docker inspect 輸出漂亮的 JSON

docker inspect 默認輸出大量的 JSON,可以通過 jq 提取需要的那些值:

# list IP addresses for all containers connected to 'bridge' network
docker network inspect bridge -f '{{json .Containers}}' | jq '.[] | {cont: .Name, ip: .IPv4Address}

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

# is the last run container still running?
docker inspect --format '{{.State.Running}}' $(docker ps -lq)

Docker 命令完成

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

命令完成是一個終端插件,通過 Tab 鍵,它會自動完成或建議你接下來要輸入的內容。Docker 命令完成功能對命令和選項都能生效。Docker 團隊為 Bash shell 和 Zsh shell 下的 docker、docker-machine 和 docker-compose 命令提供完成功能。

閱讀 Docker 官方關于安裝的文檔: docker engine 、 docker-compose 和  docker-machine 。

使用一段時間 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 <containerId> <portNumber>
# 或
docker inspect --format '{{.NetworkSettings.Ports}}' <containerId>

容器 IP

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

docker inspect --format '{{.NetworkSettings.IPAddress}}' <containerId>

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

接管主機的網絡棧

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

使用另一容器的網絡棧

$ docker run --net=container:<name|id> ...

新容器可以附加到另一個容器使用的網絡接口。目標容器可以通過 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

參考文獻:

 

來自:https://www.oschina.net/translate/docker-hacks-tips

 

 本文由用戶 greenfrog 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!