Docker和Docker-compose离线包部署全过程
作者:学无止境的宝妈
本文介绍了在局域网内无法访问外网的工作服务器上部署Docker和Docker Compose的步骤,包括选择合适的Docker静态包版本、下载Docker官方静态包、配置Docker服务和daemon.json文件、下载Docker和Docker Compose文件、打包文件以及编写离线安装脚本
适用场景
工作服务器有时为局域网,不能连外网的情况下。
在线部署的话参考官方文档:
https://docs.docker.com/engine/install/centos/#install-from-a-package
选择适合的Docker静态包版本
访问Docker官方静态包下载页面
https://download.docker.com/linux/static/stable/
时,需要根据操作系统架构选择正确的版本。
常见的架构类型包括:
- x86_64/amd64:大多数现代Linux服务器的标准架构
- aarch64/arm64:ARM架构处理器(如树莓派、AWS Graviton实例,大部分信创服务器为arm架构)
- s390x/ppc64le:IBM Power和Z系统架构
版本命名规则示例:
docker-<version>.tgz(如docker-24.0.7.tgz)表示最新稳定版docker-<version>-ce.tgz(如docker-19.03.9-ce.tgz)表示社区版

docker-compose版本的选择,可在官网发行记录下找到:
https://docs.docker.com/engine/release-notes/20.10/

离线安装脚本示例
1、准备docker.service
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 --graph /workspace/docker_data/docker/lib/ 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
2、准备daemon.json文件
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "512m",
"max-file": "10",
"compress": "true"
},
"storage-driver": "overlay2",
"registry-mirrors" : [
"https://ot2k4d59.mirror.aliyuncs.com/"
],
"insecure-registries": ["xx.xx.xx.xx"]
}
log-opts为日志限制,以防docker日志把服务器磁盘吃完,max-size单文件最大限制,max-file文件最多个数,registry-mirrors为加速器,有用的加速器可尝试以下内容
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.mybacc.com",
"https://dytt.online",
"https://lispy.org",
"https://docker.xiaogenban1993.com",
"https://docker.yomansunter.com",
"https://aicarbon.xyz",
"https://666860.xyz",
"https://docker.zhai.cm",
"https://a.ussh.net",
"https://hub.littlediary.cn",
"https://hub.rat.dev",
"https://docker.m.daocloud.io",
"https://dockerproxy.net"
],
3、下载docker和docker-compose文件
按照开头说的地址下载docker和docker-compose文件
放到上面docke.service和daemon.json同目录下。
将所有内容打包,目录结构如下:

将上述文件压缩成zip包后面复用,zip -r docker_package.zip docker_package
4、开始准备脚本(示例脚本亲测一直在用的)
以下脚本演示如何自动化完成Docker和Docker Compose的离线安装:
#!/bin/bash
#!/bin/bash
# 该脚本是以20.10.8版本为基准,其他版本需要改下面对应版本号
# 定义当前服务器最大的目录,docker默认是装到根目录下的
max_path=/workspace
max_docker_path=$max_path/docker_data/lib/
# 本机服务名写入hosts文件,我在部署一些中间件或微服务时会提示unknown hostname的错误,以下脚本可解决
grep "127.0.0.1 $(hostname)" /etc/hosts >/dev/null || echo "127.0.0.1 $(hostname)" >> /etc/hosts
if which docker >/dev/null; then
echo "检测到docker已安装,跳过安装步骤"
else
unzip docker_package.zip
mv ./docker_package/* ./
mkdir -p /etc/docker
cp ./daemon.json /etc/docker/
echo '解压tar包...'
tar -xvf $(pwd)/docker-20.10.8.tgz
echo '创建docker容器存放的路径'
mkdir -p ${max_docker_path}
echo '将docker目录移到/usr/bin目录下...'
cp ./docker/* /usr/bin/
echo '将docker.service最大目录进行修改'
sed -i -e "s#ExecStart=.*#ExecStart=/usr/bin/dockerd --graph ${max_docker_path}#g" ./docker.service
# 以下命令是解决有些操作系统部署后 内存不够用的问题 以下可解决
kernel_real=`uname -r`
if [[ $kernel_real == *oe* ]]; then
sed -i -e "s#LimitNOFILE=.*#LimitNOFILE=65535#g" ./docker.service
sed -i -e "s#LimitNPROC=.*#LimitNPROC=65535#g" ./docker.service
sed -i -e "s#LimitCORE=.*#LimitCORE=65535#g" ./docker.service
fi
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 -v
fi
if which docker-compose >/dev/null; then
echo "检测到 Docker Compose 已安装,跳过安装步骤"
else
echo 'docker-compose 安装'
cp ./docker-compose-linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
echo 'docker-compose安装成功...'
docker-compose -v
fi
# 清理战场
rm -rf docker_package.zip
rm -rf docker_package
rm -rf docker-compose-linux-x86_64
rm -rf docker.service
rm -rf daemon.json
rm -rf docker-20.10.8.tgz
rm -rf docker
卸载docker和docker-compose
原路卸载
#停止docker服务 systemctl stop docker #删除docker二进制文件 rm -f /usr/bin/containerd rm -f /usr/bin/containerd-shim rm -f /usr/bin/containerd-shim-runc-v2 rm -f /usr/bin/ctr rm -f /usr/bin/docker rm -f /usr/bin/dockerd rm -f /usr/bin/docker-init rm -f /usr/bin/docker-proxy rm -f /usr/bin/runc #卸载docker-compose二进制文件 rm -f /usr/bin/docker-compose
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
