XEN实例迁移到VPC后Docker容器启动失败

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: XEN实例迁移到VPC后Docker容器启动失败

问题背景:经典网络迁移到专有网络后,服务器内的docker容器无法启动


问题排查:


1 登录主机里面执行docker start container ID 提示这个错误:error response from daemon: linux runtime spec resourceserror: failed to start containers: ba6b8d747f67,这个错误并没有直接透出来真实原因,初步怀疑和docker用的runtime有关系,应该是docker-containerd-shim 调用docker runtime这个位置出现了问题,因为用户docker版本比较低,docker大致架构如下:



2 因为返回的信息还不够明确,所以第二步打开docker server的debug日志,然后在执行strace -e trace=all docker start container ID 做追踪看看系统调用以及debug级别的日志,docker 开启debug日志级别的方法如下:/etc/docker/daemon.json中增加"debug": true, 然后systemctl reload docker,不过打开后发现日志还是提示有资源没找到



3 通过现有的日志目前怀疑两个方向:

(1)用户docker环境的runtime有问题(依赖的资源找不到等),为了验证这个,临时给ECS绑定了一个eip,然后执行 :docker run -it --rm ubuntu echo OK 这个命令新建了一个容器验证了下,是可以正常跑通运行的,可以排除环境runtime的问题了


(2)配置里面有依赖某些资源,但是资源发生了改变,通过strace+社区文档了解到,docker在启动已有容器时会读取docker/containers/容器ID/ 里面的一个hostconfig.json的文件,里面定义了相关启动的配置,例如挂载的数据卷,定义的port等等,通过对比用户的发现了异常,信息如下:


4  经过hostconfig.json里面的内容,看到用户多个异常的容器都通过blkioDeviceReadIOps 指定磁盘设备名称限制了io,但是由于 迁移后磁盘设备名称发生变化引发了业务容器没法启动(迁移后默认设备名称会修改,具体可以参考这个文档核查:https://help.aliyun.com/document_detail/195861.html),所以提示了有资源找不到!后面解决方案如下:

(1)先把docker服务停止(systemctl stop doker)。

(2)执行grep -rl "xvda" /data3/docker/containers | xargs sed -i 's/xvda/vda/g' 这个命令把设备名称全部替换为vda

(3)最后systemctl start docker启动服务,docker start 容器ID把业务容器启动 (如果业务容器比较多,而且都需要启动的话, 可以执行docker start $(docker ps -a | awk '{ print $1}' | tail -n +2) )

ps:

1 如何找到hostconfig.json,可以先执行docker info这个命令,会有一个Docker Root Dir 参数,里面指定的目录就是container 容器的加目录

2 如何查看已有容器的配置,可以执行docker inspect container id

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云专有网络VPC使用教程
专有网络VPC可以帮助您基于阿里云构建出一个隔离的网络环境,并可以自定义IP 地址范围、网段、路由表和网关等;此外,也可以通过专线/VPN/GRE等连接方式实现云上VPC与传统IDC的互联,构建混合云业务。 产品详情:https://www.aliyun.com/product/vpc
相关文章
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
229 93
|
7天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
42 23
|
7天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
145 15
|
1月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
165 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
2月前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
204 35
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
97 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
63 17
|
1月前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
122 12
|
2月前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
179 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
1月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
213 11