开发者社区 问答 正文

服务器的docker服务本来已经关闭了,然后过了一会自动开启。但是docker ps -a没有镜像

服务器的docker服务本来已经关闭了,然后过了一会自动开启。但是docker ps -a没有镜像,
docker的启动日志里面有有句API linsten to /var/run/docker.sock,这些都觉得很奇怪,但是看不懂。
然后自己百度了下可能docker remote API给人连接了。就看了下docker.service的配置。特别是ExecStart那些,但是看不懂。大神们帮帮忙

展开
收起
connorlin 2019-03-20 16:28:47 1762 分享 版权
阿里云 AI 助理回答

根据您描述的情况,服务器上的Docker服务在关闭后自动启动,并且docker ps -a显示没有镜像。同时,您提到Docker的启动日志中有一条信息“API listen on /var/run/docker.sock”,并且怀疑可能与Docker Remote API有关。以下是针对问题的详细分析和解决步骤:


1. Docker服务自动启动的原因

Docker服务可能被配置为开机自启动或通过某种机制(如systemd服务)重新启动。这通常是因为以下原因之一: - systemd服务配置:Docker默认通过systemd管理其服务状态。如果systemd配置了Docker服务为开机自启动,则即使手动关闭Docker,它也可能在某些情况下(如系统重启或服务恢复)重新启动。 - 云助手插件或其他自动化工具:如果您使用了阿里云ECS实例,某些自动化工具(如ecs-tool-servicekeepalive插件)可能会监控并重新启动关键服务,包括Docker。

检查Docker服务是否设置为开机自启动

运行以下命令检查Docker服务的状态和配置:

sudo systemctl is-enabled docker

如果返回enabled,说明Docker服务被设置为开机自启动。

禁用Docker服务的开机自启动

如果您不希望Docker服务自动启动,可以禁用开机自启动:

sudo systemctl disable docker

2. 关于“API listen on /var/run/docker.sock”

/var/run/docker.sock是Docker守护进程的Unix套接字文件,用于本地通信。当您看到日志中提到“API listen on /var/run/docker.sock”时,这表明Docker守护进程正在监听该套接字以处理来自本地客户端的请求。

可能的风险:Docker Remote API暴露

如果Docker Remote API被启用并绑定到网络接口(例如0.0.0.0),则可能存在安全风险,因为外部用户可以通过网络访问Docker API。这可能导致未经授权的操作,例如创建容器、删除镜像等。

检查Docker服务的启动参数

运行以下命令查看Docker服务的启动参数:

ps aux | grep dockerd

重点关注是否有类似-H tcp://0.0.0.0:2375的参数。如果有,说明Docker Remote API已绑定到所有网络接口,存在安全隐患。

修改Docker服务配置

编辑Docker服务的systemd配置文件,确保只监听本地Unix套接字:

sudo systemctl edit docker

添加以下内容:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock

保存后,重新加载systemd配置并重启Docker服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

3. Docker镜像丢失的原因

您提到docker ps -a显示没有镜像,这可能是由于以下原因: - 镜像被清理:执行了docker system prune命令或其他清理操作,导致未使用的镜像被删除。 - 数据目录被重置:Docker默认存储路径为/var/lib/docker。如果该目录被清空或挂载点发生变化,镜像数据将丢失。

检查Docker存储路径

运行以下命令确认Docker的存储路径:

docker info | grep "Docker Root Dir"

如果路径不是默认的/var/lib/docker,请检查挂载点是否正确。

恢复镜像

如果没有备份,镜像数据无法恢复。建议重新拉取所需的镜像。例如:

sudo docker pull <image_name>:<tag>

4. 进一步排查建议

如果上述步骤未能解决问题,您可以尝试以下方法: - 查看Docker日志:运行以下命令查看Docker服务的日志,寻找更多线索:

sudo journalctl -u docker.service
  • 检查自动化工具配置:如果您使用了阿里云ECS实例,检查是否启用了ecs-tool-servicekeepalive插件或其他自动化工具。

总结

  1. 检查并禁用Docker服务的开机自启动,避免其自动启动。
  2. 确保Docker Remote API未暴露于网络,仅监听本地Unix套接字。
  3. 检查Docker存储路径,确认镜像数据是否丢失,并重新拉取所需镜像。
  4. 查看Docker日志和自动化工具配置,进一步排查问题根源。

希望以上步骤能够帮助您解决问题!如果仍有疑问,请随时提供更多信息以便进一步分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答