Docker 安装脚本

闫志聪
2023-06-11 / 0 评论 / 70 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年11月21日,已超过182天没有更新,若内容或图片失效,请留言反馈。

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
5

评论

博主关闭了当前页面的评论