解决二进制方式安装 docker 不能使用 systemd(systemctl) 工具管理 docker 服务的问题

2023-03-28 13:39:25

一、引言

接触 docker 已经有一段时间了,在这段时间里面,我使用二进制的方式安装了最新版的 docker,完成了 docker 的私有镜像库的搭建、用户认证的添加、镜像的推送与拉取等等功能。这里的二进制方式安装 docker 的方式有别于 rpm、deb 包,是 docker 官网上提到的一种类似于绿色版软件的安装方式,下载下来解压出来是一个可以直接使用的 docker 软件包,相关安装文档链接请点击下面:
Install Docker CE from binaries

相信使用这种方式安装 docker 的同学应该不多,我也是因为部门的要求:
1. 一定要是最新的 docker 社区版本
2. 一定要离线安装
因此才选择了这个非常简便的安装方式。

然而,这种方便的安装方式,带来的是 docker 与系统层面的交互功能的缺失。比如说,你想要在 RedHat 系的 linux 下使用 systemd 来管理 docker 服务,就是不可能的了。

那么,如果我使用二进制方式安装的 docker,就是想要使用 systemd 来管理 docker 服务,该怎么办呢?

这篇博客就是为了解决这个问题而出现的。

二、问题展现:我就想配置 docker 的开启自启动

现在,假想我们拿到的是一个刚刚使用二进制方式安装了 docker 的 RedHat 7 环境。那么如果我们想要配置可以开机启动 docker 服务(这样就不用我们每次自己去开启了),按照官方文档的提示:
Configure Docker to start on boot

我们输入下列命令:

sudo systemctl enable docker

会很不幸的提示这么一句话:

Failed to execute operation: No such file or directory

这是很正常的,因为我们实际上安装的 docker 是类似绿色版的。我们想要使用系统服务工具 systemctl,就必须配置好它。

三、问题解决:从官方文档入手排坑

这个问题非常不好解决,因为中文社区相关问题太少,估计也是因为使用这种方式安装 docker 的人太少。

资料搜集

幸运的我看到了官网的这篇介绍 docker 配置 systemd 的文章:
Control and configure Docker with systemd

这篇文章其他信息都是站在了你已经配置好了 systemd 工具的前提下,如何使用 systemd 工具的介绍,然而,最后面一段才是我们所需要的信息:

systemd

我简单翻译一下:

手动创建 systemd 单元文件
如果你是使用二进制方式安装的 docker,那么你也许需要整合 docker 到 systemd 中去。为了完成这个任务,你需要安装两个单元文件(service 和 socket)到 /etc/systemd/system 中去

其中点开 github 路径:
docker.service 和 docker.socket 文件 GitHub 地址

moby

打开链接后,按照官网的介绍,我们需要将 docker.servcie 和 docker.socket 放到我们的 /etc/systemd/system 下面即可。

但是根据我的尝试,这样是不行的,当你使用 systemctl start docker会提示如下提示:

A dependency job for docker.service faled. See ‘journalctl -xe’ for details.

最终解决

这个问题我也纠结了很久,最后根据这篇讨论得到了灵感:
Fedora 23: Failed to start docker.service: Unit docker.socket failed to load: No such file or directory.

最后我尝试出来的解决办法是:
1. 制作 docker.service 和 docker.socket 文件

你可以选择点击我上面分享的 github 链接:
docker.service 和 docker.socket 文件 GitHub 地址
然后按照图示将 docker.service.rpm 文件修改名字为 docker.service;docker.socket 则不需要改动,直接复制粘贴新建一个 docker.socket 文件即可。

也可以选择我已经做好了的 docker.service 和 docker.socket 文件,百度云链接为:
链接: docker.service 和 docker.socket 文件 密码:zgyt

2. 将上述步骤得到的 docker.service 和 docker.socket 文件一起放到 /etc/systemd/system 目录下

# 拷贝进来的 docker.service 和 docker.socket 当前目录下
$ sudo cp docker.socket /etc/systemd/system
$ sudo cp docker.service /etc/systemd/system

3. 重启 systemctl 服务

# 先重启 systemctl 守护进程
$ sudo systemctl daemon-reload
# 再开启 docker 服务
$ sudo systemctl start docker

# * 如果上一行代码显示失败,那么重启电脑再重试上面两行命令 *
$ sudo reboot

问题解决 ^_^

最后的最后,此时我们再想要配置 docker 服务开机自启动,就可以运行这行命令了:

$ sudo systemctl enable docker

至此,完结撒花:)

四、总结

这个问题纠结了我一个上午的时间。因为官方文档的信息实在是太过于简略,简单的根据官网来操作也会出错。最后通过一篇讨论中提到 Requires=docker.socket 需要去掉,这才想起去查看 docker.service 和 docker.service.rpm 的区别,发现后者就是比前者少了这么一句话。也就是这么一个契机,我尝试着替换 docker.service 的文件内容为 docker.service.rpm 的文件内容,最后问题解决。

这个问题相信每一个使用二进制安装 docker 的人都会遇到,希望这篇博客能给你们一些帮助:)

To be Stronger:)

  • 作者:曾经去过跨越一个小时的地方
  • 原文链接:https://wangying.blog.csdn.net/article/details/80493760
    更新时间:2023-03-28 13:39:25