Linux 系统离线安装 docker、docker compose


本文中使用的安装包、配置文件、脚本文件:docker-20.10.7-linux-x86_64.zip

下载

获取操作系统信息

[root@localhost 桌面]# uname -m
x86_64

docker 下载地址:https://download.docker.com/linux/static/stable/
docker 下载界面
提示:根据上方 操作系统架构 进行下载,如 x86_64 则选择 x86_64 目录。

docker compose 下载地址:https://github.com/docker/compose/releases
在这里插入图片描述
提示:根据上方 操作系统架构 进行下载,如 x86_64 则选择 dokcer-compose-linux-x86_64。

整理安装文件

移动 docker、docker compose 安装包

提示:将 docker-20.10.7.tgz、dokcer-compose-linux-x86_64 放到一个目录,方便安装。本文存放目录:/root/下载/。

编写 docker 系统服务配置文件

[root@localhost 下载]# touch docker.service
[root@localhost 下载]# vi docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target

提示:ExecStart=/usr/bin/dockerd 是配置的执行文件,其中 /usr/bin/ 是安装目录。

编写安装脚本

[root@localhost 下载]# touch docker_install.sh
[root@localhost 下载]# vi docker_install.sh
#!/bin/sh

# 离线安装 docker、docker-compose

echo '解压tar包...'
tar -xvf docker-20.10.7.tgz
echo '将 docker 目录移动 /usr/bin 目录下...'
cp -p docker/* /usr/bin/
rm -rf docker/
echo '将 docker-compose 文件复制到 /usr/local/bin/ 目录下,并重命名为docker-compose'
cp docker-compose-linux-x86_64 /usr/local/bin/docker-compose
echo '为 docker-compose 文件添加执行权限'
chmod +x /usr/local/bin/docker-compose
echo '将 docker.service 移到 /etc/systemd/system/ 目录...'
cp docker.service /etc/systemd/system/
echo '添加文件执行权限...'
chmod +x /etc/systemd/system/docker.service
echo '重新加载配置文件...'
systemctl daemon-reload
echo '启动docker...'
systemctl start docker
echo '设置开机自启...'
systemctl enable docker.service
echo 'docker 安装成功...'
# 验证 docker 是否安装成功
docker -v
# 验证 docker compose 是否安装成功
docker-compose -v

编写卸载脚本

[root@localhost 下载]# touch docker_uninstall.sh
[root@localhost 下载]# vi docker_uninstall.sh
#!/bin/sh

# 卸载 docker 和 docker-compose 

echo '删除docker.service...'
rm -f /etc/systemd/system/docker.service
echo '删除docker文件...'
rm -rf /usr/bin/docker*
echo '删除docker-compose文件'
rm -f /usr/local/bin/docker-compose 
echo '重新加载配置文件'
systemctl daemon-reload
echo '卸载成功...'

安装

[root@localhost 下载]# chmod +x docker.service docker_install.sh docker_uninstall.sh
[root@localhost 下载]# ./docker_install.sh

常见问题/方法

配置 docker 镜像源

提示:此方法可解决一些镜像拉取慢/超时/错误的问题。

[root@localhost 下载]# vi /etc/docker/daemon.json
{"registry-mirrors":["新的镜像地址"]}
[root@localhost 下载]# systemctl daemon-reload
[root@localhost 下载]# systemctl restart docker

以下是网络收集的一些镜像地址,可解决大多数的镜像拉取需求:

{
    "registry-mirrors": [ "https://docker.registry.cyou",
        "https://docker-cf.registry.cyou",
        "https://dockercf.jsdelivr.fyi",
        "https://docker.jsdelivr.fyi",
        "https://dockertest.jsdelivr.fyi",
        "https://mirror.aliyuncs.com",
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.sjtug.sjtu.edu.cn",
        "https://docker.mirrors.ustc.edu.cn",
        "https://mirror.iscas.ac.cn",
        "https://docker.rainbond.cc",
        "https://docker.hpcloud.cloud",
        "https://docker.m.daocloud.io",
        "https://docker.unsee.tech",
        "https://docker.1panel.live",
        "http://mirrors.ustc.edu.cn",
        "https://docker.chenby.cn",
        "http://mirror.azure.cn",
        "https://dockerpull.org",
        "https://dockerhub.icu",
        "https://hub.rat.dev"]
}

镜像导出、导入脚本工具(v0.0.1 - 初版)

提示:镜像导入、导出脚本工具可以将 docker 镜像完整的导出进行备份还原,节省新环境部署镜像的时间。

镜像导出脚本工具

#!/bin/bash

# 获取当前工作目录并设置为导出路径
export_dir="$(pwd)/docker_imgs"

# 创建导出根目录
mkdir -p "$export_dir"

# 获取所有镜像的仓库和标签
image_names=$(docker images --format "{{.Repository}}:{{.Tag}}")

# 检查是否有镜像
if [ -z "$image_names" ]; then
  echo "没有找到Docker镜像,脚本终止。"
  exit 1
fi

# 循环导出每个镜像
for image_name in $image_names; do
  # 提取仓库名和标签
  repository=$(echo "$image_name" | cut -d: -f1)   # 获取仓库名
  tag=$(echo "$image_name" | cut -d: -f2)          # 获取标签

  # 判断仓库名是否包含 '/'
  if [[ "$repository" == *"/"* ]]; then
    # 获取最后一个 '/' 之前的部分作为目录层级
    repo_dir=$(echo "$repository" | sed 's/\(.*\)\/.*/\1/')

    # 获取最后一个 '/' 之后的部分作为镜像名称
    image_name_only=$(echo "$repository" | sed 's/.*\///')

    # 将仓库名称中的 '/' 替换为目录分隔符
    repo_path="$export_dir/$repo_dir"

    # 创建目录结构
    mkdir -p "$repo_path"

    # 生成导出文件名,使用 -- 作为分隔符
    output_file="$repo_path/$image_name_only--$tag.tar"
  else
    # 如果仓库名没有 '/',则直接作为镜像名称
    repo_path="$export_dir"
    image_name_only="$repository"
    
    # 生成导出文件名,使用 -- 作为分隔符
    output_file="$repo_path/$image_name_only--$tag.tar"
  fi

  # 导出镜像
  echo "正在导出镜像: $image_name"
  if docker save -o "$output_file" "$image_name"; then
    echo "成功导出: $image_name$output_file"
  else
    echo "导出失败: $image_name"
  fi
done

echo "所有镜像导出过程完成!"

镜像导入脚本工具

#!/bin/bash

# 获取当前工作目录并设置为镜像 tar 文件的根目录
import_dir="$(pwd)/docker_imgs"

# 检查目录是否存在
if [ ! -d "$import_dir" ]; then
  echo "导入目录 $import_dir 不存在!"
  exit 1
fi

# 递归查找目录中的所有 tar 文件并导入镜像
find "$import_dir" -type f -name "*.tar" | while read tar_file; do
  # 获取相对路径并构建镜像名称
  rel_path=$(realpath --relative-to="$import_dir" "$tar_file")
  
  # 去掉 .tar 后缀,并将最后一个 -- 替换为 :
  image_name=$(echo "$rel_path" | sed 's/\.tar$//' | sed 's/\(.*\)--/\1:/')

  # 导入镜像
  echo "正在导入镜像: $image_name"
  if docker load -i "$tar_file"; then
    echo "成功导入镜像: $image_name"
  else
    echo "导入失败: $image_name"
    exit 1  # 如果导入失败,终止脚本执行
  fi
done

echo "所有镜像导入过程完成!"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值