1 背景
Docker 官方网站的说明文档中,介绍了在各种 Linux 发行版系统上安装 Docker 的步骤及各种安装方法。例如,在 CentOS 上安装 Docker 可以参考:Install Docker Engine on CentOS | Docker Docs。
众所周知,此网站在国内难以访问,当然也可以使用国内可用的 Yum 源。但总体的安装、配置步骤比较繁琐,尤其是在新旧版本切换时,常因为某些文件、目录未彻底清理,导致 Docker 启动失败。
此脚本具有下功能:
- 提供 docker-ce-17.03.0 版本和 docker-ce 最新稳定版的安装部署
- 可以实现 dokcer-ce-17.03.0 版本和 docker-ce 最新稳定版的无缝切换安装,无需重启系统
- 可以自动解决网桥与防火墙的连接问题,安装后无需重启系统
- 若安装后存储驱动不是 overlay(overlay2),提供一键解决方案的选择
- 内置初始化代码(默认启用,停用需要自己编辑),若您的 Docker 出现问题,不妨用此脚本重新安装
说明:
因为旧版本的 Docker(如 docker-ce-17.03.0)在执行命令后有比较详细完整的返回结果,适合学习使用,因此脚本提供旧版本的一键安装。
2 Docker 一键安装脚本
# 脚本创建:闫志聪
# 创建时间:2023-09-15
# 当前版本:v2
#!/bin/bash
trap 'mytrap ; exit 1' SIGINT INT
# 声明初始化及中断善后函数
function mytrap() {
yum -y remove containerd.io docker-buildx-plugin docker-ce docker-ce-cli docker-compose-plugin docker-ce-selinux.noarch \
audit-libs-python checkpolicy container-selinux.noarch docker-ce-rootless-extras fuse-overlayfs \
fuse3-libs libcgroup libsemanage-python policycoreutils-python python-IPy.noarch setools-libs slirp4netns
rm -rf /root/docker-ce
rm -rf /etc/docker
rm -rf /var/lib/docker
# rm -rf /etc/yum.repos.d/docker-ce.repo
rm -rf /etc/sysctl.d/bridge-iptables.conf
# rm -rf /proc/sys/net/bridge/bridge-nf-call-iptables
# rm -rf /proc/sys/net/bridge/bridge-nf-call-ip6tables
}
# 安装 docker-ce-17.03.0 版本
function docker-ce-old () {
mkdir /root/docker-ce && cd /root/docker-ce
echo -e "\e[0;31m"
curl -O https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm
echo
curl -O https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
echo -e "\e[0m"
yum -y install docker-ce-17.03.0.ce-1.el7.centos.x86_64.rpm docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch.rpm
rm -rf /root/docker-ce
if [ ! -d /etc/docker ] ; then mkdir /etc/docker ; fi
}
# 安装 docker-ce 最新版本
function docker-ce-latest () {
yum -y install yum-utils
echo -e "\e[0;31m"
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
echo -e "\e[0m"
yum --enablerepo=docker-ce-stable -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
if [ ! -d /etc/docker ] ; then mkdir /etc/docker ; fi
}
# 声明选项判断函数
function option_check () {
if [ "$1"=="number" ] ; then
flag=$(echo $2 | egrep "1|2")
elif [ "$1"=="letter" ] ; then
flag=$(echo $2 | egrep "y|n")
fi
[ -z "$flag" ] && echo -e "\e[1;31m选项输入错误,请重新输入\e[0m" || break
}
# 版本选择
echo -n -e "\e[0;31m"
cat <<EOF
请选择需要安装的 docker-ce 版本:
1、docker-ce-17.03.0
2、docker-ce-latest
EOF
while true ; do read -p "请输入您的选项:" num ; option_check number $num ; done
echo -n -e "\e[0m"
# 初始化安装环境
mytrap
# 开始安装
case $num in
1) docker-ce-old ;;
2) docker-ce-latest ;;
esac
# 设置镜像加速站点
while true ; do
echo -n -e "\e[0;31m"
read -p "请输入您的Docker加速站点:" mirror
echo -n -e "\e[0m"
[ -z "$mirror" ] && mirror="https://fv6z6xq3.mirror.aliyuncs.com"
url=${mirror#*//}
ping -c 4 $url 2>/dev/null
[ "$?" -ne 0 ] && echo -e "\e[1;31m加速站点不可用,请重新输入\e[0m" || break
done
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["$mirror"]
}
EOF
# 解决 bridge 和 iptables 的连接问题
echo "1" > /proc/sys/net/bridge/bridge-nf-call-iptables
echo "1" > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo "net.bridge.bridge-nf-call-iptables=1" > /etc/sysctl.d/bridge-iptables.conf
echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.d/bridge-iptables.conf
#echo -e "\e[0;31m"
#sysctl -p /etc/sysctl.d/bridge-iptables.conf
#echo -e "\e[0m"
systemctl enable docker
systemctl start docker
run=$(systemctl status docker | grep "active (running)")
mirror=$(docker info | grep -A 1 "Registry Mirrors" | grep -v "Registry Mirrors")
ufs=$(docker info | grep "Storage Driver" | grep overlay)
if [ -z "$run" ] ; then
echo -e "\e[0;31mDocker未启动\e[0m"
exit 2
elif [ -n "$run" -a -n "$ufs" ] ; then
echo -e "Docker运行正常:\e[0;32m$run\e[0m"
echo -e "Docker加速站点:\e[0;34m $mirror\e[0m"
echo -e "Docker存储驱动:\e[0;31m $ufs\e[0m"
exit 0
elif [ -n "$run" -a -z "$ufs" ] ; then
echo -e "Docker运行正常:\e[0;32m$run\e[0m"
echo -e "Docker加速站点:\e[0;34m $mirror\e[0m"
echo -e "\e[0;31mDocker文件系统不是overlay\e[0m"
echo -n -e "\e[0;31m"
while true ; do read -p "是否修正UFS类型为overlay,y(是),n(否):" let ; option_check letter $let ; done
echo -e "\e[0m"
case $let in
y)
echo "overlay" > /etc/modules-load.d/overlay.conf
sed -i '/ExecStart/c ExecStart=/usr/bin/dockerd --storage-driver=overlay'
systemctl daemon-reload
systemctl restart docker
ufs1=$(docker info | grep "Storage Driver" | grep overlay)
echo -e "Docker存储驱动已修正:\e[0;31m$ufs1\e[0m"
exit 0
;;
n)
exit 2
;;
esac
fi
3 使用说明
- 请填写正确的镜像加速站点,不要用脚本中默认的,那是我自己用的!!!
- 若对脚本使用过程有疑问,或脚本执行错误、有更好的意见等,可在后台留言
- 您也可以直接点击此处下载脚本文件:docker-ce-install.sh
评论