Linux 系统离线安装 docker、docker compose
Linux 系统(以银河麒麟系统x86_64为例)离线安装 docker、docker compose
- 下载
- 整理安装文件
- 移动 docker、docker compose 安装包
- 编写 docker 系统服务配置文件
- 编写安装脚本
- 编写卸载脚本
- 安装
- 常见问题/方法
- 配置 docker 镜像源
- 镜像导出、导入脚本工具(v0.0.1 - 初版)
- 镜像导出脚本工具
- 镜像导入脚本工具
本文中使用的安装包、配置文件、脚本文件:
docker-20.10.7-linux-x86_64.zip
下载
获取操作系统信息
[root@localhost 桌面]# uname -m
x86_64
docker 下载地址:https://download.docker.com/linux/static/stable/
提示:根据上方 操作系统架构 进行下载,如 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/(.*)/.*//')
# 获取最后一个 '/' 之后的部分作为镜像名称
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/(.*)--/:/')
# 导入镜像
echo "正在导入镜像: $image_name"
if docker load -i "$tar_file"; then
echo "成功导入镜像: $image_name"
else
echo "导入失败: $image_name"
exit 1 # 如果导入失败,终止脚本执行
fi
done
echo "所有镜像导入过程完成!"