在当前云计算和容器化的浪潮下,Docker作为一种主流的应用容器化技术应运而生,成为运维和开发领域最为广泛使用的工具之一。在这样的背景下,Docker离线安装也成为了一个十分常见的需求,因为很多用户无法连上互联网,或者安全等因素禁止了互联网连接,因此离线安装成为最为便捷的安装方式之一。但是,在进行离线安装Docker的过程中,常常会出现安装成功但启动失败的状况,这对于初学者来说是一个十分头疼的问题。
本文将从实际操作出发,介绍Docker离线安装方法,并针对启动失败进行详细的分析,为大家带来一份详细的指导。
一、Docker离线安装
Docker离线安装方式有两种:一种是通过下载Docker的二进制文件进行安装,另一种是通过配置yum源来进行安装。前者主要适用于没有网络条件的服务器,后者则适用于Linux开发环境的离线安装。
1、通过下载Docker的二进制文件进行安装
这种方法的原理比较简单,就是将Docker的二进制文件下载到本地,然后再进行安装。具体操作步骤如下:
1.1 获取Docker的二进制文件
在官网https://www.docker.com/上下载对应版本的Docker二进制文件。在下载时需要了解当前操作系统的信息,对于centos系统,可以选择下载以下地址对应的二进制文件。
https://download.docker.com/linux/static/stable/x86_64/ docker-版本号.tgz
1.2 安装Docker的二进制文件
安装时需要将下载的二进制文件解压,并将其中的docker和dockerd文件移动到/usr/bin目录下。
tar -xvf docker-版本号.tgz
cp docker/* /usr/bin
2、通过配置yum源进行安装
在centos系统下,可以通过配置yum源方式进行离线安装Docker。具体操作步骤如下:
2.1 获取Docker的yum源
在官网https://www.docker.com/上下载对应版本的Docker安装包。在下载时需要了解当前操作系统的信息,下载对应系统版本的rpm包。
2.2 新建本地yum源
在本地新建一个yum源目录,将下载的Docker安装包复制到该目录下,并通过createrepo命令对该目录进行创建
mkdir /var/docker
cp docker-ce*.rpm /var/docker
createrepo /var/docker
2.3 配置yum源
在/etc/yum.repos.d目录下新建一个repo文件,并写入以下内容
[docker-local]
name=Docker Local repo
baseurl=file:///var/docker
enabled=1
gpgcheck=0
2.4 安装Docker
执行以下命令即可安装Docker
yum install docker-ce
二、启动失败解决方案
1、问题描述
在完成上述离线安装Docker的操作后,可能会遇到Docker启动失败的情况,出现以下错误:
$ sudo systemctl start docker
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
执行systemctl status docker.service命令可以发现,启动失败的原因是docker.service文件中“ExecStart”指令无法执行成功:
$ sudo systemctl status docker.service
...
Apr 30 07:40:32 localhost.localdomain systemd[1]: Started Docker Application Container Engine.
Apr 30 07:40:32 localhost.localdomain systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
Apr 30 07:40:32 localhost.localdomain systemd[1]: Unit docker.service entered failed state.
Apr 30 07:40:32 localhost.localdomain systemd[1]: docker.service failed.
Apr 30 07:40:32 localhost.localdomain systemd[1]: docker.service holdoff time over, scheduling restart.
Apr 30 07:40:32 localhost.localdomain systemd[1]: Stopped Docker Application Container Engine.
$sudo journalctl -xe
dockerd-current[14552]: time="2020-04-30T07:40:32.652790118+08:00" level=error msg="systemd notifier failed: Unable to load systemd module \"libsystemd.so\": cannot open shared o
dockerd-current[14552]: failed to start daemon: Error initializing network controller: list bridge addresses failed: PredefinedLocalScopeDefaultNetworks List failed: Predefined
dockerd-current[14552]: Error starting daemon: Error initializing network controller: list bridge addresses failed: PredefinedLocalScopeDefaultNetworks List failed: Predefined
systemd[1]: docker.service: main process exited, code=exited, status=1/FAILURE
systemd[1]: Failed to start Docker Application Container Engine.
systemd[1]: Unit docker.service entered failed state.
systemd[1]: docker.service failed.
2、问题解析
通过上述错误信息,可以发现Docker启动失败的原因是因为Docker的网络控制器无法启动。具体是因为Docker的网络控制器通过iptables防火墙对容器网络进行管理,而防火墙默认是禁止所有非本地流量的。对于Docker而言,在第一次启动时会自动在iptables中添加相关规则,但离线安装的Docker如果是第一次启动,就会出现添加规则失败,从而导致网络控制器无法启动的问题。具体表现就是当用户启动Docker时,Docker将会根据本地的IP地址,自动创建一个名为docker0的网桥,如果该操作失败,Docker则无法启动。
3、问题解决
解决该问题的方法主要有两种:
3.1 创建docker0网桥
手动创建docker0网桥可以解决该问题,在centos下,可以执行以下命令来手动创建docker0网桥:
sudo ip link add name docker0 type bridge
sudo ip addr add dev docker0 172.17.0.1/16
sudo ip link set dev docker0 up
完成上述操作之后,再次启动Docker,以管理员身份执行以下命令:
$ sudo systemctl start docker
即可完成Docker的启动。
3.2 修改防火墙规则
关闭防火墙或者修改防火墙规则也是解决该问题的一种有效方法。在关闭防火墙时,可以使用以下命令:
$ systemctl stop firewalld
$ systemctl disable firewalld
但这种情况不太推荐,建议按照安全要求尽量保留系统的防火墙。
如果希望修改iptables规则,可以通过以下命令添加规则:
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -I FORWARD -j ACCEPT
$ sudo service iptables save
执行完以上操作之后,再次启动Docker,即可正常启动。
三、总结
通过本文的介绍,我们可以看到,在离线安装Docker时,由于网络问题可能会导致Docker无法启动。这时,我们需要对Docker的网络控制器的工作原理有所了解,并对其进行手动配置或者iptables防火墙进行一定的修改,才能最终解决Docker启动失败的问题。当然,我们也可以通过及时查看具体的错误信息,并进行分析来解决这类问题。
因此,在进行Docker离线安装和启动过程中,我们需要保持谨慎和耐心,不断进行试验和调试,最终找到合适的方法来解决问题。
以上是离线安装docker启动失败的详细内容。更多信息请关注PHP中文网其他相关文章!