Docker 容器调试技巧

在开发和运维过程中,调试 Docker 容器中的应用或服务是一个常见且重要的任务。由于容器是相互隔离的,容器内部的日志和错误信息可能不像传统的服务器那样直观,因此掌握 Docker 容器调试技巧对于快速定位和解决问题至关重要。

本文将介绍一些常用的 Docker 容器调试技巧,帮助你有效排查问题并提高容器应用的可靠性。


1. 查看容器的日志

Docker 提供了多种方式查看容器的输出日志,帮助你理解容器内部的运行状况。

1.1 使用 docker logs 查看容器日志

docker logs 命令可以查看容器的标准输出(stdout)和标准错误(stderr)日志。最常见的用法是查看容器启动时的日志输出。

docker logs <container_id>
  • -f:实时查看日志(类似 tail -f)。

    docker logs -f <container_id>
    
  • --tail:查看最后几行日志,避免日志太多时查看不便。

    docker logs --tail 100 <container_id>
    
  • --since:显示某个时间点之后的日志,例如:

    docker logs --since="2023-01-01T13:23:10" <container_id>
    

1.2 查看容器的内存、CPU 和网络使用情况

使用 docker stats 可以查看容器的实时性能指标,如 CPU 使用率、内存占用、网络和磁盘 I/O 等。

docker stats <container_id>

这将显示类似以下的信息:

CONTAINER ID   NAME               CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
abc123456789   my-container       0.10%     23.34MiB / 2GiB       1.14%     1.42MB / 2.1MB    5.98MB / 0B       5

1.3 日志驱动和日志存储

Docker 支持多种 日志驱动,你可以通过修改容器的日志驱动来管理日志存储和输出。例如,使用 --log-driver=syslog 可以将日志输出到系统日志。

docker run --log-driver=syslog my-container

2. 进入容器内部调试

2.1 使用 docker exec 进入容器

docker exec 命令允许你进入正在运行的容器内部并执行命令。这对于调试和检查容器内的文件、进程等非常有用。

docker exec -it <container_id> bash
  • -it:交互模式,允许你与容器进行交互。
  • bash:进入容器的 bash shell。

如果容器内部没有 bash,可以尝试使用 sh 或其他可用的 shell。

2.2 检查容器内的进程

进入容器后,你可以使用命令检查容器内正在运行的进程。

ps aux

或者使用 top 命令查看容器的资源使用情况。

top

2.3 查看容器内的文件

进入容器后,可以通过 lscattail 等命令查看和分析容器内的文件和配置文件。

cat /etc/nginx/nginx.conf
tail -f /var/log/nginx/access.log

3. 容器内的网络调试

3.1 查看容器的网络配置

容器通常会分配一个独立的 IP 地址,你可以使用以下命令查看容器的网络设置:

docker inspect <container_id> | grep "IPAddress"

这将输出容器的 IP 地址,你可以在同一网络中的其他容器间使用该 IP 地址进行通信。

3.2 测试容器内的网络连接

你可以在容器内使用 pingcurl 等工具测试网络连接,确保容器能够访问外部网络或其他服务。

ping google.com
curl http://localhost:8080

3.3 容器间的网络通信

在 Docker 中,不同容器之间通常通过 Docker 网络 进行通信。如果你使用了 自定义网络,容器可以通过容器名进行通信,而不需要显式使用 IP 地址。

例如,假设你有一个 Nginx 容器和一个 Web 应用容器,如果它们在同一自定义网络中,Nginx 可以通过 Web 应用容器的名称来访问它。

docker network create my_network
docker run --name nginx-container --network my_network nginx
docker run --name web-app-container --network my_network my-web-app

4. 容器日志调试和输出重定向

4.1 使用 docker logs 输出调试信息

如果容器没有标准输出(如日志丢失或没有配置日志),你可以通过以下命令输出容器的日志,或通过容器执行时的 stdoutstderr 捕获日志。

docker logs <container_id> > output.log 2>&1
  • > output.log:将标准输出重定向到文件。
  • 2>&1:将标准错误输出也重定向到文件。

4.2 配置日志驱动

可以通过配置不同的日志驱动来改变 Docker 容器的日志行为。例如,你可以将日志输出到文件、syslog 或第三方日志聚合服务。

docker run --log-driver=syslog my-container

5. 容器的资源限制和性能调优

5.1 限制容器的资源

Docker 允许限制容器使用的 CPU 和内存资源。如果容器超出了这些限制,Docker 会自动限制其资源使用,防止容器占用过多资源影响系统的其他部分。

docker run --memory="512m" --cpus="1.0" my-container
  • --memory:限制容器的内存使用。
  • --cpus:限制容器使用的 CPU 数量。

5.2 容器性能监控

使用 docker stats 命令查看容器的性能指标,包括 CPU 使用率、内存占用、网络 I/O 等。

docker stats <container_id>

6. Docker 容器调试工具

6.1 Docker Desktop 提供的调试功能

如果你在 Docker Desktop 上运行容器,可以使用其 图形界面 来查看容器的日志、性能指标、进程等。这对于调试来说非常直观,适用于开发和测试环境。

6.2 使用 Docker Compose 管理多容器调试

如果你的应用使用 Docker Compose,可以使用以下命令查看多个容器的日志:

docker-compose logs

使用 docker-compose logs -f 可以实时查看容器日志。

6.3 使用 docker exec 启动交互式 shell 调试

docker exec 是容器调试的重要工具,可以帮助你进入容器内部运行诊断命令。如果遇到容器中的服务无法启动或崩溃,你可以进入容器并手动检查问题。

docker exec -it <container_id> bash

进入容器后,可以执行命令来检查日志、进程、网络等信息。


7. 总结

Docker 容器调试技巧帮助开发者快速识别和解决问题。常用的调试方法包括:

  • 查看日志:使用 docker logs 和日志驱动进行日志查看和管理。
  • 进入容器:使用 docker exec 进入容器内部进行手动调试和问题排查。
  • 网络调试:检查容器的网络配置,测试网络连接,确保容器间能够正常通信。
  • 资源限制:设置容器的资源限制,避免过度占用宿主机资源。
  • 性能监控:使用 docker stats 和其他监控工具进行容器的性能调优。

通过这些技巧,你可以更加高效地管理和排查 Docker 容器中的问题,提升开发和运维的效率! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/22500.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ProtoBuf] 介绍 | 保姆级win/linux安装教程

目录 一、序列化概念 二、ProtoBuf 是什么 三、ProtoBuf 的使用特点 ProtoBuf 在不同操作系统下的安装 一、ProtoBuf 在 Windows 下的安装 二、ProtoBuf 在 Linux 下的安装 三、检查是否安装成功 安装教程 可以直接目录跳转到后面 笔记参考&#xff1a;官方文档 一、序…

element ui的select选择框

我们首先先试一下&#xff0c;这个东西怎么玩的 <el-select v-model"select" change"changeSelect"><el-option value"香蕉"></el-option><el-option value"菠萝"></el-option><el-option value&quo…

51单片机学习之旅——定时器

打开软件 1与其它等于其它&#xff0c;0与其它等于0 1或其它等于1&#xff0c;0或其它等于其它 TMODTMOD&0xF0;//0xF01111 0000进行与操作&#xff0c;高四位保持&#xff0c;低四位清零&#xff0c;高四位定时器1&#xff0c;低四位定时器0 TMODTMOD|0x01;//0x010000 0…

【跟我学YOLO】(1)YOLO12:以注意力为中心的物体检测

欢迎关注『跟我学 YOLO』系列 【跟我学YOLO】&#xff08;1&#xff09;YOLO12&#xff1a;以注意力为中心的物体检测] 0. YOLOv12 简介0.1 YOLO12 论文下载0.2 YOLO12 的主要改进0.3 YOLO12 支持的任务和性能0.4 论文摘要 1. 背景介绍2. 相关的工作3. 方法3.1 效率分析3.2 区域…

基于Martin的全国基础底图实现

概述 前面有文章基于Martin实现MapboxGL自定义底图分享了Martin的使用&#xff0c;本文使用网络收集的数据实现了全国基础数据的收集和基础底图。 实现后效果 实现 1. 数据准备 实例中包含如下数据&#xff1a; 边界线和九段线数据省边界面数据省会城市点数据市边界面数据…

网页版的俄罗斯方块

1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…

HTML之JavaScript DOM简介

HTML之JavaScript DOM简介 DOM对象是一个树形对象 DOM树上的结点类型分类&#xff1a; 元素节点 element 标签属性节点 attribute 属性文本节点 text 双标签中间的文本 HTML代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UT…

【MATLAB例程】RSSI/PLE定位与卡尔曼滤波NLOS抑制算法,附完整代码

本 MATLAB 代码实现了基于接收信号强度指示(RSSI)和路径损耗模型(PLE)的定位算法,并结合卡尔曼滤波技术进行非视距(NLOS)干扰抑制。通过模拟真实运动轨迹,代码展示了如何在存在NLOS干扰的情况下进行有效的定位。订阅专栏后,可阅读完整代码,可直接运行 文章目录 运行结…

使用IDEA提交SpringBoot项目到Gitee上

登录Gitee并新建仓库 创建本地仓库 提交本地代码到本地仓库 提交本地代码到远程仓库

LLM Agent:PaSa

阅读原文 LLM Agent&#xff1a;PaSa 以 PaSa&#xff08;Paper Search&#xff09;为例&#xff0c;接下来将介绍由 LLM 驱动的先进的论文搜索智能体。PaSa 能够自主做出一系列决策&#xff0c;包括调用搜索工具、阅读论文以及选择相关参考文献&#xff0c;最终为复杂的学术…

Linux提权之脏牛Dirty COW CVE-2016-5195 (四)

CVE-2016-5195&#xff08;Dirty Cow脏牛&#xff09; 脏牛提权的利用方式不同于其他的内核溢出提权&#xff0c;这里单独记录 脏牛是一个非常经典的内核提权漏洞&#xff0c;存在Linux内核中已经有长达9年的时间&#xff0c;在2007年发布的Linux内核版本中就已经存在此漏洞&…

基于SpringBoot+vue+uniapp的智慧旅游小程序+LW示例参考

系列文章目录 1.基于SSM的洗衣房管理系统原生微信小程序LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统LW参考示例 3.基于SpringBootVue的企业人事管理系统LW参考示例 4.基于SSM的高校实验室管理系统LW参考示例 5.基于SpringBoot的二手数码回收系统原生微信小程序LW参考示…

【微服务】深入解析spring aop原理

目录 一、前言 二、AOP 概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk动态代理模拟实现 3.2 CGLIB 代理…

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体

vxe-table 如何实现跟 Excel 一样的数值或金额的负数自动显示红色字体&#xff0c;当输入的值为负数时&#xff0c;会自动显示红色字体&#xff0c;对于数值或者金额输入时该功能就非常有用了。 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.co…

C++:dfs,bfs各两则

1.木棒 167. 木棒 - AcWing题库 乔治拿来一组等长的木棒&#xff0c;将它们随机地砍断&#xff0c;使得每一节木棍的长度都不超过 5050 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态&#xff0c;但忘记了初始时有多少木棒以及木棒的初始长度。 请你设计一个程序…

MATLAB学习之旅:从入门到基础实践

在当今科技飞速发展的时代,MATLAB作为一款强大的数学软件,犹如一把神奇的钥匙,能够打开众多领域的大门。无论是工程计算、数据分析,还是算法开发、可视化呈现,MATLAB都展现出了无与伦比的魅力。今天,就让我们踏上这段奇妙的MATLAB学习之旅,从最基础的部分开始,逐步探索…

verilog笔记

Verilog学习笔记&#xff08;一&#xff09;入门和基础语法BY电棍233 由于某些不可抗拒的因素和各种的特殊原因&#xff0c;主要是因为我是微电子专业的&#xff0c;我需要去学习一门名为verilog的硬件解释语言&#xff0c;由于我是在某西部地区的神秘大学上学&#xff0c;这所…

基于SpringBoot的城乡商城协作系统【附源码】

基于SpringBoot的城乡商城协作系统 效果如下&#xff1a; 系统登陆页面 系统管理员主页面 商品信息管理页面 系统用户主页面 社区交流页面 用户充值页面 订单提交页面 商品信息页面 研究背景 随着互联网技术的飞速发展&#xff0c;电子商务在我国城乡地区的普及程度越来越高…

tortoiseSVN 如何克隆项目到本地

导入项目成功&#xff0c;如下图&#xff1a;

1.1 go环境搭建及基本使用

golang下载地址&#xff1a; Download and install - The Go Programming Language (google.cn) 验证安装是否成功&#xff1a; go version 查看go环境 go env 注意&#xff1a;Go1.11版本之后无需手动配置环境变量,使用go mod 管理项目&#xff0c;也不需要把项目放到GO…