首頁 > 軟體

乾貨丨Docker容器九類常見故障排查及處理

2021-05-16 04:00:16

本文轉自@TWT社群。

【前言】至少,以Docker和kubernetes為代表的容器技術日新月異,但我們在容器的使用過程中,也會碰到各種損壞和難題。出有針對性的說明和解決方案,希望可以幫助到大家去快速定位和解決類似問題故障。

具有超過十年的網際網路運維及五年以上團隊管理經驗,多年容器雲的運維,尤其是在Docker和kubernetes領域非常精通。

Docker是一種相對使用較簡單的容器,我們可以通過以下幾種方式獲取資訊:

1,通過docker run執行命令,或許返回資訊

2,通過docker logs去獲取日誌,做有針對性的篩選

3,通過systemctl status docker檢視docker服務狀態

4,通過journalctl -u docker.service檢視日誌

以下是整理的docker容器類問題故障,分為9個類

一,啟動類故障

1,

docker:無法通過unix:///var/run/docker.sock連線到Docker守護程式。泊塢窗守護程式正在運行嗎?

原因:Docker未正常啟動

解決方式:

systemctl啟動docker

2,

無法創建Unix套接字/var/run/docker.sock:是目錄

原因:docker.sock不能創建

rm -rf /var/run/docker.sock

然後重新啟動docker

3,

docker.service的作業失敗。無法啟動Docker應用程式

原因:Selinux引起

/ etc / sysconfig / selinux,將selinux值替換為禁用

重啟docker解決

4,

泊塢窗:來自守護程式的錯誤響應:

/ var / lib / docker / overlay / XXXXXXXXXXXXXXXXXXXXXXXXXX:無此類檔案或目錄。

原因:docker沒有指定目錄或檔案

systemctl停止docker

rm -rf / var / lib / docker / *

重啟run重新啟動容器

5,

泊塢窗:來自守護程式的錯誤響應:衝突。容器名稱「 XXX」已被容器「 XXX」使用。您必須刪除(或重新命名)該容器才能重用該名稱。

原因:碼頭工人名字重名

改名容器或者刪除重建容器

6,

錯誤:連線啟用失敗:找不到適合此連線的裝置

原因:網卡配置問題

重啟網卡

7,

系統重啟後docker無法啟動

報錯為:docker0:iptables:該名稱沒有鏈/目標/匹配

原因:docker服務iptables問題

重啟docker服務系統重啟docker

8,

啟動守護程式時出錯:初始化graphdriver時出錯:不支援驅動程式

使用overlay2儲存驅動啟動docker daemon報錯

原因:daemon經濟配置

新增配置:

/etc/docker/daemon.json

{「儲存驅動器」:「 overlay2」,

「儲存選項」:[「 overlay2.override_kernel_check = true」]}

9,

無法啟動docker.service:單位docker.service被遮蔽。

未知原因:docker被遮罩

systemctl取消遮蔽docker.service

systemctl取消遮蔽docker.socket

systemctl啟動docker.service

10,

無法啟動docker.service:單元未正確載入:參數無效。

未知原因:docker服務無法正常載入

解除安裝docker,刪除docker.service

重新安裝docker

11,

docker-compose啟動容器時報錯:

/usr/lib/python2.7/site-packages/requests/init.py:80:RequestsDependencyWarning:urllib3(1.22)或chardet(2.2.1)與支援的版本不匹配!RequestsDependencyWarning)

未知原因:pip相應元件版本不支援

pip解除安裝urllib3

pip解除安裝chardet

點安裝請求

12,docker容器重啟故障

強殺docker程序後,重啟docker。docker中的容器無法啟動並報錯

docker restart XXXXXXX來自守護程式的錯誤響應:無法重新啟動容器XXXXXXX:容器「 XXXXXXXXXXXXXXXX」:已存在

原因:舊容器未安全退出

docker-containerd-ctr --address /run/docker/containerd/docker-containerd.sock --namespace c rm <容器hash_id>

碼頭工人開始容器

13,

docker重啟錯誤-重啟命令一直卡住

systemctl重新啟動docker卡住

未知原因:可能是啟動的容器數量過多,或者磁碟IO問題

systemctl啟動docker-cleanup.service

二,許可權問題報錯

14,

嘗試連線到unix:///var/run/docker.sock的Docker守護程式套接字時獲得的許可權被拒絕

檢視/var/run/docker.sock其中使用者組

將使用者重新加入docker組中,usermod -aG docker $ {USER}

15,

在步驟GROUP中使用chown socket:沒有此類過程

原因:docker無法找到Group組資訊,docker組有可能被誤刪除,

groupadd泊塢窗

16,

釋出http:///var/run/docker.sock/v1.XXX / auth:撥打unix /var/run/docker.sock:許可權被拒絕。您是否要連線到沒有TLS的啟用TLS的守護程式?

原因:非Root使用者管理Docker時,許可權不足

usermod -a -G docker使用者

17,

碼頭工人犯錯誤

處理tar檔案時出錯(退出狀態1):意外的EOF

原因:可能是許可權問題引起

chmod + x加一個執行許可權

三,總體和倉庫問題報錯

18,

獲取https://registry-1.docker.io/v2/:撥打tcp:查詢登錄檔-1.docker.io

原因:Docker倉庫無法訪問

修改Docker倉庫源為國內或者自建的倉庫源

修改/etc/docker/daemon.json

19,推出本地可行性報錯

推送指向儲存庫[XXXX]獲取https:// xxx / v1 / _ping:http:伺服器向HTTPS客戶端提供了HTTP響應

原因:docker Registry未採用https服務所致

/etc/docker/daemon.json檔案寫入:

{「不安全的登錄檔」:[「」]}

20,

/ usr / bin / docker-current:來自守護程式的錯誤響應:oci運行時錯誤:container_linux.go:啟動容器程序導致「 exec:」 / bin / bash 」:在$ PATH中找不到可執行檔案」。

原因:Docker本身的固有問題或Docker引擎版本比較低導致

可以升級Docker版本服務

21,精心設計,執行chown -R非常慢

原因:Docker使用寫時複製策略,所以chown命令執行時,將上層副本檔案全部複製到當前層,然後再修改許可權,再寫入檔案系統。

不應該使用chown -R類別大批量修改檔案的命令

22,docker build造就的的時候報錯:

來自syslogd核心的訊息:unregister_netdevice:等待lo釋放。使用次數= 1

原因:docker engine版本過高

docker引擎版本需要和docker內部附加的核心版本匹配

23,

泊塢窗:來自守護程式的錯誤響應:容器:容器未在指定的超時之前啟動。ERRO[0133]從守護程式獲取事件的錯誤:上下文已取消

原因:修改完docker root dir,重啟後,下載多個報錯

重啟docker服務

或者重啟伺服器

四,資源問題報錯

25,

Docker裝置上沒有剩餘空間

原因:空間不足

解決方式:清理空間,刪除刪除使用的容器,額外等資源

碼頭工人系統修剪-a

26,

/ var / lib / docker / containers佔用過大

原因:日誌檔案佔用過大

cat / dev / null> * -json.log

或者

增加dockerd啟動參數,/ etc / docker / daemon.json

{「 log-driver」:「 json-file」,

「 log-opts」:{「 max-size」:「 2G」,「 max-file」:「 10」}

27,

最大虛擬記憶體區域vm.max_map_count [65530]太低,至少增加到[262144]

原因:系統參數預設配置過小

修改/etc/sysctl.conf裡面的vm.max_map_count調大

28,

無法啟動容器程序導致「 process_linux.go:301:

正在運行的exec setns程序進行初始化,導致「退出狀態40 」「:未知。

原因:可能是快取問題引起

回聲1> / proc / sys / vm / drop_caches

29,

docker本機啟動多臺容器導致出現後續容器啟動失敗

原因:檢視硬碟空間是否滿,如果不是硬碟空間問題引起

vim /etc/sysctl.conf

新增參數fs.aio-max-nr = 1048576

sysctl -p

30,Docker啟動異常,狀態反覆重啟

Docker日誌容器名,檢視異常日誌

檢視/ var / log /訊息

原因:記憶體跑滿,引起OOM

釋放記憶體後,再啟動容器

五,版本不相容報錯

31,

overlayfs:即使在ext4上,也無法刪除從基本層移至新創建的目錄的檔案

原因:Centos提供的檔案系統XFS和Overlay相容問題導致,

這個問題的修復在核心4.4.6以上

32,

泊塢窗:來自守護程式的錯誤響應:OCI運行時創建失敗:container_linux.go:344:啟動容器程序導致「 process_linux.go:297:從管道獲取最終子程序的pid導致「讀取init-p:連線被同級重置」 」:未知。

原因:Docker版本和作業系統版本不匹配

重新安裝和作業系統核心支援的docker版本

六,網路或埠問題報錯

33,

警告:IPv4轉發已禁用。網路將無法正常工作。

原因:ipv4網路無法轉發

/usr/lib/sysctl.d/00-system.conf

在最後一行新增net.ipv4.ip_forward = 1

重啟網路服務。刪除錯誤的容器,再次創建新容器

34,

使用預設驅動程式創建網路「 xxxxxxx」

原因:docker閘道器衝突

啟動容器,docker-compose啟動容器後,斷網問題

配置docker-compose.yml內給啟動器的容器配置參數network_mode:「 bridge」

35,

找不到滿足以下條件的節點[埠xxxx]

原因:當容器使用埠對映(docker run -p xxxx:xxxx或compose模板中的

ports)之後系統會在主機上創建一個埠,通過NAT來訪問容器的指定埠。如果主機上的埠被容器或系統程序佔用,則會導致埠分配失敗。

清除佔用埠的容器或者程序,或調整容器埠對映的主機機埠避免衝突

36,

來自守護程式的錯誤響應:名稱為xxx的服務端點已經

原因:埠已經被佔用

重啟docker容器

37,

泊塢窗:來自守護程式的錯誤響應:驅動程式無法對端點XXXXX上的外部連線進行程式設計:繫結0.0.0.0:80失敗:埠已分配

原因:容器埠衝突

更換主機機繫結埠

七,Docker安裝報錯

38,安裝docker報要求:container-selinux> = 2.9

原因:container-selinux版本低或者是沒安裝的原因

wget -O /etc/yum.repos.d/CentOS-Base.repo

http://mirrors.aliyun.com/repo/Centos-7.repo

百勝安裝epel-release

yum makecache

yum install container-selinux

39,安裝docker-compose時報錯

「 ImportError:'模組'物件沒有屬性'check_specifier'」

原因:setuptools版本問題

升級setuptools到30.1.0版本以上版本

pip install --upgrade setuptools

40,安裝docker-compose時報錯

聲明:Python 2.7將於2020年1月1日到期,請升級您的Python,因為在該日期之後將不再維護Python 2.7。pip的未來版本將放棄對Python 2.7的支援。

原因:python2.7提示升級

點安裝-i https://pypi.douban.com/simple docker-compose

八,Docker刪除報錯

41,docker刪除容器報錯

來自守護程式的錯誤響應:驅動程式覆蓋無法刪除根檔案系統xxxxx:remove / var / lib / docker / overlay2 / xxxxx / merged:裝置或資源繁忙

原因:容器掛載資料卷,無法直接刪除

grep docker / proc / * / mountinfo | grep xxxxx

kill程序後

再重新刪除容器

42,狀態宕機的容器刪除報錯

來自守護程式的錯誤響應:驅動程式aufs無法刪除根檔案系統XXXXXXXXXXXXXXXX:aufs:重試後解除安裝錯誤:/ var / lib / docker / aufs / mnt / xxxxxxxx:裝置或資源繁忙

原因:dead狀態容器無法刪除,還在佔用資源

docker rm -fv容器id過幾分鐘後會自動刪除

43,泊塢窗刪除錯誤報錯

來自守護程式的錯誤響應:衝突:無法刪除儲存庫引用「 XXXX」(必須強制)-容器XXXX正在使用其引用的映像YYYY

原因:必然正在被某容器使用

需要刪除相關ID容器後,才能刪除

44,碼頭工人刪除錯誤報錯

來自守護程式的錯誤響應:衝突:無法刪除XXXXXXXXXX(必須強制執行)-在多個儲存庫中引用了影象

原因:重新登入push了更長的其他倉庫

如果不需要此補充,docker rmi -f強刪

45,泊塢窗刪除錯誤報錯

來自守護程式的錯誤響應:衝突:無法刪除XXX(無法強制執行)-影象具有相關的子影象

原因:存在依賴於父本身的子整合

強制刪除或者或者批量刪除容器,再刪除更多

九,其他報錯

46,docker:來自守護程式的錯誤響應:驅動程式無法對端點XXXXXXX上的外部連線進行程式設計:( iptables失敗:iptables --wait -t過濾器-A DOCKER!-i docker0 -o docker0 -p tcp -d 172.17.0.2- -dport 8080 -j接受:iptables:該名稱沒有鏈/目標/匹配。

原因:防火牆問題引起

關閉防火牆,重啟docker

47,

執行docker info出現如下警告

警告:bridge-nf-call-iptables已禁用

警告:bridge-nf-call-ip6tables已禁用

原因:配置問題引起,需要啟用bridge-nf-call-iptables

vi /etc/sysctl.conf

新增以下內容

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.bridge.bridge-nf-call-arptables = 1

48,

docker資料庫相關報錯

使用Docker創建mysql容器閃退

資料庫未初始化,並且未指定密碼選項

docker運行-d -e MYSQL_ROOT_PASSWORD = [密碼] -p 3306:3306 mysql

為避免出現各種奇怪且偶發的問題,運維和開發人員應該有規範的去使用docker容器,最大程度的去避免因為使用不當而引起的故障,參考以下:

Docker使用規範建議

儘量使用最近1-2年的新的穩定的docker版本不要去安裝今年前很老的版本,大量的bug已經被新版本更新解決掉了儘量不要去創造非常大的替代,例如5G10G以上的最好要輕量化,去除多餘的軟體,資料等容器內掛載宿主機配置,使用替代容器需要-v主機的配置檔案,儘量使用ro替換資料要掛載主機機物理硬碟或儲存矩陣上不要直接在容器裡運行,避免容器停機機引起資料丟失應用日誌一定要掛到宿主機上不要直接列印到容器內部,避免只能docker logs方式檢視,避免去vulume目錄裡檢視日誌不要只使用latest標籤標籤要有個管理標準,可以根據標籤查詢對應版本不要使用容器ip,配置裡更不能寫死(至少172.17.0.x)容器重啟後,ip很可能會變儘量不要在單容器內跑多程序容器不是虛擬機器,儘量做到1個容器,1個程序跨環境可持續保持一致絕對是測試,UAT,生產環境,儘量保持同一個副本,不要變更,環境變更只需要變更環境變數參數做區別一定監控docker容器,即使發現問題建議使用prometheus監控容器一定要限制docker容器的資源尤其是CPU,記憶體,硬碟空間,甚至是網路等,避免侵害佔用主機機的硬體資源


IT145.com E-mail:sddin#qq.com