15 個 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