離線安裝docker啟動(dòng)失敗

在當(dāng)前云計(jì)算和容器化的浪潮下,docker作為一種主流的應(yīng)用容器化技術(shù)應(yīng)運(yùn)而生,成為運(yùn)維和開發(fā)領(lǐng)域最為廣泛使用的工具之一。在這樣的背景下,docker離線安裝也成為了一個(gè)十分常見的需求,因?yàn)楹芏嘤脩魺o法連上互聯(lián)網(wǎng),或者安全等因素禁止了互聯(lián)網(wǎng)連接,因此離線安裝成為最為便捷的安裝方式之一。但是,在進(jìn)行離線安裝docker的過程中,常常會(huì)出現(xiàn)安裝成功但啟動(dòng)失敗的狀況,這對(duì)于初學(xué)者來說是一個(gè)十分頭疼的問題。

本文將從實(shí)際操作出發(fā),介紹Docker離線安裝方法,并針對(duì)啟動(dòng)失敗進(jìn)行詳細(xì)的分析,為大家?guī)硪环菰敿?xì)的指導(dǎo)。

一、Docker離線安裝

Docker離線安裝方式有兩種:一種是通過下載Docker的二進(jìn)制文件進(jìn)行安裝,另一種是通過配置yum源來進(jìn)行安裝。前者主要適用于沒有網(wǎng)絡(luò)條件的服務(wù)器,后者則適用于Linux開發(fā)環(huán)境的離線安裝。

1、通過下載Docker的二進(jìn)制文件進(jìn)行安裝

這種方法的原理比較簡單,就是將Docker的二進(jìn)制文件下載到本地,然后再進(jìn)行安裝。具體操作步驟如下:

1.1 獲取Docker的二進(jìn)制文件

在官網(wǎng)https://www.docker.com/上下載對(duì)應(yīng)版本的Docker二進(jìn)制文件。在下載時(shí)需要了解當(dāng)前操作系統(tǒng)的信息,對(duì)于centos系統(tǒng),可以選擇下載以下地址對(duì)應(yīng)的二進(jìn)制文件。

https://download.docker.com/linux/static/stable/x86_64/ ?docker-版本號(hào).tgz

1.2 安裝Docker的二進(jìn)制文件

安裝時(shí)需要將下載的二進(jìn)制文件解壓,并將其中的docker和dockerd文件移動(dòng)到/usr/bin目錄下。

tar -xvf docker-版本號(hào).tgz
cp docker/* /usr/bin

2、通過配置yum源進(jìn)行安裝

在centos系統(tǒng)下,可以通過配置yum源方式進(jìn)行離線安裝Docker。具體操作步驟如下:

2.1 獲取Docker的yum源

在官網(wǎng)https://www.docker.com/上下載對(duì)應(yīng)版本的Docker安裝包。在下載時(shí)需要了解當(dāng)前操作系統(tǒng)的信息,下載對(duì)應(yīng)系統(tǒng)版本的rpm包。

2.2 新建本地yum源

在本地新建一個(gè)yum源目錄,將下載的Docker安裝包復(fù)制到該目錄下,并通過createrepo命令對(duì)該目錄進(jìn)行創(chuàng)建

mkdir /var/docker
cp docker-ce*.rpm /var/docker
createrepo /var/docker

2.3 配置yum源

在/etc/yum.repos.d目錄下新建一個(gè)repo文件,并寫入以下內(nèi)容

[docker-local]
name=Docker Local repo
baseurl=file:///var/docker
enabled=1
gpgcheck=0

2.4 安裝Docker

執(zhí)行以下命令即可安裝Docker

yum install docker-ce

二、啟動(dòng)失敗解決方案

1、問題描述

在完成上述離線安裝Docker的操作后,可能會(huì)遇到Docker啟動(dòng)失敗的情況,出現(xiàn)以下錯(cuò)誤:

$ 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.

執(zhí)行systemctl status docker.service命令可以發(fā)現(xiàn),啟動(dòng)失敗的原因是docker.service文件中“ExecStart”指令無法執(zhí)行成功:

$ 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、問題解析

通過上述錯(cuò)誤信息,可以發(fā)現(xiàn)Docker啟動(dòng)失敗的原因是因?yàn)镈ocker的網(wǎng)絡(luò)控制器無法啟動(dòng)。具體是因?yàn)镈ocker的網(wǎng)絡(luò)控制器通過iptables防火墻對(duì)容器網(wǎng)絡(luò)進(jìn)行管理,而防火墻默認(rèn)是禁止所有非本地流量的。對(duì)于Docker而言,在第一次啟動(dòng)時(shí)會(huì)自動(dòng)在iptables中添加相關(guān)規(guī)則,但離線安裝的Docker如果是第一次啟動(dòng),就會(huì)出現(xiàn)添加規(guī)則失敗,從而導(dǎo)致網(wǎng)絡(luò)控制器無法啟動(dòng)的問題。具體表現(xiàn)就是當(dāng)用戶啟動(dòng)Docker時(shí),Docker將會(huì)根據(jù)本地的IP地址,自動(dòng)創(chuàng)建一個(gè)名為docker0的網(wǎng)橋,如果該操作失敗,Docker則無法啟動(dòng)。

3、問題解決

解決該問題的方法主要有兩種:

3.1 創(chuàng)建docker0網(wǎng)橋

手動(dòng)創(chuàng)建docker0網(wǎng)橋可以解決該問題,在centos下,可以執(zhí)行以下命令來手動(dòng)創(chuàng)建docker0網(wǎng)橋:

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

完成上述操作之后,再次啟動(dòng)Docker,以管理員身份執(zhí)行以下命令:

$ sudo systemctl start docker

即可完成Docker的啟動(dòng)。

3.2 修改防火墻規(guī)則

關(guān)閉防火墻或者修改防火墻規(guī)則也是解決該問題的一種有效方法。在關(guān)閉防火墻時(shí),可以使用以下命令:

$ systemctl stop firewalld
$ systemctl disable firewalld

但這種情況不太推薦,建議按照安全要求盡量保留系統(tǒng)的防火墻。

如果希望修改iptables規(guī)則,可以通過以下命令添加規(guī)則:

$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -I FORWARD -j ACCEPT
$ sudo service iptables save

執(zhí)行完以上操作之后,再次啟動(dòng)Docker,即可正常啟動(dòng)。

三、總結(jié)

通過本文的介紹,我們可以看到,在離線安裝Docker時(shí),由于網(wǎng)絡(luò)問題可能會(huì)導(dǎo)致Docker無法啟動(dòng)。這時(shí),我們需要對(duì)Docker的網(wǎng)絡(luò)控制器的工作原理有所了解,并對(duì)其進(jìn)行手動(dòng)配置或者iptables防火墻進(jìn)行一定的修改,才能最終解決Docker啟動(dòng)失敗的問題。當(dāng)然,我們也可以通過及時(shí)查看具體的錯(cuò)誤信息,并進(jìn)行分析來解決這類問題。

因此,在進(jìn)行Docker離線安裝和啟動(dòng)過程中,我們需要保持謹(jǐn)慎和耐心,不斷進(jìn)行試驗(yàn)和調(diào)試,最終找到合適的方法來解決問題。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊5 分享