Ubuntu下调试Docker容器应用的常用方法
日志是定位容器问题的首要线索,可通过docker logs命令获取容器内应用的标准输出(stdout)和标准错误(stderr)。常用选项包括:
-f/--follow:实时跟踪日志输出(类似tail -f);--tail=N:仅显示最后N条日志(如--tail=100查看最后100条);--since=timestamp:显示指定时间后的日志(如--since="2025-10-25"查看10月25日后的日志);-t:添加时间戳(便于分析日志时间点)。docker logs -f --tail=50 my_node_app可实时查看my_node_app容器最后50条日志。若需直接操作容器内的文件系统、进程或配置,可使用docker exec命令进入运行中的容器。常用选项:
-it:分配交互式终端(需配合Shell使用,如/bin/bash或/bin/sh);-u:指定用户(如-u root以root权限进入);-w:设置工作目录(如-w /app进入容器内的/app目录)。docker exec -it my_node_app /bin/bash会打开容器的bash终端,可在其中运行ls、cat、ps等命令调试。若容器内无bash,可替换为sh。docker ps可列出所有运行中的容器,docker ps -a则显示所有容器(包括已停止的),帮助确认容器是否正常运行。docker inspect <容器ID或名称>可获取容器的完整配置(如端口映射、网络设置、环境变量、挂载卷等),便于排查配置错误。示例:docker inspect my_node_app会输出JSON格式的容器详情。容器网络问题(如端口冲突、无法访问外部服务)可通过以下命令排查:
docker network inspect <网络名称>(如bridge网络)可查看容器的网络设置(IP地址、端口映射、网关等);ss -tulpn | grep <端口>或netstat -tulpn | grep <端口>(需安装net-tools)查看宿主机端口是否被占用。示例:ss -tulpn | grep 3000可检查3000端口是否被my_node_app容器占用。针对不同编程语言的应用,可通过暴露调试端口进行远程调试:
debugpy库,在容器内运行python -m debugpy --listen 0.0.0.0:5678 --wait-for-client app.py,然后在VS Code中配置launch.json连接到localhost:5678;inspector模块,运行node --inspect=0.0.0.0:9229 app.js,通过Chrome DevTools或VS Code连接localhost:9229;JDWP调试协议,运行java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar,通过IntelliJ IDEA或Eclipse连接localhost:5005。docker run -p 5678:5678 my_python_app会将容器的5678端口映射到宿主机,供调试工具连接。若应用由多个容器组成(如前端+后端+数据库),可使用docker-compose管理:
docker-compose logs <服务名称>(如docker-compose logs web)可查看指定服务的日志;docker-compose exec <服务名称> /bin/bash可进入指定服务的容器;docker-compose up -d --build会根据docker-compose.yml重新构建镜像并启动服务,便于应用代码或配置修改后的调试。若需深入排查系统调用、库调用等问题,可在容器内安装系统级调试工具:
docker exec -it my_container strace -f -o /tmp/strace.log ls(记录ls命令的系统调用到/tmp/strace.log);docker exec -it my_container ltrace -f -o /tmp/ltrace.log ls(记录ls命令的库调用到/tmp/ltrace.log)。docker exec -it my_container apt-get update && apt-get install -y strace ltrace安装。若需长期调试,可在Dockerfile中添加调试工具(避免每次进入容器手动安装):
示例:在Dockerfile中添加RUN apt-get update && apt-get install -y bash telnet strace ltrace,然后重新构建镜像(docker build -t my_debug_app .)并运行。这样容器内会预装bash、telnet等工具,便于调试。