一、引言
接触 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 单元文件
如果你是使用二进制方式安装的 docker,那么你也许需要整合 docker 到 systemd 中去。为了完成这个任务,你需要安装两个单元文件(service 和 socket)到 /etc/systemd/system 中去
其中点开 github 路径:
docker.service 和 docker.socket 文件 GitHub 地址
打开链接后,按照官网的介绍,我们需要将 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:)