在Debian系统上调试Docker容器,可通过进入容器内部、远程附加调试器或底层命名空间操作等方式实现,以下是具体方法:
docker exec直接进入容器调试这是最常用的快速调试方法,适用于大多数运行中的容器。通过docker exec命令进入容器内部,使用容器内的调试工具(如gdb、pdb)进行调试。
docker run -it --name=my_container debian /bin/bash
docker exec -it my_container /bin/bash
gdb为例):apt-get update && apt-get install -y gdb
/usr/bin/myapp):gdb /usr/bin/myapp
gdb中设置断点、运行程序(run)、单步执行(next)等。nsenter进入容器底层命名空间当容器内无Shell或无法通过docker exec进入时(如容器崩溃),nsenter可让你直接进入容器的进程、网络、挂载等命名空间,模拟容器内的运行环境。
nsenter(Debian默认包含在util-linux包中):sudo apt-get install util-linux
CONTAINER_PID=$(docker inspect --format '{{.State.Pid}}' my_container)
sudo nsenter -t $CONTAINER_PID -m -u -i -n -p /bin/bash
ps aux查看进程、ip addr查看网络、gdb调试进程等。适用于需要宿主机与容器分离调试的场景(如开发机调试远程容器),通过gdbserver在容器内启动调试服务,宿主机通过GDB远程连接。
gdbserver:Dockerfile中添加:RUN apt-get update && apt-get install -y gdbserver
构建并运行容器:docker build -t my_debug_image .
docker run -it --rm -p 12345:12345 my_debug_image /bin/bash
gdbserver:/app/myapp,运行:gdbserver localhost:12345 /app/myapp
gdbserver:gdb(sudo apt-get install gdb),并指定容器内程序的路径(需与容器内一致):gdb /app/myapp
在gdb中连接容器内的gdbserver:(gdb) target remote 127.0.0.1:12345
VS Code的Remote - Containers扩展可让你直接在容器内开发、调试,无需手动进入容器,支持断点、变量查看等功能。
.devcontainer/devcontainer.json文件,配置容器环境(以Python为例):{
"name": "Python Debug Container",
"dockerComposeFile": "docker-compose.yml",
"service": "app",
"workspaceFolder": "/app",
"extensions": ["ms-python.python"],
"settings": {
"terminal.integrated.defaultProfile.linux": "bash"
}
}
docker-compose.yml,定义服务及调试端口:version: '3'
services:
app:
build: .
ports:
- "5678:5678"
volumes:
- .:/app
command: ["python", "-m", "debugpy", "--listen", "0.0.0.0:5678", "--wait-for-client", "app.py"]
debugpy):import debugpy
debugpy.listen(("0.0.0.0", 5678))
print("Waiting for debugger attach...")
debugpy.wait_for_client()
F5启动远程调试,选择“Python: Remote Attach”配置,即可连接容器内的调试服务。docker logs -f my_container实时查看容器输出,或docker logs my_container | grep "error"过滤关键字。docker network inspect my_network查看容器网络拓扑,或nsenter -t $PID -n ip addr进入容器网络命名空间查看IP地址。docker port my_container查看容器端口与宿主机的映射关系,确保调试端口(如5678、9229)已正确映射。以上方法覆盖了Debian环境下调试Docker容器的常见场景,可根据具体需求选择合适的方式。例如,快速排查问题用docker exec,底层调试用nsenter,远程开发用VS Code。