最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Docker運維一鍵排查Shell腳本,6大功能搞定容器90%線上故障

 更新時間:2024年10月18日 14:37:48   作者:Flying_Fish_Xuan  
本文介紹了一款自研的Docker一鍵排查Shell腳本,該腳本主要用于Docker容器運維,包括容器重啟、端口占用、磁盤使用、網(wǎng)絡(luò)故障、鏡像臃腫、安全權(quán)限等常見問題的排查,感興趣的朋友一起看看吧

文章簡介

做后端開發(fā)、Linux運維、云原生工程師,日常避不開Docker容器運維:容器莫名重啟、端口占用沖突、服務(wù)器磁盤爆滿、容器域名解析失敗、鏡像體積臃腫、容器安全權(quán)限合規(guī)排查……

傳統(tǒng)排障需要反復(fù)敲 docker ps、docker inspect、docker logs、ssdu 等零散命令,重復(fù)低效還容易遺漏關(guān)鍵排查點。

今天給大家分享一款自研生產(chǎn)級Docker一鍵排查Shell腳本,純原生Bash編寫、無第三方依賴、兼容所有Linux發(fā)行版,封裝6大核心運維場景,一條命令即可完成全維度故障診斷,自帶排障提示,新手也能秒定位線上問題。

一、腳本核心能力概覽

腳本內(nèi)置6個子命令,覆蓋Docker日常運維所有高頻場景:

命令作用場景核心能力
triage restart 容器名容器異常重啟、崩潰排查容器狀態(tài)、退出碼、OOM殺死、日志、重啟策略、健康檢查
triage port 端口號端口沖突、端口映射失效Docker端口映射、主機監(jiān)聽進程、docker-proxy進程排查
triage disk服務(wù)器磁盤爆滿Docker磁盤占用統(tǒng)計、目錄層級占用、容器日志大文件排行
triage net容器網(wǎng)絡(luò)/DNS解析故障網(wǎng)絡(luò)列表、容器/主機DNS對比、路由、MTU網(wǎng)絡(luò)黑洞排查
triage image鏡像臃腫、構(gòu)建緩存清理Docker版本、大鏡像排行、構(gòu)建緩存分析、鏡像優(yōu)化建議
triage sec 容器名容器安全基線檢查特權(quán)模式、只讀根目錄、掛載權(quán)限、Linux能力集、安全參數(shù)

二、腳本安裝部署(一分鐘搞定)

1. 保存腳本

新建文件 triage,將文末完整源碼復(fù)制粘貼進去。

2. 授權(quán)全局可用

# 移動到系統(tǒng)全局命令目錄
mv triage /usr/local/bin/
# 添加執(zhí)行權(quán)限
chmod +x /usr/local/bin/triage

3. 驗證使用

直接終端輸入,查看幫助文檔:

triage

三、基礎(chǔ)使用語法

# 查看幫助
triage -h
triage --help
# 1. 排查容器重啟/崩潰問題
triage restart 容器名/容器ID
# 2. 排查端口占用/映射問題
triage port 8080
# 3. 排查Docker磁盤占用爆滿
triage disk
# 4. 排查容器網(wǎng)絡(luò)/DNS故障
triage net
# 5. 排查鏡像體積/構(gòu)建緩存
triage image
# 6. 容器安全合規(guī)檢查
triage sec 容器名/容器ID

四、六大功能模塊深度解析

1. triage restart 容器排查

專門解決:容器自動重啟、啟動失敗、OOM被殺、健康檢查異常

  • 篩選匹配容器的運行狀態(tài)表格
  • 自動解析容器狀態(tài)、退出碼、OOMKilled、啟動/結(jié)束時間
  • 自動輸出容器最后200行日志
  • 解析重啟策略、健康檢查配置
  • 內(nèi)置排障Hint:137退出碼代表OOM、健康檢查失敗原因等

2. triage port 端口排查

專門解決:端口被占用、Docker端口映射不生效、外部無法訪問容器

  • 篩選占用目標端口的Docker容器
  • 檢測主機ss/netstat端口監(jiān)聽情況
  • 排查docker-proxy代理進程
  • 提示監(jiān)聽127.0.0.1與0.0.0.0的訪問區(qū)別、容器內(nèi)監(jiān)聽配置規(guī)范

3. triage disk 磁盤排查

專門解決:服務(wù)器磁盤告警、Docker莫名占用大量空間

  • 輸出docker system df全局磁盤統(tǒng)計
  • 分析/var/lib/docker目錄層級占用
  • 自動適配自定義Docker根目錄場景
  • 統(tǒng)計容器json日志文件大小,輸出Top20大日志文件
  • 給出安全清理命令、日志持久化配置建議

4. triage net 網(wǎng)絡(luò)排查

專門解決:容器能ping通IP但解析不了域名、跨容器網(wǎng)絡(luò)不通

  • 列出所有Docker網(wǎng)絡(luò)、關(guān)鍵環(huán)境信息
  • 自動獲取第一個運行中容器的DNS、路由配置
  • 對比主機與容器resolv.conf解析配置
  • 提示MTU黑洞、iptables轉(zhuǎn)發(fā)規(guī)則等常見網(wǎng)絡(luò)坑

5. triage image 鏡像排查

專門解決:鏡像體積過大、構(gòu)建緩存堆積、版本兼容問題

  • 展示Docker客戶端/服務(wù)端版本
  • 輸出Top20超大鏡像列表
  • 分析構(gòu)建緩存、鏡像資源占用
  • 給出多階段構(gòu)建、分層優(yōu)化、基礎(chǔ)鏡像版本固化建議

6. triage sec 安全排查

專門解決:容器安全基線加固、特權(quán)容器風險排查

  • 檢測是否特權(quán)模式、運行用戶、只讀根目錄
  • 解析網(wǎng)絡(luò)模式、PID/IPC隔離配置
  • 展示掛載目錄、Cap權(quán)限增減、安全策略
  • 給出生產(chǎn)環(huán)境容器安全最佳實踐建議

五、線上真實故障實戰(zhàn)場景

場景1:業(yè)務(wù)容器頻繁重啟

執(zhí)行命令:

triage restart my-api

腳本自動輸出:容器退出碼、是否OOM殺死、日志報錯、健康檢查失敗原因,快速定位是代碼Bug、內(nèi)存溢出還是配置問題。

場景2:8080端口啟動報錯:address already in use

執(zhí)行命令:

triage port 8080

自動查出是其他Docker容器占用、還是主機進程監(jiān)聽,一鍵定位沖突源。

場景3:服務(wù)器磁盤使用率100%

執(zhí)行命令:

triage disk

快速看到是鏡像、卷、構(gòu)建緩存還是容器日志占滿磁盤,根據(jù)腳本提示執(zhí)行docker system prune安全清理。

場景4:容器內(nèi)無法訪問外網(wǎng)域名

執(zhí)行命令:

triage net

對比主機和容器DNS配置,直接定位解析服務(wù)器配置問題。

六、腳本設(shè)計亮點

  • 嚴格Bash模式set -euo pipefail 嚴格語法校驗,避免腳本異常崩潰;
  • 自動依賴檢測:自動判斷Docker、ss、netstat是否安裝,友好提示;
  • 人性化排版:自帶分割線、表格格式化輸出,日志清晰易讀;
  • 無侵入設(shè)計:純查詢操作,不會修改、刪除任何容器/鏡像數(shù)據(jù),生產(chǎn)環(huán)境可放心使用;
  • 內(nèi)置排障知識庫:每個模塊結(jié)尾附帶運維Hint,新手不用查文檔也能懂;
  • 自適應(yīng)兼容:適配自定義Docker根目錄、無ss自動降級netstat、無運行容器友好提示。

七、完整源碼

#!/usr/bin/env bash
set -euo pipefail
usage() {
  cat <<'EOF'
Docker ops triage (one command).
Usage:
  triage restart <container>
  triage port <port>
  triage disk
  triage net
  triage image
  triage sec <container>
Examples:
  triage restart my-api
  triage port 8080
  triage disk
  triage net
  triage image
  triage sec my-api
EOF
}
need_cmd() { command -v "$1" >/dev/null 2>&1; }
hr() { echo; echo "------------------------------------------------------------"; echo; }
must_docker() {
  if ! need_cmd docker; then
    echo "docker not found in PATH." >&2
    exit 1
  fi
}
cmd_restart() {
  must_docker
  local C="${1:-}"
  if [[ -z "${C}" ]]; then
    echo "Missing <container>" >&2
    exit 2
  fi
echo "== docker ps (matching) =="
docker ps -a --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Image}}' | (head -n 1; grep -E "(^|\\s)${C}(\\s|$)" || true)
hr
echo "== docker inspect (state) =="
docker inspect -f 'Name={{.Name}} Status={{.State.Status}} ExitCode={{.State.ExitCode}} OOMKilled={{.State.OOMKilled}} Error={{.State.Error}} StartedAt={{.State.StartedAt}} FinishedAt={{.State.FinishedAt}}' "${C}" 2>/dev/null || true
hr
echo "== last 200 logs =="
docker logs --tail 200 "${C}" 2>/dev/null || true
hr
echo "== restart policy / healthcheck =="
docker inspect -f 'RestartPolicy={{json .HostConfig.RestartPolicy}} Healthcheck={{json .Config.Healthcheck}}' "${C}" 2>/dev/null || true
hr
echo "== hints =="
echo "- ExitCode=137 often means SIGKILL (commonly OOMKilled)."
echo "- If Healthcheck keeps failing, container may be restarted by orchestrator policies."
echo "- If logs show bind errors, check host port conflicts (triage port <port>)."
}
cmd_port() {
  must_docker
  local PORT="${1:-}"
  if [[ -z "${PORT}" ]]; then
    echo "Missing <port>" >&2
    exit 2
  fi
echo "== docker ps port publish mapping =="
docker ps --format 'table {{.ID}}\t{{.Names}}\t{{.Ports}}' | (head -n 1; grep -E "(:|\\b)${PORT}->" || true)
hr
echo "== host listeners (ss/netstat) =="
if need_cmd ss; then
  ss -lntup 2>/dev/null | grep -E ":(?:${PORT})\\b" || true
elif need_cmd netstat; then
  netstat -lntup 2>/dev/null | grep -E ":(?:${PORT})\\b" || true
else
  echo "ss/netstat not found."
fi
hr
echo "== docker-proxy process (if exists) =="
ps -ef 2>/dev/null | grep -E "docker-proxy.*:${PORT}\\b" | grep -v grep || true
hr
echo "== hints =="
echo "- If you see 0.0.0.0:${PORT}->... in docker ps, the host port is published by Docker."
echo "- If host is listening on 127.0.0.1:${PORT}, external clients can't reach it."
echo "- If container listens only on 127.0.0.1 inside, publish won't help; it must listen on 0.0.0.0 in the container."
}
cmd_disk() {
  must_docker
  echo "== docker system df =="
  docker system df || true
  hr
  echo "== docker system df -v (top part) =="
  docker system df -v 2>/dev/null | sed -n '1,200p' || true
  hr
  echo "== /var/lib/docker usage (top 20 dirs) =="
  if [[ -d /var/lib/docker ]]; then
    du -h --max-depth=2 /var/lib/docker 2>/dev/null | sort -h | tail -n 20 || true
  else
    echo "/var/lib/docker not found (non-Linux host or custom data-root)."
    echo "Check: docker info | grep -i 'Docker Root Dir'"
    docker info 2>/dev/null | grep -i 'Docker Root Dir' || true
  fi
  hr
  echo "== largest container logs (json-file) top 20 =="
  if [[ -d /var/lib/docker/containers ]]; then
    find /var/lib/docker/containers -name '*-json.log' -type f -printf '%s %p\n' 2>/dev/null \
      | sort -n | tail -n 20 | awk '{printf "%.2fMB %s\n",$1/1024/1024,$2}' || true
  fi
  hr
  echo "== hints =="
  echo "- Biggest offenders are usually: images, build cache, volumes, and container json logs."
  echo "- Safe cleanups: docker system prune -f (unused objects), docker image prune -a -f (unused images)."
  echo "- Long-term: configure logging max-size/max-file to cap json-file logs."
}
cmd_net() {
  must_docker
  echo "== docker networks =="
  docker network ls || true
  hr
  echo "== docker info (network related) =="
  docker info 2>/dev/null | egrep -i 'Server Version|Cgroup|Security Options|Docker Root Dir|Registry Mirrors|Live Restore|Network' || true
  hr
  echo "== resolv.conf inside a running container (first one) =="
  local CID
  CID="$(docker ps -q | head -n 1 || true)"
  if [[ -n "${CID}" ]]; then
    docker exec "${CID}" sh -lc 'echo "container: $(hostname)"; cat /etc/resolv.conf; ip route 2>/dev/null || true' 2>/dev/null || true
  else
    echo "No running container found."
  fi
  hr
  echo "== host resolv.conf =="
  cat /etc/resolv.conf 2>/dev/null || true
  hr
  echo "== hints =="
  echo "- If only domain fails inside container, check DNS server in /etc/resolv.conf."
  echo "- MTU issues often show: small requests ok, large requests timeout (blackhole)."
  echo "- For bridge networks, iptables/nft rules and FORWARD policy can break connectivity."
}
cmd_image() {
  must_docker
  echo "== docker version =="
  docker version 2>/dev/null | sed -n '1,120p' || true
  hr
  echo "== largest images (top 20) =="
  docker images --format '{{.Repository}}:{{.Tag}} {{.ID}} {{.Size}}' 2>/dev/null | head -n 20 || true
  hr
  echo "== build cache / system df =="
  docker system df -v 2>/dev/null | sed -n '1,220p' || true
  hr
  echo "== hints =="
  echo "- Use multi-stage builds; keep runtime image minimal."
  echo "- Split dependency layers to maximize cache hits."
  echo "- Pin base image versions for reproducibility."
}
cmd_sec() {
  must_docker
  local C="${1:-}"
  if [[ -z "${C}" ]]; then
    echo "Missing <container>" >&2
    exit 2
  fi
  echo "== inspect security-related fields =="
  docker inspect -f 'Name={{.Name}} User={{.Config.User}} Privileged={{.HostConfig.Privileged}} ReadonlyRootfs={{.HostConfig.ReadonlyRootfs}} NetworkMode={{.HostConfig.NetworkMode}} PidMode={{.HostConfig.PidMode}} IpcMode={{.HostConfig.IpcMode}}' "${C}" 2>/dev/null || true
  hr
  docker inspect -f 'CapAdd={{json .HostConfig.CapAdd}} CapDrop={{json .HostConfig.CapDrop}} SecurityOpt={{json .HostConfig.SecurityOpt}}' "${C}" 2>/dev/null || true
  hr
  echo "== mounts =="
  docker inspect -f 'Mounts={{json .Mounts}}' "${C}" 2>/dev/null | sed -n '1,200p' || true
  hr
  echo "== hints =="
  echo "- Prefer non-root user; avoid privileged and host PID/IPC unless necessary."
  echo "- Use read-only rootfs + writable volumes for data."
  echo "- Drop capabilities by default; add only what is needed."
}
main() {
  local cmd="${1:-}"
  if [[ -z "${cmd}" || "${cmd}" == "-h" || "${cmd}" == "--help" ]]; then
    usage
    exit 0
  fi
  shift || true
  case "${cmd}" in
    restart) cmd_restart "${1:-}" ;;
    port)    cmd_port "${1:-}" ;;
    disk)    cmd_disk ;;
    net)     cmd_net ;;
    image)   cmd_image ;;
    sec)     cmd_sec "${1:-}" ;;
    *)
      echo "Unknown command: ${cmd}" >&2
      usage >&2
      exit 2
      ;;
  esac
}
main "$@"

八、運維總結(jié)

這款腳本把Docker零散的排查命令做了封裝整合,把運維排障經(jīng)驗內(nèi)置到腳本Hint中,無論是日常開發(fā)調(diào)試、線上故障應(yīng)急、服務(wù)器巡檢、容器安全基線檢查都能直接用。

建議收藏部署到所有Linux服務(wù)器,后續(xù)可以基于腳本擴展:增加容器CPU/內(nèi)存排行、一鍵清理無用鏡像、容器定時健康檢測等功能,打造成個人專屬Docker運維工具箱。

到此這篇關(guān)于Docker運維一鍵排查Shell腳本,6大功能搞定容器90%線上故障的文章就介紹到這了,更多相關(guān)Docker排查Shell腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • CentOS 8安裝docker最詳細方法

    CentOS 8安裝docker最詳細方法

    本文給大家介紹CentOS 8安裝docker最詳細教程,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • docker離線安裝并導(dǎo)入鏡像過程

    docker離線安裝并導(dǎo)入鏡像過程

    這篇文章主要介紹了docker離線安裝并導(dǎo)入鏡像過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • springboot整合docker部署實現(xiàn)兩種構(gòu)建Docker鏡像方式

    springboot整合docker部署實現(xiàn)兩種構(gòu)建Docker鏡像方式

    這篇文章主要介紹了springboot整合docker部署實現(xiàn)兩種構(gòu)建Docker鏡像方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • 修改docker網(wǎng)橋網(wǎng)段范圍實現(xiàn)方式

    修改docker網(wǎng)橋網(wǎng)段范圍實現(xiàn)方式

    文章介紹了如何修改Docker默認的172.17.0.0/16網(wǎng)橋網(wǎng)段,以避免與局域網(wǎng)沖突,提供了兩種方法:一種是修改Docker配置文件并重啟服務(wù),另一種是創(chuàng)建自定義網(wǎng)絡(luò)并指定子網(wǎng)范圍,同時,還提到了一些參考命令,如查看docker0網(wǎng)橋信息和刪除docker0網(wǎng)橋
    2025-12-12
  • docker數(shù)據(jù)卷容器掛載不上的解決方法

    docker數(shù)據(jù)卷容器掛載不上的解決方法

    docker容器之間可以通過相互掛載實現(xiàn)數(shù)據(jù)共享,本文主要介紹了docker數(shù)據(jù)卷容器掛載不上的解決方法,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Docker數(shù)據(jù)目錄遷移方法詳解

    Docker數(shù)據(jù)目錄遷移方法詳解

    這篇文章主要介紹了Docker數(shù)據(jù)目錄遷移方法,Docker數(shù)據(jù)目錄遷移成功后再也不用擔心服務(wù)器系統(tǒng)盤目錄被占滿的情況的,本文給大家介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • 將Docker的根目錄遷移到其他掛載盤的詳細流程

    將Docker的根目錄遷移到其他掛載盤的詳細流程

    Docker默認將所有容器、鏡像、數(shù)據(jù)卷等內(nèi)容存放在 /var/lib/docker 下,隨著業(yè)務(wù)增長,該目錄很容易撐爆根分區(qū),所以本文將教你如何將 Docker 的根目錄遷移到其他掛載盤并保持原有容器、鏡像、數(shù)據(jù)卷不丟失,需要的朋友可以參考下
    2025-08-08
  • Dockerfile和docker-compose使用詳解

    Dockerfile和docker-compose使用詳解

    Dockerfile用于構(gòu)建鏡像,包含指令和說明,使用FROM開始構(gòu)建,WORKDIR設(shè)置工作目錄,RUN執(zhí)行命令,COPY拷貝文件,EXPOSE暴露端口,CMD指定容器啟動命令,docker-compose用于管理多容器,通過docker-compose.yml配置,支持多服務(wù)實例,可設(shè)定服務(wù)依賴和環(huán)境變量,支持掛載卷
    2024-11-11
  • docker安裝,yum安裝失敗解決方案,阿里云鏡像安裝過程

    docker安裝,yum安裝失敗解決方案,阿里云鏡像安裝過程

    在配置Yum源遇到問題時,嘗試使用阿里云鏡像可以有效解決,本文詳細介紹了如何配置阿里云源及安裝Docker的步驟,首先,若Yum源配置出錯,建議更換為阿里云鏡像;其次,詳述了安裝Docker的具體命令,包括啟用阿里云源和安裝過程中的選擇提示
    2024-11-11
  • Mac上使用Docker搭建kafka集群方式

    Mac上使用Docker搭建kafka集群方式

    這篇文章主要介紹了Mac上使用Docker搭建kafka集群方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02

最新評論

奉新县| 定南县| 额济纳旗| 类乌齐县| 罗田县| 沙雅县| 宜黄县| 盖州市| 南雄市| 沁源县| 乌拉特前旗| 宣恩县| 怀集县| 彭山县| 外汇| 霸州市| 喀喇沁旗| 绍兴市| 木兰县| 兴安盟| 渝中区| 夹江县| 新化县| 德钦县| 兴安县| 沂水县| 淳安县| 土默特右旗| 治县。| 昂仁县| 大冶市| 黑龙江省| 稷山县| 沙雅县| 汾阳市| 芷江| 云阳县| 荣成市| 梓潼县| 宿松县| 论坛|