:通过离线二进制包实现无网络环境部署)
1. 为什么需要离线安装Docker在企业生产环境或特殊网络场景中服务器往往无法直接连接互联网。我遇到过不少这样的情况客户的内网服务器需要部署容器化应用但安全策略禁止外网访问。这时候离线安装就成了刚需。离线安装的核心思路很简单——把需要在线下载的内容提前准备好。就像你去野外露营需要提前把水和食物装进背包。Docker离线安装包就是这个生存包里面包含了所有必需的二进制程序。常见的离线场景包括金融/政务等安全敏感行业的内网环境军工/能源等涉密单位的隔离网络生产环境与互联网物理隔离的服务器集群边缘计算场景中网络条件较差的设备2. 准备工作获取离线安装包2.1 选择合适的Docker版本首先需要在一台能联网的机器上获取Docker二进制包。官方提供了静态编译的版本下载地址为https://download.docker.com/linux/static/stable/x86_64/这里有个小技巧不要盲目选择最新版本。我曾经在一个客户现场踩过坑最新版的Docker与他们的旧内核不兼容。建议先确认目标服务器的内核版本uname -r查看Docker的版本兼容性说明选择经过验证的稳定版本2.2 下载与校验以Docker 20.10.21为例下载命令如下wget -c https://download.docker.com/linux/static/stable/x86_64/docker-20.10.21.tgz重要安全提示下载后务必校验文件完整性我习惯用这两种方式# 校验SHA256 sha256sum docker-20.10.21.tgz # 对比官方公布的校验值 curl -s https://download.docker.com/linux/static/stable/x86_64/sha256sum.txt | grep docker-20.10.21.tgz3. 安装步骤详解3.1 解压二进制包将下载的压缩包上传到目标服务器后执行解压tar -zxvf docker-20.10.21.tgz解压后会得到一个docker目录里面包含这些关键组件dockerdDocker守护进程docker客户端命令行工具containerd容器运行时runc容器执行引擎3.2 部署到系统目录把这些二进制文件复制到系统PATH包含的目录sudo cp -p docker/* /usr/bin/参数-p非常重要它能保持文件原有的权限属性。有次我忘记加这个参数结果导致containerd运行时权限错误。3.3 创建docker用户组为了让普通用户也能使用Docker需要创建用户组sudo groupadd docker sudo usermod -aG docker $USER记得重新登录使组权限生效。这个步骤看似简单但实际部署时经常被忽略导致后续操作需要频繁使用sudo。4. 配置系统服务4.1 编写systemd单元文件Docker在离线环境下需要三个关键服务docker.socket管理API套接字containerd.service容器运行时服务docker.service主守护进程创建/usr/lib/systemd/system/docker.service文件[Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target docker.socket containerd.service Wantsnetwork-online.target Requiresdocker.socket containerd.service [Service] Typenotify ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock ExecReload/bin/kill -s HUP $MAINPID TimeoutSec0 RestartSec2 Restartalways4.2 启动与验证启用并启动服务sudo systemctl enable --now docker.service验证服务状态systemctl status docker.service如果看到active (running)就说明成功了。不过在实际部署中我经常遇到这些问题依赖缺失比如缺少iptables或cgroup支持权限问题/var/run/docker.sock的权限设置不正确SELinux冲突需要适当调整安全策略5. 离线环境下的特殊配置5.1 解决镜像拉取问题离线环境最大的挑战是无法从Docker Hub拉取镜像。我的解决方案是在联网环境提前下载所需镜像使用docker save导出为tar包通过U盘或内网传输到目标服务器用docker load导入镜像例如# 在联网机器上 docker pull nginx:alpine docker save -o nginx-alpine.tar nginx:alpine # 在离线机器上 docker load -i nginx-alpine.tar5.2 配置本地镜像仓库对于长期离线的环境建议搭建本地registrydocker run -d -p 5000:5000 --restart always --name registry registry:2然后把常用镜像推送到这个本地仓库docker tag nginx:alpine localhost:5000/nginx docker push localhost:5000/nginx6. 常见问题排查6.1 网络配置问题即使是在离线环境Docker仍然需要正确的网络配置。检查ip link show docker0 iptables -L -n如果docker0网桥不存在可以尝试sudo systemctl stop docker sudo ip link delete docker0 sudo systemctl start docker6.2 存储驱动选择在较旧的内核上可能需要指定存储驱动sudo mkdir /etc/docker cat EOF | sudo tee /etc/docker/daemon.json { storage-driver: overlay2 } EOF6.3 资源限制调整对于资源受限的环境可以修改服务文件中的限制参数LimitNOFILEinfinity LimitNPROCinfinity7. 实际应用建议经过数十次离线部署的经验我总结出这些最佳实践版本一致性开发、测试、生产环境使用相同Docker版本依赖检查清单提前准备libseccomp等依赖包备份恢复方案定期备份/var/lib/docker目录文档记录详细记录安装步骤和参数配置对于需要批量部署的场景可以考虑制作包含所有依赖的离线安装包使用Ansible等工具编写自动化脚本创建自定义的systemd服务模板最后提醒一点离线环境下的Docker日志尤为重要建议定期检查journalctl -u docker.service -f