Docker 镜像调试的最佳实践

 更新时间:2025年05月27日 08:31:26   作者:长天一色  
本文主要介绍了Docker 镜像调试的最佳实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

当你已经构建了一个 Docker 镜像,但运行它的容器启动后立即退出(通常是因为服务异常或配置错误),你仍然可以通过以下几种方式进入镜像内部进行调试

✅ 最佳实践:如何对一个“启动即退出”的镜像进行命令行调试?

🧭 目标

进入容器的命令行环境,即使它默认运行的服务会失败。

✅ 方法一:使用 docker run 覆盖 CMD,直接进入 shell

这是最推荐的方式。

🔧 命令:

docker run -it --rm openeuler/dns:22.03-lts-sp4 /bin/sh

💡 说明:

  • -it:启用交互式终端。
  • --rm:退出后自动删除容器(临时调试用)。
  • /bin/sh:覆盖镜像的默认 CMD,不运行服务,而是进入 shell。
  • 如果你的镜像中没有 bash,[sh](file://e:\docker_workspaces(svn.home)\base_systems\openEuler_dns\CreateContainer.sh) 通常是存在的。

👇 示例输出:

/ # ls /etc/named.conf
/etc/named.conf

你可以在这个 Shell 中检查配置文件、权限、用户是否存在等问题。

✅ 方法二:使用 docker run + --entrypoint 进入(适用于自定义 ENTRYPOINT 的情况)

如果你的镜像设置了 ENTRYPOINT(比如总是运行某个脚本),你可以通过 --entrypoint 覆盖它。

🔧 命令:

docker run -it --rm --entrypoint /bin/sh openeuler/dns:22.03-lts-sp4

💡 说明:

  • --entrypoint 会忽略 Dockerfile 中定义的 ENTRYPOINT 和 CMD
  • 然后你再手动执行你想测试的命令,例如:
    /usr/sbin/named -g -c /etc/named.conf
    

✅ 方法三:创建一个新的调试镜像(适合复杂场景)

如果你经常需要调试这个镜像,可以新建一个用于调试的镜像,修改其行为。

1. 创建 [debug.Dockerfile](file://e:\docker_workspaces(svn.home)\base_systems\openEuler_dns\debug.Dockerfile) 文件:

FROM openeuler/dns:22.03-lts-sp4

# 覆盖原 CMD,改为进入 Shell
CMD ["/bin/sh"]

2. 构建调试镜像:

docker build -f debug.Dockerfile -t openeuler/dns:debug .

3. 启动并调试:

docker run -it --rm openeuler/dns:debug

这样你就可以在一个和原镜像几乎一致的环境中进行排查了。

✅ 方法四:查看日志 + inspect 日志文件 + 挂载目录分析

如果你只是想快速查看出错原因,可以结合以下命令定位问题:

🔍 查看容器日志:

docker logs <container_name_or_id>

🔍 进入容器文件系统(即使没运行):

docker create --name debug-container openeuler/dns:22.03-lts-sp4
docker cp debug-container:/var/log/messages ./messages.log
cat ./messages.log

或者挂载目录后查看文件:

docker run -it --rm -v ./debug:/mnt openeuler/dns:22.03-lts-sp4 /bin/sh
ls /mnt

✅ 方法五:使用 scratch 容器复制文件出来分析

有时你只需要看看里面的文件内容而不运行服务本身。

docker create --name temp openeuler/dns:22.03-lts-sp4
docker cp temp:/etc/named.conf ./named.conf
docker rm temp

然后在宿主机上编辑、检查配置。

✅ 方法六:使用 nsenter 进入容器命名空间(高级)

如果你有运行过的容器(哪怕只运行了几秒),可以用 nsenter 进入其命名空间。

1. 查看容器 PID:

docker inspect <container_id> | grep HostPid

2. 使用 nsenter 进入:

sudo nsenter -t <PID> -m -u -i -n -p

这可以让你看到容器内完整的进程、网络、挂载信息。

✅ 总结:不同场景下的调试策略

场景推荐方法
容器启动后立刻退出使用 docker run ... /bin/sh 替换 CMD
使用了 ENTRYPOINT使用 --entrypoint /bin/sh
需要保留容器状态使用 docker create + docker cp
想复用原有逻辑调试创建 debug.Dockerfile 并重新构建
分析配置文件使用 docker cp 或 mount volume
高级调试(pid/ns)使用 nsenter 或 docker inspect

✅ 附注:如何查看容器退出原因?

docker inspect <container_id> | grep -i "exit_code"
# 或者
docker inspect <container_id> | grep -A 10 "State"

输出示例:

"State": {
    "ExitCode": 1,
    "Error": "",
    "FinishedAt": "2025-05-20T12:00:00Z",
    "Running": false,
    "Paused": false,
    "Restarting": false,
    "OOMKilled": false,
    "Dead": false,
    "Pid": 0,
    "ExitCode": 1,
    "Error": "",
    "StartedAt": "2025-05-20T11:59:59Z",
    "FinishedAt": "2025-05-20T11:59:59Z"
}

如果 ExitCode != 0,表示非正常退出,结合日志进一步查错。

✅ 最终建议流程

# 1. 进入容器 shell
docker run -it --rm openeuler/dns:22.03-lts-sp4 /bin/sh

# 2. 手动运行 DNS 服务以调试
/usr/sbin/named -g -c /etc/named.conf

# 3. 检查文件权限
ls -l /var/named

# 4. 查看日志文件
cat /var/log/messages

# 5. 检查 named 用户是否存在
id named

如果你愿意贴出完整的 [Dockerfile](file://e:\docker_workspaces(svn.home发生异常,可以输入更多信息再让我来回答或重试

到此这篇关于Docker 镜像调试的最佳实践的文章就介绍到这了,更多相关Docker 镜像调试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker使用阿里云镜像仓库的方法

    docker使用阿里云镜像仓库的方法

    本篇文章主要介绍了docker使用阿里云镜像仓库的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 聊聊docker跨主机之间容器通信问题

    聊聊docker跨主机之间容器通信问题

    这篇文章主要介绍了docker跨主机之间容器通信问题,创建网桥之后,使用ifconfig查看会多出一个网桥,该网桥在docker启动或者重启之后,会自动显示出来,具体实践跟随小编一起看看吧
    2022-05-05
  • Docker安装ollama过程解读

    Docker安装ollama过程解读

    Ollama是一个开源的LLM服务工具,用于简化在本地运行大语言模型,本文介绍了如何使用Docker安装Ollama并运行大语言模型,包括拉取镜像、运行容器和加载模型,最后,还介绍了如何安装OpenWebUI进行Web界面交互
    2025-02-02
  • 如何使用Docker定时备份数据

    如何使用Docker定时备份数据

    这篇文章主要介绍了如何使用Docker定时备份数据,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-04-04
  • docker镜像下载的另一种方式(实测有效!)

    docker镜像下载的另一种方式(实测有效!)

    在Docker中下载镜像是一个关键步骤,因为镜像是容器运行的基础这篇,文章主要给大家介绍了关于docker镜像下载的另一种方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-05-05
  • 解决Docker安装错误failure:repodata/repomd.xml from docker-ce-stable

    解决Docker安装错误failure:repodata/repomd.xml from docke

    在使用yum命令安装docker或其他工具时可能会遇到failure_repodata_repomd.xmlfromdocker-ce-stable_[Errno256]Nomoremirrorstotry的错误,原因可能是yum源配置问题,解决方法包括重置yum源,删除多余的repo文件
    2024-11-11
  • docker容器通信参数使用及link参数介绍

    docker容器通信参数使用及link参数介绍

    这篇文章主要介绍了docker容器通信参数使用及link参数介绍,link的原理就是在/etc/hosts里面添加了一个alias的名称,本文通过案例分析给大家详细讲解,需要的朋友可以参考下
    2022-09-09
  • Docker使用nodejs镜像构建express服务的方法

    Docker使用nodejs镜像构建express服务的方法

    这篇文章主要介绍了Docker使用nodejs镜像构建express服务,主要包括nodejs容器的启动,安装nodejs第三方依赖模块及启动nodejs服务的相关操作,本文给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • kali下对Docker的详细安装教程

    kali下对Docker的详细安装教程

    这篇文章主要介绍了kali下对Docker的详细安装,Docker是渗透测试中必学不可的一个容器工具,在其中,我们能够快速创建、运行、测试以及部署应用程序,对kali安装docker相关知识感兴趣的朋友一起看看吧
    2022-05-05
  • 解决执行docker daemon命令时出错的问题

    解决执行docker daemon命令时出错的问题

    daemon 这是docker 操作中十分常用的命令指定项,最近在运行docker daemon命令却发生了错误,后来通过测试各种方法终于解决了,现在将方法分享给大家,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-11-11

最新评论