# 容器工具 - LinuxMirrors

跳转至
如果觉得这个项目不错对您有所帮助的话，请点击仓库右上角的 Star 并分享给更多的朋友

#
Docker 安装与换源脚本

## 一键执行命令

安装仅更换镜像加速器
官网（推荐）
GitHub
Gitee 码云 (镜像仓库)
GitCode (镜像仓库)
jsDelivr (CDN)
腾讯云 EO (CDN)

    bash <(curl -sSL https://linuxmirrors.cn/docker.sh)

    bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/DockerInstallation.sh)

    bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/DockerInstallation.sh)

> 实时同步、无延迟，国内网络环境下推荐使用

    bash <(curl -sSL https://raw.gitcode.com/SuperManito/LinuxMirrors/raw/main/DockerInstallation.sh)

> 同步存在1小时延迟

    bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/DockerInstallation.sh)

    bash <(curl -sSL https://edgeone.linuxmirrors.cn/docker.sh)

> 不建议在国内网络环境下使用

集成安装 `Docker Engine` 和 `Docker Compose`，支持选择或更换软件源（Docker 软件仓库）以及镜像仓库、安装指定版本、重装等功能，支持 ARM 架构

脚本参考官方文档使用系统包管理工具进行安装，不存在兼容性、安全性等问题，可安装的版本由 Docker CE 仓库决定

官网（推荐）
GitHub
Gitee 码云 (镜像仓库)
GitCode (镜像仓库)
jsDelivr (CDN)
腾讯云 EO (CDN)

    bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --only-registry

    bash <(curl -sSL https://raw.githubusercontent.com/SuperManito/LinuxMirrors/main/DockerInstallation.sh) --only-registry

    bash <(curl -sSL https://gitee.com/SuperManito/LinuxMirrors/raw/main/DockerInstallation.sh) --only-registry

> 实时同步、无延迟，国内网络环境下推荐使用

    bash <(curl -sSL https://raw.gitcode.com/SuperManito/LinuxMirrors/raw/main/DockerInstallation.sh) --only-registry

> 同步存在1小时延迟

    bash <(curl -sSL https://cdn.jsdelivr.net/gh/SuperManito/LinuxMirrors@main/DockerInstallation.sh) --only-registry

    bash <(curl -sSL https://edgeone.linuxmirrors.cn/docker.sh) --only-registry

> 不建议在国内网络环境下使用

- 完全替代官方安装脚本

  与 get.docker.com 逻辑一致，融合了本项目换源架构以及特性

- 支持国产衍生操作系统

  兼容大量不受官方安装脚本支持的衍生操作系统

- 功能强大、无与伦比

  全网最实用的开源运维脚本之一，性能卓越

- 精妙绝伦的交互设计

  易于理解和使用的交互式命令行界面，遥遥领先

✨ 经过了数年的技术沉淀与生产环境检验，广受社区好评，深得开发者喜爱，大厂都在使用

Docker Compose 不再需要独立安装

Docker Compose 自 V2 版本起开始作为 Docker CLI（命令行）的一部分，脚本默认集成安装该插件，请使用 `docker compose` 命令替代 `docker-compose`

软件源说明

- Docker CE 软件仓库

  Docker CE 全称 Docker Community Edition（Docker 社区版），是 Docker Engine 的别称，该仓库用于下载并安装 Docker 相关软件包

- Docker Registry 镜像仓库

  用于控制拉取镜像的默认来源存储仓库，又称镜像加速器，默认为官方容器镜像仓库 Docker Hub

由于一些不可抗力的因素，国内网络环境下目前无法访问 Docker Hub 因此不能正常拉取镜像，建议使用下方提到的国内可用镜像仓库源

注：脚本内的指定 Web 协议交互仅用于控制 `Docker CE` 软件源，`Docker Registry` 强制使用 `HTTPS` 协议

内置的镜像仓库源

国内可用

站点名称 | 地址 | 说明
--- | --- | ---
毫秒镜像 | docker.1ms.run | 企业镜像站，CDN智能分发速度极快，支持付费定制，推荐使用
Docker Proxy | dockerproxy.net | 由 ghproxy 创建，可用性高但速度很慢，支持企业镜像付费加速
DaoCloud 道客 | docker.m.daocloud.io | 老牌企业镜像站，可用性高且速度快，现为白名单模式
1Panel 镜像 | docker.1panel.live | 企业产品自用镜像

> 本开源项目不适合采集个人自建的镜像加速器，如有需要可搭配命令选项自行使用

其它

站点名称 | 地址 | 站点名称 | 地址
--- | --- | --- | ---
阿里云（杭州） | registry.cn-hangzhou.aliyuncs.com | 阿里云（日本-东京） | registry.ap-northeast-1.aliyuncs.com
阿里云（上海） | registry.cn-shanghai.aliyuncs.com | 阿里云（新加坡） | registry.ap-southeast-1.aliyuncs.com
阿里云（青岛） | registry.cn-qingdao.aliyuncs.com | 阿里云（马来西亚-吉隆坡） | registry.ap-southeast-3.aliyuncs.com
阿里云（北京） | registry.cn-beijing.aliyuncs.com | 阿里云（印度尼西亚-雅加达） | registry.ap-southeast-5.aliyuncs.com
阿里云（张家口） | registry.cn-zhangjiakou.aliyuncs.com | 阿里云（德国-法兰克福） | registry.eu-central-1.aliyuncs.com
阿里云（呼和浩特） | registry.cn-huhehaote.aliyuncs.com | 阿里云（英国-伦敦） | registry.eu-west-1.aliyuncs.com
阿里云（乌兰察布） | registry.cn-wulanchabu.aliyuncs.com | 阿里云（美国西部-硅谷） | registry.us-west-1.aliyuncs.com
阿里云（深圳） | registry.cn-shenzhen.aliyuncs.com | 阿里云（美国东部-弗吉尼亚） | registry.us-east-1.aliyuncs.com
阿里云（河源） | registry.cn-heyuan.aliyuncs.com | 阿里云（阿联酋-迪拜） | registry.me-east-1.aliyuncs.com
阿里云（广州） | registry.cn-guangzhou.aliyuncs.com | 谷歌云（北美） | gcr.io
阿里云（成都） | registry.cn-chengdu.aliyuncs.com | 谷歌云（亚洲） | asia.gcr.io
阿里云（香港） | registry.cn-hongkong.aliyuncs.com | 谷歌云（欧洲） | eu.gcr.io
腾讯云 | mirror.ccs.tencentyun.com | Docker Hub | registry.hub.docker.com

> 注：国内云计算企业的镜像仓库源仅针对其业务，境内实例可能仍无法访问 Docker Hub

## 命令选项（高级用法）

bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --help
命令选项(名称/含义/值)：
--source 指定 Docker CE 软件源地址(域名或IP) 地址
--source-registry 指定 Docker 镜像仓库地址(域名或IP) 地址
--branch 指定 Docker CE 软件源仓库(路径) 仓库名
--branch-version 指定 Docker CE 软件源仓库版本 版本号
--designated-version 指定 Docker Engine 安装版本 版本号
--codename 指定 Debian 系操作系统的版本代号 代号名称
--protocol 指定 Docker CE 软件源的 Web 协议 http 或 https
--use-intranet-source 是否优先使用内网 Docker CE 软件源地址 true 或 false
--install-latest 是否安装最新版本的 Docker Engine true 或 false
--close-firewall 是否关闭防火墙 true 或 false
--clean-screen 是否在运行前清除屏幕上的所有内容 true 或 false
--lang 指定脚本输出的语言 语言
--only-registry 仅更换镜像仓库模式 无
--ignore-backup-tips 忽略覆盖备份提示 无
--pure-mode 纯净模式，精简打印内容 无
--help 查看帮助菜单 无

名称 | 含义 | 选项值
--- | --- | ---
`--source` | 指定 `Docker CE` 源地址(域名或IP) | `地址`
`--source-registry` | 指定 `Docker` 镜像仓库地址(域名或IP) | `地址（多个用英文逗号分割）`
`--branch` | 指定 `Docker CE` 软件源仓库(路径) | `仓库名（详见下方文档）`
`--branch-version` | 指定 `Docker CE` 软件源仓库版本 | `版本号（详见下方文档）`
`--designated-version` | 指定 `Docker Engine` 安装版本 | `版本号（详见下方文档）`
`--codename` | 指定 `Debian` 系操作系统的版本代号 | `代号名称`
`--protocol` | 指定 `Docker CE` 源的 Web 协议 | `http` 或 `https`
`--use-intranet-source` | 是否优先使用内网 `Docker CE` 软件源地址 | `true` 或 `false`
`--install-latest` | 是否安装最新版本的 `Docker Engine` | `true` 或 `false`
`--close-firewall` | 是否关闭防火墙 | `true` 或 `false`
`--clean-screen` | 是否在运行前清除屏幕上的所有内容 | `true` 或 `false`
`--lang` | 指定脚本输出的语言 | `语言ID（详见下方文档）`
`--only-registry` | 仅更换镜像仓库模式 | 无
`--ignore-backup-tips` | 忽略覆盖备份提示（即不覆盖备份） | 无
`--pure-mode` | 纯净模式，精简打印内容 | 无
`--help` | 查看帮助菜单 | 无

> 软件源完整格式 `<WEB协议>://<软件源地址(域名或IP)>/<软件源仓库(路径)>`

- ### 指定镜像仓库地址

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --source-registry registry.example.com

  可以同时指定多个地址，需使用英文逗号进行分割

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) \
        --source-registry "registry-1.example.com,registry-2.example.com"

- ### 仅更换镜像仓库

  使用脚本一键替换手动替换

  仅更换镜像加速器，当检测到未安装 Docker 时会报错跳出

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --only-registry

  懒人一键命令（使用多个地址）

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) \
        --only-registry \
        --source-registry "docker.1ms.run,docker.1panel.live,docker.m.daocloud.io"

  > 选项值可以指定多个地址，需使用英文逗号进行分割

  - 安装 `jq` 软件包

    Debian 系 / openKylinRedHat 系 / openEuler / OpenCloudOS / Anolis OS

        apt-get install -y jq

    > `Debian` `Ubuntu` `Kali` `Linux Mint` `Deepin` `Zorin OS` `Armbian` `Proxmox VE` `Raspberry Pi OS` `openKylin`

    新装系统需要先执行一遍更新 `apt-get update`

        dnf install -y jq || yum install -y jq

    > `Red Hat Enterprise Linux` `CentOS` `Rocky Linux` `AlmaLinux` `Fedora` `openEuler` `OpenCloudOS` `Anolis OS`

  - 指定镜像仓库地址

    > 请手动替换 `<example.registry.com>` 为镜像仓库地址后在执行，详见上方 “项目内置的镜像仓库源” 表格中的地址列

        SOURCE_REGISTRY='"https://<example.registry.com>"'

    还可以指定多个镜像仓库，如 `SOURCE_REGISTRY='"https://example.registry.com","https://test.registry.com"'`，注意用英文逗号分割

  - 替换镜像仓库地址

        [ -s "/etc/docker/daemon.json" ] || echo "{}" >/etc/docker/daemon.json
        jq '.["registry-mirrors"] = ['"${SOURCE_REGISTRY}"']' /etc/docker/daemon.json >/etc/docker/daemon.json.tmp && mv /etc/docker/daemon.json.tmp

  - 重启 Docker 服务

        systemctl daemon-reload
        [[ $(systemctl is-active docker) == "active" ]] && systemctl restart docker || systemctl enable --now docker

- ### 指定 Docker CE 软件源地址

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --source mirror.example.com/docker-ce

  > 注意该地址路径需要包含镜像站的 Docker CE 软件源仓库路径即 `docker-ce`

- ### 指定 Docker CE 软件源仓库

  脚本默认会自动判断一般无需指定，除非你有特殊需求

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --branch centos

  > 仓库名是固定的，目前只有 `centos` `debian` `fedora` `raspbian` `rhel` `sles` `static` `ubuntu` 这几个
  > 具体详见 官方安装文档 和 Docker CE 官方仓库

  还可以指定仓库版本号

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) \
        --branch centos \
        --branch-version 9

  > 可以使用该选项来控制安装软件包的兼容性（仅适用于红帽系操作系统），具体详见对应仓库目录中代表版本号的路径名称（正整数）。

- ### 指定 Docker Engine 安装版本

  指定安装版本时会忽略 `是否安装最新版本` 的命令选项，格式为 `主版本.次版本.补丁版本`，例如 `28.4.1`。

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --designated-version 28.0.0

  > 如果指定的版本不存在或者不支持当前系统，届时脚本会报错跳出

  查看版本列表的方法
  Debian 系RedHat 系 / openEuler / OpenCloudOS / Anolis OS

      apt-cache madison docker-ce | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" | sort -t '.' -k1,1nr -k2,2nr -k3,3nr

  > `Debian` `Ubuntu` `Kali` `Linux Mint` `Deepin` `Zorin OS` `Armbian` `Proxmox VE` `Raspberry Pi OS`

      dnf list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" | sort -t '.' -k1,1nr -k2,2nr -k3,3nr

  > `Red Hat Enterprise Linux` `CentOS` `Rocky Linux` `AlmaLinux` `Fedora` `openEuler` `OpenCloudOS` `Anolis OS`

  未出现在该列表中的版本则不支持通过本脚本安装，如果获取不到版本列表说明你当前的系统环境还没有正确配置 Docker CE 软件源（运行脚本时不存在该问题）

- ### 国际化（I18n）

  脚本提供多语言支持，当前内置 `简体中文`、`繁體中文`、`English` 共三种显示语言，默认为 `简体中文`

  - #### 指定语言

        bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --lang xxx

    类型 | 值
    --- | ---
    简体中文 | `zh-hans` `zh-cn` `zh`
    繁體中文 | `zh-hant` `zh-tw` `zh-hk`
    English | `en` `en-us`

    也可以直接作为命令选项使用

        bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --en

    > `--en` `--en-us` `--zh` `--zh-cn` `--zh-hans` `--zh-hant`

  - #### 通过交互进行选择

        bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --lang auto

- ### 无人值守（自动化）

  不通过交互完成安装操作，至少需要使用如下命令选项来实现，建议熟悉后再使用

  参考命令

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) \
        --source mirror.example.com/docker-ce \
        --source-registry registry.hub.docker.com \
        --protocol http \
        --use-intranet-source false \
        --install-latest true \
        --close-firewall true \
        --ignore-backup-tips

  > 如果报错 `命令选项无效` 那么请检查选项合法性以及空格字符编码，在示例中一行写一个选项是为了提高命令的可读性

- ### 纯净模式

  推出该功能是为了便于开发以及运维人员使用，启用后会精简脚本内容输出，建议搭配其它命令选项无交互使用

      bash <(curl -sSL https://linuxmirrors.cn/docker.sh) --pure-mode

  滚动输出的命令日志可能存在无法预料的显示问题，不过目前暂未发现异常

## 常见问题

- #### 关于服务报错无法启动

  非新装环境可能会在运行脚本后遇到 `Docker` 服务无法启动的情况，建议重新安装来解决，卸载不会删除本地镜像和容器数据

  卸载命令如下：

  Debian 系RedHat 系 / openEuler / OpenCloudOS / Anolis OS

      apt-get remove -y docker* containerd.io runc && apt-get autoremove

  > `Debian` `Ubuntu` `Kali` `Linux Mint` `Deepin` `Zorin OS` `Armbian` `Proxmox VE` `Raspberry Pi OS`

      yum remove -y docker* containerd.io podman* runc

  > `Red Hat Enterprise Linux` `CentOS` `Rocky Linux` `AlmaLinux` `Fedora` `openEuler` `OpenCloudOS` `Anolis OS`

  卸载完成后重新执行脚本安装即可

- #### 关于不支持的操作系统

  如果提示不支持那么请使用系统自带的包管理工具进行安装。因为这些软件包由 Linux 发行版的软件包维护者构建和维护，可能存在配置差异或由修改后的源代码构建。

  也可以使用

## 最佳实践

适用于企业产品部署以及 CI/CD 等自动化运维场景的代码示例（展开查看）

如果你不想让用户进行任何交互，请使用 `完全自动化` 示例

- #### 完全自动化（推荐）

      # !/bin/bash
      function install_docker() {
          if command -v docker &>/dev/null; then
              return
          fi

          # script options
          local script_host="linuxmirrors.cn" # official host (CDN), more host see official site
          local script_lang="zh-hans"         # script display language: zh-hans / zh-hant / en / auto
          local close_firewall="true"         # close firewalld service and selinux (redhat systems need)
          # mirrors options
          local source_docker_ce_address="mirrors.tencent.com/docker-ce" # global high availability address
          local source_docker_ce_protocol="https"                        # https or http
          local source_docker_registry_address="registry.hub.docker.com"

          # judge network environment
          local region_code="$(curl -s ipinfo.io/country)"
          if [[ "${region_code}" == "CN" ]]; then
              local source_intranet_address=""
              # use intranet source if possible
              if [ -s "/sys/class/dmi/id/sys_vendor" ]; then
                  local sys_vendor="$(cat /sys/class/dmi/id/sys_vendor)"
                  if [[ "${sys_vendor}" == *"Alibaba"* ]]; then
                      source_intranet_address="mirrors.cloud.aliyuncs.com/docker-ce"
                  elif [[ "${sys_vendor}" == *"Huawei"* ]]; then
                      source_intranet_address="mirrors.myhuaweicloud.com/docker-ce"
                  elif [[ "${sys_vendor}" == *"Tencent"* ]]; then
                      source_intranet_address="mirrors.tencentyun.com/docker-ce"
                  elif [[ "${sys_vendor}" == *"Inspur"* ]]; then
                      source_intranet_address="mirrors.ivolces.com/docker-ce"
                  fi
              else
                  cat /etc/motd | grep "Alibaba Cloud " -q
                  if [ $? -eq 0 ]; then
                      source_intranet_address="mirrors.cloud.aliyuncs.com/docker-ce"
                  fi
              fi
              # check connectivity
              if [ -n "${source_intranet_address}" ]; then
                  if ping -c1 -W1 "${source_intranet_address%%/*}" >/dev/null 2>&1; then
                      source_docker_ce_address="${source_intranet_address}"
                      source_docker_ce_protocol="http"
                  fi
              fi
              # registry mirror (best choice for Chinese mainland)
              source_docker_registry_address="docker.1ms.run"
          else
              # use official source
              source_docker_ce_address="download.docker.com"
              source_docker_registry_address="registry.hub.docker.com"
          fi

          # install docker engine
          bash <(curl -sSL https://${script_host}/docker.sh) \
              --source "${source_docker_ce_address}" \
              --source-registry "${source_docker_registry_address}" \
              --protocol "${source_docker_ce_protocol}" \
              --close-firewall "${close_firewall}" \
              --install-latest true \
              --ignore-backup-tips \
              --lang "${script_lang}" \
              --pure-mode
      }

      install_docker

- #### 简易方式

      # !/bin/bash
      function install_docker() {
          if command -v docker &>/dev/null; then
              return
          fi

          bash <(curl -sSL https://${script_host}/docker.sh) \
              --install-latest true \
              --ignore-backup-tips \
              --lang auto

          if command -v docker &>/dev/null; then
              echo -e "\n# Docker installation successful.\n# Please run this script again manually after installation."
              exit 0
          else
              echo -e "\n# Docker installation failed.\n# Please check the error message above."
              exit 1
          fi
      }

      install_docker

  > 注：不指定 `Docker CE 源` 以及 `镜像仓库源` 则会交由用户进行交互选择，届时会自动清屏 `$ clear`，从而导致你脚本的运行日志被清除