日志是定位容器问题的首要工具。通过docker logs命令可查看容器的标准输出和错误流(需容器运行时开启日志记录);若容器未运行或需查看详细守护进程日志,可使用journalctl -u docker.service(系统日志)或sudo dockerd --debug(开启Docker守护进程调试模式,需修改/etc/docker/daemon.json添加"debug": true并重启服务)。这些日志能快速定位容器启动失败、进程崩溃等问题。
进入容器是调试的核心手段,常用以下命令:
docker exec(推荐):在运行中的容器内执行命令或打开交互式Shell。例如,进入Ubuntu容器的bash终端:docker exec -it <容器ID或名称> /bin/bash(若容器无bash,可替换为/bin/sh,如Alpine Linux镜像)。docker attach:连接到容器的主进程(如nginx、mysql的服务进程),适合调试服务本身的运行状态。需注意,使用CTRL + P + Q安全退出,避免误终止容器。nsenter:通过容器的PID进入其命名空间(需安装util-linux包),适合需要直接操作容器内核命名空间的场景(如查看容器内的进程树、网络接口)。步骤:先通过docker inspect --format "{{.State.Pid}}" <容器ID>获取PID,再执行nsenter --target <PID> --mount --uts --ipc --net --pid /bin/bash。若容器因主进程退出而停止(如命令执行完毕),需通过以下方式保持容器运行:
tail -f /dev/null:在容器内运行无限循环命令,例如:docker run -d --name my_container ubuntu tail -f /dev/null。CMD或ENTRYPOINT改为长期运行命令(如tail -f /dev/null),重新构建镜像后运行。docker-compose.yml中为服务添加command: tail -f /dev/null,覆盖镜像的默认命令。docker ps:查看正在运行的容器列表,确认容器是否处于运行状态。docker ps -a:查看所有容器(包括已停止的),定位未正常启动的容器。docker inspect <容器ID>:查看容器的详细配置(如端口映射、挂载卷、环境变量、启动命令),识别配置错误(如端口冲突、挂载路径不存在)。网络问题是容器调试的常见场景,可通过以下工具排查:
docker network inspect <网络名称>:查看容器所在网络的配置(如子网、网关、IP分配),确认网络连通性。ping/traceroute:测试容器与外部服务(如数据库、API)的网络连通性。netstat/ss:查看容器内的网络连接状态(如端口监听、连接队列),例如:docker exec -it <容器ID> ss -tulpn。tcpdump:捕获容器内的网络流量(需安装tcpdump),例如:docker exec -it <容器ID> tcpdump -i eth0 port 80,分析请求响应流程。性能瓶颈(如CPU、内存占用过高)可通过以下工具分析:
docker stats:实时查看所有容器的CPU、内存、网络、磁盘IO使用率,快速定位资源占用过高的容器。top/htop:进入容器内查看进程的资源占用情况(需安装htop),例如:docker exec -it <容器ID> htop。perf:分析容器内应用程序的性能热点(如CPU缓存命中率、函数调用栈),需在Dockerfile中安装perf工具。对于开发调试,挂载宿主机目录到容器可实现实时代码修改,无需重新构建镜像。例如:
docker run -it -v /宿主机/项目路径:/容器内/项目路径 -p 3000:3000 node:latest
这样,宿主机上的代码变更会立即同步到容器内,方便调试代码逻辑(如修改前端页面、调整后端接口)。
对于多容器应用(如Web+数据库+缓存),使用Docker Compose管理容器,通过以下命令调试:
docker-compose logs <服务名称>:查看指定服务的日志(如docker-compose logs web)。docker-compose exec <服务名称> /bin/bash:进入指定服务的容器(如docker-compose exec web /bin/bash)。docker-compose up -d:后台启动所有服务,docker-compose down停止并清理容器。Docker提供了docker debug命令(需Docker 24.0及以上版本),可直接进入容器或镜像的Shell,并预装常用调试工具(如vim、nano、htop、curl)。例如:
docker debug --target <容器ID> -- /bin/bash
若容器无Shell,可通过--install参数添加工具(如docker debug --target <容器ID> --install gdb -- /bin/bash)。
以上方法覆盖了Docker容器在Ubuntu中的常见调试场景,可根据具体问题选择合适的方式组合使用。调试时需遵循“从日志到配置、从网络到性能”的逐步排查思路,快速定位问题根源。