docker-遇到的错误

本文详细描述了在阿里云服务器上遇到的Docker启动问题、自定义镜像构建错误,如CMD语法、apt命令使用,以及数据卷挂载、数据库管理中的常见问题,包括binlog处理和my.cnf配置。

Docker

1、Failed to start Docker Application Container Engine

在阿里云服务器安装docker后发现无法启动,总是报错Failed to start Docker Application Container Engine
在确定内核版本可用以及安装没有问题后,通过tail -200f /var/log/messages查看系统日志发现问题

解决方法: 
/etc/docker/daemon.json配置镜像加速文件
,复制的文本上可能存在未知的空白字符被linux识别了出来,导致格式错误,手动打一遍就好

2、unknown instruction: CMD["python3"

在进行第一次创建自定义镜像时报错

CMD["python3", "app.py"]

解决方法:
属于格式错误,CMD和"["之间要有空格

CMD ["python3", "app.py"]

3、apt does not have a stable CLI interface. Use with caution in scripts

构建自定义镜像时,Dockerfile中 RUN apt update 出错

解决方法:
不要在脚本中使用apt命令,使用apt-get命令进行替换apt

4、Do you want to continue? [Y/n] Abort

构建自定义镜像时,在以上提示出现后自动结束构建程序
Dockerfile中有这么一条

RUN apt install python3

RUN apt install python3-pip

正常安装会弹出安装Do you want to continue? [Y/n] 需要用户手动确认,程序会自动Abort从而结束

5、容器启动就停止

运行一个容器后,docker ps看不到运行中的容器,通过docker ps -a 能看到容器已经停止运行,既然能够启动没有报错,docker的配置应该没有什么问题,问题应该在Dockerfile和前台进程上了。

一开始觉得前台进程没什么问题,CMD ["python3", "app.py"],前台进程命令没什么问题

然后重点排查Dockerfile,发现指定工作目录和app.py文件没有在宿主机内创建,又是给权限又是手动创建目录,最后脑子一激灵,工作目录不是应该在容器内创建的吗,重新运行容器并进入内部查看,发现目录和文件都正常被创建了,一筹莫展的时候意外输入了

docker run -it 容器ID 

没有通过bash命令进入容器内部,而是直接运行了容器,然后弹出了报错信息
原来是在vim里手打的app.py少了个冒号":"  导致导致前台进程运行出错直接退出了,以后代码还是在运行无误后再拿过来用

6、挂载数据卷失误

运行容器挂载数据卷时,会将本地目录内容映射到容器内,也就是说本地目录如果为空,容器内对应的目录也是空的,需要在挂载前将文件放入本地目录

已挂载的数据卷目录中进行文件修改,需要重启容器才能生效

7、数据库挂载数据卷

docker run -d -p 3306:3306 \
> --name mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/log:/var/log/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/data:/var/lib/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/my.cnf:/etc/mysql \
> -e MYSQL_ROOT_PASSWORD=1213 \
> --privileged=true \
> mysql
 

通过以上命令运行mysql容器时总是秒退,然后查看日志发现以下错误

需要挂载/var/lib/mysql-files到宿主机,加入以下数据卷之后就成功启动

-v /xiaohuodemo/mysql/nginx_mysql_demo/mysql-files

MYSQL

1、could not  open log file

背景:在宿主机内删除数据库后,重启mysql容器也没有同步删除容器内的应删除的数据库,初步怀疑是容器重启后读取到日志内创建数据库的操作而没有读取到删除数据库的操作导致数据库一直被重新创建

然后在宿主机内数据卷目录下手手动rm binlog,删除了所有日志文件,再次启动Mysql容器就报" could not open log file" 错误,查阅了一番,得出结论:绝对不能手动rm 删除binlog文件,基本都会报主从不一致错误,一旦出现这种情况,只能重新做从库

建议: 

  1. 避免对binlog文件做压缩删除等直接操作,可以通过调整参数修改binlog清理策略.
  2. 需要手工删除binlog时,可以进入MySQL通过purge命令去删除。
    PURGE BINARY LOGS BEFORE '2020-11-25 13:09:51';

2、Error on realpath() on ‘/var/lib/mysql-files‘ (Error 2 - No such file or directory)

用以下命令创建一个正式使用的数据库

docker run -d -p 3306:3306 --name mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/log/:/var/log/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/data/:/var/lib/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/my.cnf:/etc/mysql/conf.d \
> -e MYSQL_ROOT_PASSWORD=1213 \
> --privileged=true \
> --restart=always \
> mysql
 

启动后数据库容器秒退,查看日志报错Error on realpath() on ‘/var/lib/mysql-files‘ (Error 2 - No such file or directory),

解决方法:

经过查询,应该是在挂载my.cnf配置时需要额外挂载/var/lib/mysql-files文件,但是又出现Could not open unix socket lock file /var/lib/mysql/mysql.sock.lock 这个报错用时良久也无法解决,干脆跳过寻找其他办法。最后决定不覆盖my.cnf文件,挂载/etc/mysql/conf.d目录,成功解决

解决方法:

新开一个mysql容器,复制/etc/mysql/conf.d目录下所有文件到宿主机本地/xiaohuodemo/mysql/nginx_mysql_demo/conf/conf.d/,然后将宿主机内之前写好的my.cnf改名放到/xiaohuodemo/mysql/nginx_mysql_demo/conf/conf.d/目录下,最后再挂载目录时把该目录挂载上去,命令如下

docker run -d -p 3306:3306 --name mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/log/:/var/log/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/data/:/var/lib/mysql \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/conf/conf.d/:/etc/mysql/conf.d \
> -v /xiaohuodemo/mysql/nginx_mysql_demo/mysql-files/:/var/lib/mysql-files \
> -e MYSQL_ROOT_PASSWORD=1213 \
> --privileged=true \
> --restart=always \
> mysql

启动成功,通过ip:3306连接成功

<think>好的,我现在需要帮助用户解决如何在基于Yum的系统上正确卸载Docker,包括相关组件如docker-client、docker-common等的问题。首先,用户提到他们遇到了“命令未找到”的问题,因此想通过卸载Docker来解决。我需要确保提供的步骤能够彻底移除Docker及其所有相关组件,避免残留文件导致的问题。 首先,回顾用户提供的引用内容。引用[2]、[3]和[5]提到了卸载Docker的命令,包括使用yum remove来删除旧版本,以及手动删除残留文件和目录。特别是引用[5]中的rm -rf命令,可以清除Docker的配置文件和数据目录。用户之前的回答中也提到了卸载旧版本的步骤,但可能需要更详细的指导。 接下来,我需要确认卸载步骤的正确顺序。通常,卸载软件包后可能会有残留文件,所以应该先使用包管理器卸载,再手动清理剩余文件。根据引用中的信息,正确的步骤应该是: 1. 使用yum remove卸载Docker相关软件包,包括docker-ce、docker-ce-cli、containerd.io等。 2. 手动删除Docker创建的配置文件、镜像存储目录和其他相关目录,如/var/lib/docker、/var/lib/containerd等。 3. 确保用户了解如何验证卸载是否成功,比如再次运行docker命令检查是否存在,或者查看相关目录是否已删除。 需要注意的是,用户可能之前安装的是不同版本的Docker,或者通过不同方式安装的,因此需要涵盖所有可能的组件。引用中提到的docker-client、docker-common等包也需要包含在卸载命令中,尽管在较新系统中这些可能已被替换。此外,用户可能误操作导致部分组件未被正确卸载,所以需要全面覆盖。 另外,用户提到“命令未找到”的问题,这可能是因为Docker未正确安装或路径问题,但用户仍希望彻底卸载。因此,在卸载过程中,需要确保所有相关的可执行文件和配置都被移除,避免残留导致的问题。 最后,应该建议用户在卸载完成后验证是否成功,例如尝试运行docker命令,或检查相关服务是否已停止。同时,可以提示用户在需要时重新安装Docker的步骤,但当前问题主要集中在卸载。 总结步骤: 1. 停止Docker服务。 2. 使用yum卸载所有Docker相关包。 3. 手动删除残留文件和目录。 4. 验证卸载是否彻底。 需要确保命令准确无误,并且覆盖所有可能的组件和残留文件,避免遗漏。</think>### 基于 Yum 的系统彻底卸载 Docker 指南 #### 1. 停止 Docker 服务 ```bash sudo systemctl stop docker docker.socket containerd ``` #### 2. 卸载 Docker 核心组件 通过 Yum 移除所有 Docker 相关软件包: ```bash sudo yum remove docker-ce docker-ce-cli docker-ce-rootless-extras \ containerd.io docker-buildx-plugin docker-compose-plugin \ docker-client docker-client-latest docker-common docker-latest \ docker-latest-logrotate docker-logrotate docker-engine ``` 该命令将卸载: - 社区版核心组件(`docker-ce`, `docker-ce-cli`) - 容器运行时(`containerd.io`) - 旧版遗留组件(`docker-client`, `docker-common`等)[^2][^3] #### 3. 清理残留文件 手动删除 Docker 创建的系统资源: ```bash sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd sudo rm -rf /etc/docker sudo rm -rf /run/docker sudo rm -rf /var/run/docker.sock ``` 这些目录包含: - 容器镜像存储(`/var/lib/docker`) - 运行时数据(`/run/docker`) - 配置文件(`/etc/docker`)[^5] #### 4. 验证卸载结果 确认无残留组件: ```bash which docker # 应无输出 rpm -qa | grep -i docker # 应无匹配结果 ``` #### 补充说明 - 若出现 `Failed to stop docker.service` 错误,可使用 `sudo systemctl reset-failed docker` 重置服务状态 - 完全卸载后重启系统可确保所有挂载点解除(可选) --- ### 卸载后常见问题解决 **Q:卸载后仍提示 `docker: command not found`?** A:该提示实际表示卸载成功,原因为系统已无 Docker 可执行文件。若出现其他错误提示,可能需要检查: ```bash echo $PATH | grep docker # 检查环境变量残留 ``` **Q:如何防止旧配置影响未来安装?** A:建议执行: ```bash sudo rm -rf ~/.docker # 删除用户级配置 ``` --- ### 相关扩展问题 1. 如何彻底清除 Docker 镜像缓存? 2. 卸载后如何重新安装指定版本的 Docker? 3. 容器运行时 containerd 与 Docker 的依赖关系是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值