Docker中進(jìn)行線上問(wèn)題排查常用的19個(gè)命令
在容器化應(yīng)用的生產(chǎn)環(huán)境中,當(dāng)問(wèn)題出現(xiàn)時(shí),快速準(zhǔn)確的診斷和解決能力直接關(guān)系到業(yè)務(wù)的可用性和用戶(hù)體驗(yàn)。
本文總結(jié)了19個(gè)Docker線上問(wèn)題排查的常用命令和工具,掌握這些命令和工具都能顯著提升你的問(wèn)題排查效率。
基礎(chǔ)排查命令
1. docker ps - 容器狀態(tài)檢查
列出所有運(yùn)行中或已停止的容器,這是排查問(wèn)題的第一步。
實(shí)際應(yīng)用:
# 查看所有運(yùn)行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 顯示最近創(chuàng)建的容器 docker ps -n 5 # 只顯示容器ID docker ps -q # 自定義輸出格式 docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
使用技巧:
設(shè)置別名加速日常操作:
# 在~/.bashrc或~/.zshrc中添加 alias dps='docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"'
2. docker logs - 日志分析利器
查看容器日志輸出,是排查應(yīng)用程序內(nèi)部問(wèn)題的基本工具。
實(shí)際應(yīng)用:
# 查看容器日志 docker logs container_id_or_name # 實(shí)時(shí)查看最新日志 docker logs -f container_id_or_name # 查看最近100行日志 docker logs --tail 100 container_id_or_name # 顯示時(shí)間戳 docker logs -t container_id_or_name # 查看特定時(shí)間段的日志 docker logs --since 2023-10-25T10:00:00 --until 2023-10-25T11:00:00 container_id_or_name
使用技巧:
結(jié)合grep提取關(guān)鍵信息:
# 提取錯(cuò)誤信息并顯示上下文 docker logs container_id_or_name 2>&1 | grep -A 3 -B 3 "ERROR" # 查找特定異常 docker logs container_id_or_name | grep "OutOfMemoryError"
3. docker inspect - 容器詳情探測(cè)器
查看容器、鏡像或網(wǎng)絡(luò)的底層詳細(xì)信息,是深入了解容器配置的關(guān)鍵工具。
實(shí)際應(yīng)用:
# 查看容器的詳細(xì)配置 docker inspect container_id_or_name # 提取特定信息(IP地址) docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name # 查看容器的環(huán)境變量 docker inspect --format='{{.Config.Env}}' container_id_or_name # 查看容器的掛載點(diǎn) docker inspect --format='{{range .Mounts}}{{.Source}} -> {{.Destination}}{{end}}' container_id_or_name # 檢查容器的重啟策略 docker inspect --format='{{.HostConfig.RestartPolicy}}' container_id_or_name
使用技巧:
使用jq進(jìn)行高級(jí)過(guò)濾:
# 安裝jq: sudo apt install jq 或 brew install jq docker inspect container_id_or_name | jq '.[0].State.Health'
4. docker stats - 資源監(jiān)控實(shí)時(shí)儀表盤(pán)
提供容器資源使用的實(shí)時(shí)視圖,包括CPU、內(nèi)存、網(wǎng)絡(luò)和磁盤(pán)I/O。
實(shí)際應(yīng)用:
# 查看所有容器的資源使用情況 docker stats # 查看特定容器的資源使用 docker stats container_id_or_name # 自定義格式輸出 docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}" # 一次性輸出當(dāng)前狀態(tài)(不持續(xù)刷新) docker stats --no-stream
使用技巧:
結(jié)合watch命令定期監(jiān)控:
# 每5秒更新一次所有容器的資源狀態(tài) watch -n 5 'docker stats --no-stream'
5. docker exec - 容器內(nèi)部操作工具
在運(yùn)行中的容器內(nèi)執(zhí)行命令,是深入容器內(nèi)部排查問(wèn)題的必備工具。
實(shí)際應(yīng)用:
# 在容器內(nèi)執(zhí)行命令 docker exec container_id_or_name ls -la /app # 進(jìn)入容器的交互式shell docker exec -it container_id_or_name /bin/bash # 以特定用戶(hù)身份執(zhí)行命令 docker exec -u root container_id_or_name cat /etc/passwd # 在特定工作目錄執(zhí)行命令 docker exec -w /app container_id_or_name pwd
使用技巧:
對(duì)于精簡(jiǎn)鏡像,可能需要先安裝調(diào)試工具:
# 在Alpine基礎(chǔ)鏡像中安裝常用工具 docker exec -it container_id_or_name /bin/sh apk add --no-cache curl procps net-tools busybox-extras
高級(jí)排查命令
6. docker top - 容器進(jìn)程查看器
顯示容器內(nèi)運(yùn)行的進(jìn)程,類(lèi)似于主機(jī)上的top命令。
實(shí)際應(yīng)用:
# 查看容器內(nèi)的進(jìn)程 docker top container_id_or_name # 自定義格式(使用ps的格式選項(xiàng)) docker top container_id_or_name aux
使用技巧:
結(jié)合watch命令監(jiān)控進(jìn)程變化:
# 每2秒刷新一次進(jìn)程列表 watch -n 2 "docker top container_id_or_name"
7. docker diff - 文件系統(tǒng)變更檢測(cè)器
顯示容器文件系統(tǒng)相對(duì)于初始鏡像的變化,對(duì)查找配置修改或異常文件非常有用。
實(shí)際應(yīng)用:
# 查看容器文件系統(tǒng)的變更 docker diff container_id_or_name
輸出格式說(shuō)明:
- • A: 文件或目錄被添加
- • D: 文件或目錄被刪除
- • C: 文件或目錄被修改
使用技巧:
結(jié)合grep過(guò)濾特定目錄的變更:
# 只查看/etc目錄下的變更 docker diff container_id_or_name | grep "^. /etc"
8. docker events - 事件歷史記錄器
實(shí)時(shí)顯示Docker守護(hù)進(jìn)程中發(fā)生的事件,如容器的創(chuàng)建、啟動(dòng)、停止等。
實(shí)際應(yīng)用:
# 實(shí)時(shí)查看Docker事件 docker events # 查看過(guò)去的事件 docker events --since '2023-10-25' # 過(guò)濾特定類(lèi)型的事件 docker events --filter 'type=container' --filter 'event=stop' # 格式化輸出 docker events --format '{{.Time}} {{.Type}} {{.Action}}'
使用技巧:
在另一個(gè)終端執(zhí)行操作,同時(shí)觀察events輸出,可以了解Docker內(nèi)部發(fā)生了什么:
# 終端1 docker events # 終端2 docker start my-container docker stop my-container
9. docker network inspect - 網(wǎng)絡(luò)配置分析工具
檢查Docker網(wǎng)絡(luò)配置,對(duì)排查容器間通信問(wèn)題至關(guān)重要。
實(shí)際應(yīng)用:
# 列出所有網(wǎng)絡(luò) docker network ls # 檢查特定網(wǎng)絡(luò) docker network inspect network_name # 查看網(wǎng)絡(luò)中所有容器 docker network inspect network_name --format='{{range .Containers}}{{.Name}} {{.IPv4Address}}{{end}}' # 連接容器到網(wǎng)絡(luò) docker network connect network_name container_id_or_name # 斷開(kāi)容器與網(wǎng)絡(luò)的連接 docker network disconnect network_name container_id_or_name
使用技巧:
使用專(zhuān)用的網(wǎng)絡(luò)調(diào)試容器:
# 啟動(dòng)一個(gè)網(wǎng)絡(luò)工具容器并連接到目標(biāo)網(wǎng)絡(luò) docker run --rm -it --network=target_network nicolaka/netshoot # 在容器中使用各種網(wǎng)絡(luò)工具 ping container_name dig container_name tcpdump -i eth0
10. docker-compose logs - 多容器日志聚合器
同時(shí)查看docker-compose管理的多個(gè)相關(guān)容器的日志,對(duì)微服務(wù)架構(gòu)排障特別有用。
實(shí)際應(yīng)用:
# 查看所有服務(wù)的日志 docker-compose logs # 查看特定服務(wù)的日志 docker-compose logs service_name # 持續(xù)查看日志 docker-compose logs -f # 查看最近的日志 docker-compose logs --tail=100 # 顯示時(shí)間戳 docker-compose logs -t
使用技巧:
在復(fù)雜系統(tǒng)中跟蹤請(qǐng)求:
# 使用請(qǐng)求ID或會(huì)話ID跟蹤請(qǐng)求流程 docker-compose logs | grep "request-xyz-123"
11. docker history - 鏡像構(gòu)建分析工具
顯示鏡像的構(gòu)建歷史,幫助了解鏡像的構(gòu)成和潛在問(wèn)題。
實(shí)際應(yīng)用:
# 查看鏡像的構(gòu)建歷史 docker history image_name:tag # 顯示完整的命令(不截?cái)? docker history --no-trunc image_name:tag # 格式化輸出 docker history --format "{{.CreatedBy}}: {{.Size}}" image_name:tag
使用技巧:
分析鏡像大小問(wèn)題:
# 查找最大的層 docker history image_name:tag --format "{{.Size}}: {{.CreatedBy}}" | sort -hr | head -5
12. docker system df - 磁盤(pán)使用分析器
顯示Docker使用的磁盤(pán)空間情況,包括鏡像、容器和卷的空間占用。
實(shí)際應(yīng)用:
# 查看Docker磁盤(pán)使用概況 docker system df # 顯示詳細(xì)信息,包括未使用的對(duì)象 docker system df -v
使用技巧:
定期監(jiān)控磁盤(pán)使用情況:
# 創(chuàng)建定時(shí)任務(wù)監(jiān)控Docker磁盤(pán)使用 echo "0 9 * * * docker system df -v | mail -s 'Docker Disk Usage Report' admin@example.com" | crontab
13. docker system prune - 資源清理工具
清理未使用的Docker資源,包括停止的容器、未使用的網(wǎng)絡(luò)、懸空鏡像和構(gòu)建緩存。
實(shí)際應(yīng)用:
# 基本清理 docker system prune # 清理包括未使用的鏡像 docker system prune -a # 清理包括未使用的數(shù)據(jù)卷 docker system prune -a --volumes # 強(qiáng)制清理(不提示) docker system prune -f
使用技巧:
在CI/CD流水線中自動(dòng)清理:
# Jenkins流水線中的清理步驟 stage('Cleanup') { steps { sh 'docker system prune -f' } }
第三方排查工具
14. ctop - 容器性能監(jiān)控可視化工具
提供類(lèi)似top命令的交互式界面,實(shí)時(shí)顯示容器的CPU、內(nèi)存、網(wǎng)絡(luò)等資源使用情況。
安裝方法:
# Linux sudo wget https://github.com/bcicen/ctop/releases/download/v0.7.7/ctop-0.7.7-linux-amd64 -O /usr/local/bin/ctop sudo chmod +x /usr/local/bin/ctop # Mac brew install ctop
實(shí)際應(yīng)用:
# 啟動(dòng)ctop ctop # 按CPU使用率排序(在界面按下's'鍵,選擇CPU)
使用技巧:
ctop界面的快捷鍵:
- • f: 過(guò)濾容器
- • s: 更改排序
- • r: 反轉(zhuǎn)排序
- • o: 切換顯示選項(xiàng)
- • l: 查看容器日志
- • a: 顯示/隱藏非活動(dòng)容器
15. dive - 鏡像層分析工具
交互式探索Docker鏡像內(nèi)容和分層結(jié)構(gòu),幫助優(yōu)化鏡像大小。
安裝方法:
# Linux wget https://github.com/wagoodman/dive/releases/download/v0.10.0/dive_0.10.0_linux_amd64.deb sudo apt install ./dive_0.10.0_linux_amd64.deb # Mac brew install dive
實(shí)際應(yīng)用:
# 分析鏡像 dive image_name:tag # 在CI中分析并強(qiáng)制執(zhí)行效率規(guī)則 CI=true dive --ci-config .dive-ci.yaml image_name:tag
使用技巧:
dive界面快捷鍵:
- • Tab: 在層視圖和文件樹(shù)之間切換
- • Ctrl+U: 移除未更改的文件顯示
- • Ctrl+L: 壓縮目錄視圖
- • Ctrl+S: 保存圖層為tar歸檔文件
16. cadvisor - 容器監(jiān)控與性能分析工具
提供容器資源使用情況的詳細(xì)視圖和歷史數(shù)據(jù),支持與Prometheus等監(jiān)控系統(tǒng)集成。
安裝方法:
# 使用Docker運(yùn)行cAdvisor docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ --privileged \ --device=/dev/kmsg \ gcr.io/cadvisor/cadvisor:v0.45.0
實(shí)際應(yīng)用:
訪問(wèn) http://localhost:8080 查看Web界面,或使用API:
# 獲取特定容器的統(tǒng)計(jì)信息 curl http://localhost:8080/api/v1.3/containers/docker/container_id # 查詢(xún)歷史數(shù)據(jù) curl http://localhost:8080/api/v1.3/containers/docker/container_id/stats?count=60
使用技巧:
與Prometheus和Grafana集成,創(chuàng)建長(zhǎng)期監(jiān)控系統(tǒng):
# prometheus.yml scrape_configs: - job_name: 'cadvisor' static_configs: - targets: ['cadvisor:8080']
17. Portainer - Docker圖形化管理工具
提供Docker環(huán)境的Web界面管理工具,簡(jiǎn)化容器、鏡像、網(wǎng)絡(luò)和卷的管理與監(jiān)控。
安裝方法:
# 安裝Portainer社區(qū)版 docker volume create portainer_data docker run -d -p 8000:8000 -p 9443:9443 --name portainer \ --restart=always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
實(shí)際應(yīng)用:
訪問(wèn) https://localhost:9443 設(shè)置管理員賬號(hào)并登錄
使用技巧:
創(chuàng)建多個(gè)環(huán)境,集中管理多個(gè)Docker主機(jī):
1. 設(shè)置→環(huán)境→添加環(huán)境
2. 選擇Docker API或Kubernetes API連接方式
3. 提供遠(yuǎn)程Docker主機(jī)的連接信息
18. netshoot - 網(wǎng)絡(luò)故障排查專(zhuān)用容器
包含幾十種網(wǎng)絡(luò)調(diào)試和排障工具的專(zhuān)用容器,用于深入分析容器網(wǎng)絡(luò)問(wèn)題。
使用方法:
# 啟動(dòng)netshoot并連接到目標(biāo)網(wǎng)絡(luò) docker run --rm -it --network=target_network nicolaka/netshoot # 使用特定網(wǎng)絡(luò)命名空間啟動(dòng) docker run --rm -it --net container:target_container nicolaka/netshoot
實(shí)際應(yīng)用:
# 在netshoot容器中使用各種網(wǎng)絡(luò)工具 ping service_name dig service_name curl -v service_name:port/health tcpdump -i eth0 -n port 80 nslookup service_name iptables -L
使用技巧:
創(chuàng)建網(wǎng)絡(luò)拓?fù)鋱D:
# 使用netshoot中的工具生成網(wǎng)絡(luò)拓?fù)? docker run --rm -it --net host nicolaka/netshoot brew install -f && brew
19. lazydocker - 終端UI管理工具
提供終端界面的Docker管理工具,可以在無(wú)GUI環(huán)境中方便地管理和監(jiān)控容器。
安裝方法:
# Linux/Mac curl https://raw.githubusercontent.com/jesseduffield/lazydocker/master/scripts/install_update_linux.sh | bash # 使用Go安裝 go install github.com/jesseduffield/lazydocker@latest
實(shí)際應(yīng)用:
# 啟動(dòng)lazydocker lazydocker
使用技巧:
lazydocker快捷鍵:
- • x: 顯示菜單
- • a: 顯示所有容器(包括停止的)
- • e: 進(jìn)入容器的交互式shell
- • l: 查看容器日志
- • s: 停止容器
- • r: 重啟容器
- • d: 刪除容器
到此這篇關(guān)于Docker中進(jìn)行線上問(wèn)題排查常用的19個(gè)命令的文章就介紹到這了,更多相關(guān)Docker問(wèn)題排查命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS 7安裝Docker服務(wù)詳細(xì)過(guò)程
這篇文章主要為大家介紹了CentOS 7安裝Docker服務(wù)詳細(xì)過(guò)程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11docker根據(jù)已生成的容器生成docker-compose.yml文件的實(shí)現(xiàn)步驟
這篇文章主要給大家介紹了docker 如何根據(jù)已生成的容器生成docker-compose.yml 文件,文中有詳細(xì)的代碼示例和實(shí)現(xiàn)步驟,對(duì)大家的學(xué)習(xí)有一定的幫助,需要的朋友可以參考下2023-10-10docker部署mysql 實(shí)現(xiàn)遠(yuǎn)程連接的示例代碼
這篇文章主要介紹了docker部署mysql 實(shí)現(xiàn)遠(yuǎn)程連接的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Docker安裝配置Oracle詳細(xì)步驟記錄(以作持久化處理)
docker是一個(gè)用Go語(yǔ)言實(shí)現(xiàn)的開(kāi)源項(xiàng)目,可以讓我們方便的創(chuàng)建和使用容器,下面這篇文章主要給大家介紹了關(guān)于Docker安裝配置Oracle詳細(xì)步驟的相關(guān)資料,需要的朋友可以參考下2024-03-03Docker 命令自動(dòng)補(bǔ)全的實(shí)現(xiàn)
這篇文章主要介紹了Docker 命令自動(dòng)補(bǔ)全的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12docker安裝后導(dǎo)致的網(wǎng)絡(luò)問(wèn)題及解決
這篇文章主要介紹了docker安裝后導(dǎo)致的網(wǎng)絡(luò)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11使用Docker快速搭建Oracle開(kāi)發(fā)環(huán)境的方法教程
這篇文章主要給大家介紹了使用Docker快速搭建Oracle開(kāi)發(fā)環(huán)境的方法教程,文中給出了詳細(xì)的解決方法,對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-06-06