Docker常見故障排查指南-基於阿里雲容器服務

摘要: 對於Docker的初學者而言,當容器或應用出現了問題不知從何入手進行排查。為此,我們準備了一個簡單指南來幫助阿里雲容器服務的用戶進行故障排查。

對於Docker的初學者而言,當容器或應用出現了問題不知從何入手進行排查。為此,我們準備了一個簡單指南來幫助阿里雲容器服務的用戶進行故障排查。

由於阿里雲容器服務完全兼容Docker Swarm,並支持使用原生Docker Client/API,所以很多內容對於 Docker/Docker Swarm的用戶也是適用的。

Docker問題分類

我們可以把Docker在使用中的問題分為如下幾類,

  1. 應用故障:應用執行狀態與預期不一致
  2. 容器故障:無法正確創建、停止、更新容器等
  3. 集群故障:集群創建失敗、更新失敗、無法連接等

Docker 故障排查工具

所有問題診斷都可以通過Docker命令行工具或者Web控制台來完成。如果用戶希望利用Web UI可以直接跳到下面章節。

利用Docker命令行工具訪問阿里雲容器服務集群的詳細說明可以通過文檔獲得,簡單而言操作如下

選擇集群,點擊連接信息

在彈出的窗口中,可以下載證書,並獲得集群的訪問信息

下載證書到指定目錄,並輸入下面命令

unzip -o certFiles.zipn

複製上文中環境變數配置,粘貼到命令行

export DOCKER_TLS_VERIFY="1"nexport DOCKER_HOST="tcp://master1g3.cs-cn-beijing.aliyun.com:15344"nexport DOCKER_CERT_PATH="$PWD"n

注意:

  • 如果Docker客戶端和伺服器端版本不一致,在某些操作過中會出現錯誤提示 「Error response from daemon: client is newer than server (client API version: 1.24, server API version: 1.23)」 目前阿里雲容器服務支持Docker 1.11,可以從Docker 1.11 release網頁下載相應操作系統的客戶端安裝包並拷貝到PATH路徑中,比如/usr/local/bin
  • 每個集群的證書和訪問信息都是獨立的,否則無法正常連接

應用故障排查

1. 查看容器列表,定位、查找容器

列出集群中所有容器

在命令行中輸入下列命令,會列出集群中所有運行的容器

docker ps n

列出集群中所有的容器(包括非運行狀態的容器)

docker ps -an

注意:所有容器服務的系統容器和Addon服務容器都已在結果列表中被過濾掉,以防誤操作導致故障。

也可在Web控制台中,選擇指定集群之後,點擊「容器列表」 來列出集群中所有容器

列出屬於指定應用、服務的容器

在命令行中輸入下列命令,列出屬於特定應用的容器

docker ps -a -f label=com.docker.compose.project=<name>n

或在Web控制台中,選擇指定應用之後,選中「容器列表」 選項卡

類似,可以在命令行中輸入下列命令,列出屬於指定服務名稱的容器

docker ps -a -f label=com.docker.compose.service=<name>n

或在Web控制台中,選擇指定服務後,選中「容器列表」選項卡

列出屬於特定節點的容器

在Web控制台中,可以獲得指定集群的節點列表

可以SSH到指定節點,並利用docker ps命令,列出當前節點中所有的容器

或者點擊節點IP地址,可以列出指定節點的容器列表

2. 查看容器應用日誌

在命令行中輸入下列命令,查看指定容器在stdout/stderr的日誌

docker logs <container-id>|<contianer-name>n

查看指定容器最後100行日誌

docker logs --tail=100 <container-id>|<contianer-name>n

利用控制台Web界面,除了可以獲得單個容器的日誌信息,還可以獲得指定應用、服務聚合的日誌信息。選擇指定應用、服務後,選中「日誌」選項卡

注意:如果容器日誌是輸出的文件上,建議通過容器服務和日誌服務的集成來採集容器日誌,請參考容器服務中如何收集日誌到阿里雲日誌服務; 或者下文中方法進入容器內部查看。

3. 查看容器進程信息

在命令行中輸入下列命令,列出指定容器中運行的進程信息

docker top <container-id>|<contianer-name>n

示例結果

yili@yili-mbp:~$ docker top 329a8e40a3b0nUID PID PPID C STIME TTY TIME CMDn999 32153 32106 0 Aug06 ? 00:23:56 redis-server *:6379n

注意:這裡的PID顯示的是宿主機操作系統上的PID信息,可以利用宿主機上的診斷工具來檢查進程問題。

4. 進入運行的Docker容器診斷問題

在命令行中輸入下列命令,可以利用tty的交互方式進入容器內部執行命令

docker exec -ti <container-id>|<contianer-name> bashn

注意:對於基於busybox, alpine等鏡像的容器,在執行上述命令時可能會出現類似

「exec: "bash": executable file not found in $PATH.」的錯誤,這時可以利用 sh 作為 docker exec 的容器執行命令

docker exec -ti <container-id>|<contianer-name> shn

建議:在構建鏡像的時候,可以把應用需要常見的故障診斷工具添加到容器鏡像中。這樣可以非常方便地進行故障調試

在控制台Web界面,可以選定指定容器並點擊「遠程終端」選項卡,會彈出如下的Web終端界面可以進入容器內部進行故障排查

注意:類似如果bash不可用,可以在shell命令行中輸入sh來執行命令。

5. 查看容器性能信息

在命令行中輸入下列命令,可以查看容器的性能監控信息

docker stats <container-id>|<contianer-name>n

示例輸出如下

CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDSneb7647d9b2dd 0.06% 6.672 MB / 4.145 GB 0.16% 19.51 MB / 29.43 MB 8.192 kB / 4.096 kB 0n

在控制台Web界面,可以選定指定容器並點擊「監控」選項卡

6. 查看容器配置信息和運行時狀態

在命令行中輸入下列命令,可以查看容器的配置信息和運行時狀態

docker inspect <container-id>|<contianer-name>n

在控制台Web界面,可以選定指定容器並點擊「詳情」選項卡

容器故障排查

1. 應用、服務部署失敗,查看事件列表

應用、服務的事件列表記錄了對應用和服務操作的關鍵操作日誌信息,可以快速定位應用、服務部署失敗的原因。

在控制台Web界面,選定指定應用、服務並點擊「事件」選項卡可以獲得相應的容器事件列表。

比如在這個示例中,由於用戶輸入了錯誤的tomcat鏡像tag,導致容器創建失敗。

2. 容器啟動後自動退出、或進入「restarting」狀態

對於初學者而言,一個經常遇到的問題是Docker容器啟動後自動退出,docker logs也沒有特殊輸出。如果容器啟動參數時包含「--restart=always」 或「--restart」則會不停重啟

這個問題常見的原因是容器的PID1進程(初始化進程)不是一個長時間運行的進程,或者它啟動了一個後台進程就退出。由於容器服務是以「detach」方式運行容器,這樣當PID1進程結束後就會導致整個容器退出。

可以參考Docker文檔 和 理解Docker容器的進程管理中介紹的方法來解決這個問題。

比如,用戶希望啟動一個Ubuntu鏡像

由於Ubuntu鏡像預設命令是「/bin/bash」 它在執行後會自動退出,我們需要將在服務的「command」在「更多設置」中將其修改為/bin/sh -c "while true; do sleep 10; done" 這樣的死循環;這樣可以保證容器的持續運行

建議:用戶在Docker鏡像的Dockerfile中應該設置正確的CMD或Entrypoint參數,來保證容器的正確執行

3. 應用部署之後,報告「Unable to find a node that satisfies the following conditions [port xxxx (Bridge mode)]」

當容器使用埠映射(docker run -p xxxx:xxxx 或者 compose模板中的ports聲明 )之後 系統會在宿主機上創建一個port,通過NAT來訪問容器的指定port。如果宿主機上的埠被容器或者系統進程佔用,就會導致埠分配失敗。

註:因為集群管理會檢查所有的容器來防止埠配置衝突,即使沒有在運行狀態的容器,如果已經聲明過埠映射。相應的宿主機埠也會標記為已佔用。

解決方法是,清除佔用埠的容器或者進程,或者調整容器埠映射的宿主機埠避免衝突

4. 應用無法通過路由配置從外部訪問

請參考訪問鏈路排查

5. 查詢Docker Engine日誌

有時因為系統原因,Docker Engine無法正常創建、刪除、啟動、停止容器,我們需要查詢Docker Engine日誌來排查信息

首先我們需要定位到出現問題的節點,SSH登錄到指定節點之後執行下列命令來查看Docker Engine日誌

  • Ubuntu 14.04: less /var/log/upstart/docker.log
  • CentOS 7.x: journalctl -r -u docker

集群故障排查

1. 如果集群節點創建、添加、agent升級失敗,查看集群日誌

在Web控制台,選擇集群後,點擊「查看日誌」在彈出的窗口中可以獲得對集群操作的日誌信息,便於發現相應的問題和解決方案

2. 如果節點上容器出現性能問題,查看節點監控信息

從容器列表,可以獲得容器和其對應的節點信息

從集群的節點列表,點擊指定節點,可以獲得相應的節點監控信息

注釋:如果節點安裝了雲監控agent,還可以通過雲監控獲得對節點性能監控的詳盡信息。

3. 如果節點健康狀態異常,查看節點上系統agent容器狀態

在阿里雲容器服務上,每個節點運行著「acs-agent」和「tunnel-agent」兩個系統容器負責與集群manager之間的通信和狀態上報。雖然容器服務提供了對系統容器的自動恢復功能,但在特殊情況下,依然會由於系統容器失敗會導致節點無法連接,這時候節點狀態會變為「異常」

這時候要SSH登錄到指定的節點,重啟「acs-agent」和「tunnel-agent」容器,

docker restart tunnel-agentndocker restart acs-agentn

並可以通過 docker logs命令查看相應容器的日誌信息

總結

本文介紹了Docker故障的排查工具和操作指南,未來我們還會針對一些常見問題有針對性地介紹常見解決方法。

想了解更多容器服務內容,請訪問 容器服務 Container Service_容器管理-阿里雲

推薦閱讀:

【阿里雲大學免費課程】機器學習業務實踐之路! 快收藏起來周末學習!
阿里雙11看不見的精彩:創世界紀錄背後的人、故事和技術
承擔雙11萬億流量,阿里核心技術揭秘:12位大咖告訴你!
如何在阿里雲上部署私有的Docker Registry
阿里雲發布固定公網IP升級為彈性公網IP功能

TAG:Docker | 编程工具 | 阿里云 |