docker 常见问题

1、Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

  • 可能1:执行任何docker指令,都会报这个错,这个是因为当前用户没有 root 权限,需要使用切换到 root, 或者 sudo 一下

  • 可能2:docker 没有启动, 使用:systemctl restart docker.service 进行重启(要用root权限),可以参考:https://blog.csdn.net/weixin_45496075/article/details/109123709

2、open /var/lib/docker/tmp/docker-import-320723741/dev/json: no such file or directory

这个是由于 tar 包使用 docker save 打包或 使用 docker export 打包区别所致,(docker save 打的 tar 包可以使用 docker load 去加载, 使用 docker export打包的,就得用 docker import 了)

如果 docker load -i 不行的话,

可以试一下 cat dm8_docker.tar | docker import - dm8_dev (导入达梦镜像的时候,用docker load -i 报了以上错,使用这个指令就可以了,说明这个是达梦这个镜像是使用 docker export 打包的)

3、容器启动失败,并且无日志

此种情况,容器没有启动成功,所以也不知道它因为什么原因启动失败,这个要怎么办呢?并且容器启动失败,还无法进入容器去尝试执行启动指令(想看一下是不是指令执行失败也没有办法)

解决方案:可以使用这个指令

docker run --name 01-eureka --rm --env ENV_CONFIG_IP=192.168.2.100 --entrypoint /bin/bash 01-eureka:latest

加上这个参数,就可以进入容器。但它会忽略 entrypoint 的参数,即把entrypoint的参数无效化。(也不知道这样表达正不正确,请忽略这种不专业的描述)

用这种方式进入容器后,可以看一下,相关的文件是否正确添加,进入容器后,再执行脚本,甚至也可以看看里面生成的日志。(因为日志如果没有打印出来,必须进入容器去看,可能使用不对啊,但本人确实是有这样的场景)

进入容器后,执行脚本,才发现脚本有报错,巴拉巴拉巴拉。。。再修改

还有一种情况:在 docker 里面执行脚本时,不能再 “java -jar xxx.jar > nohup.log &” 这样启动语句,后面不能带 “&”!!!

建议的做法,不要输出到 nohup.log ,更不能带 “&”,也不需要。

看日志,用 docker logs 就好了。输出到日志,它报错了,也不太看得出。。。所以不建议这样写。

这个问题网上查了,要么说文件名错了,要么说权限不对,
以上两个,都不是我遇到过的原因,
它真正的原因,竟然是 docker 版本问题,不知为何,它docker版本竟然是 1.x 的。。。另外一台服务器正常的,使用的是19.x

确认下版本号再说。

5、运行容器时,报错:standard_init_linux.go:211: exec user process caused "exec format error"

被这一个问题,是真的搞了好久,
网上查到的原因有如下几种:

  • fileformat
  • 镜像的架构和服务器架构不兼容
  • 1、硬件架构不兼容在 amd 和 arm 架构下构建的镜像很有可能不能互通。
    解决办法:针对不同的硬件架构构建不同的镜像,或者构建跨架构(multi-arch)的镜像。
  • 2、shell 执行不兼容脚本可能是基于 bash 写的,有些 Linux 发行版可能没有 bash,或者默认的 shell 解释器不是 bash。
    解决办法:在 shell 脚本的开头指定需要使用的解释器,比如#!/bin/bash,并且注意使用的语法。
  • 3、存在非 *NIX 环境的换行符比如在 Windows 环境下编写的一些代码,移植到 Linux 环境下可能会出问题。
    解决办法:将 CRLF 替换为 LF。

(当时看了方式1,发现没问题,做了方法3,也改过了,但没有把2&3一起弄。。。就搞好很久,怀疑人生)

在本个case下,最终解决的方案是:
1、run.sh 这个脚本, 它的编码格式是 doc 的,要改为 unix

# 查看当前文件的编码类型
:set ff
# 修改
:set ff=unix
# 再保存
:wq

2、这个run.sh 脚本,必须在第一行要标明 #!/bin/bash 这么一行。不然,它还真不行。
(虽然之前有试过不写好像也可以,但这一次,偏偏它就必须要写。。。写上吧,不要写错就好)

#!/bin/bash 的作用是什么呢
第一行的内容指定了shell脚本解释器的路径,而且这个指定路径只能放在文件的第一行。  
第一行写错或者不写时,系统会有一个默认的解释器进行解释。

并且这一行,必须写在第一行,必须必须必须。第一行!!!(原因我解释不了,照做便是了)

这个问题,真的被搞好了些时间,好在始终解决了。

附:下次再出现这样的诡异问题。。还是得一项一项找原因,最好是有一个“成功”的案例来做比对, 如果比对不出来差异(比如编码格式的问题,看内容是看不出任何毛病的)。那就拿正确的过来,一项一项替换,看究竟是哪一项出的问题。
当然,当然! 可能是有好几个项都有问题,那这个就必须要更加注意了。只能在正确的模板之上,逐项替换错误的文件,直至试出哪一项不可用为止。正确之上试错,比错误的基础上找对要简单得多。

posted @ 2022-03-29 14:29  aaacarrot  阅读(242)  评论(0编辑  收藏  举报