Docker离线部署全攻略:x86服务器实战指南
1. 项目背景与核心需求
在传统企业IT环境和特殊行业场景中,服务器往往运行在内网隔离环境,无法直接连接互联网获取软件包。这种场景下,如何实现Docker引擎的离线部署及其生态组件的安装,成为基础设施团队必须掌握的硬核技能。本文将以x86架构服务器为例,详解从零开始的完整离线部署方案。
我曾为某金融机构数据中心实施过类似项目,其生产环境要求所有服务器必须运行在物理隔离网络中。通过本文介绍的方法,我们成功在30余台x86服务器上完成了Docker及全套中间件的离线部署,整个过程涉及超过50个依赖包的本地化处理。
2. 离线环境准备工作
2.1 基础系统要求
实施离线部署前,需确保目标系统满足以下条件:
- 操作系统:CentOS/RHEL 7.4+ 或 Ubuntu 18.04+(实测兼容性最佳)
- 架构:x86_64(通过
uname -m命令验证) - 存储:至少20GB可用空间(用于存放离线包和镜像)
- 内存:建议4GB以上(运行容器时需要)
重要提示:不同Linux发行版的依赖包存在差异,本文以CentOS 7.9为例,其他系统需相应调整包管理命令。
2.2 离线资源包准备
在有网络连接的环境中,需要提前下载以下资源:
- Docker CE二进制包(含containerd和runc)
- Docker Compose二进制文件
- 目标中间件的官方镜像(如Redis、MySQL等)
- 系统依赖包(通过
yum downloadonly或apt-get download获取)
具体操作示例:
# 创建资源目录 mkdir -p /opt/offline-docker/{packages,images,scripts} # 下载Docker安装包(以20.10.23版本为例) wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.23-3.el7.x86_64.rpm -P /opt/offline-docker/packages # 下载系统依赖(需提前安装yum-utils) yum install --downloadonly --downloaddir=/opt/offline-docker/packages docker-ce3. Docker引擎离线安装
3.1 传输离线包到目标服务器
将准备好的资源包通过以下方式传输到目标服务器:
- 物理介质:U盘/移动硬盘
- 内部文件服务器:NFS/Samba共享
- 安全传输协议:SCP/rsync
建议使用校验和确保文件完整性:
# 生成校验文件 md5sum /opt/offline-docker/*/* > checksum.md5 # 在目标服务器验证 md5sum -c checksum.md53.2 手动安装Docker组件
在目标服务器执行分步安装:
# 安装依赖包 cd /opt/offline-docker/packages rpm -ivh *.rpm --nodeps --force # 验证安装 docker --version containerd --version常见问题处理:
- 依赖冲突:使用
--nodeps跳过依赖检查,但需确保所有依赖包已离线安装 - 版本不兼容:建议统一使用较稳定的Docker 20.10.x版本
- SELinux干扰:临时设置为permissive模式
setenforce 0
4. 中间件容器化部署
4.1 离线镜像加载方法
将预先导出的镜像文件(.tar格式)加载到本地仓库:
# 加载镜像 docker load -i /opt/offline-docker/images/redis-6.2.6.tar # 标记镜像 docker tag $(docker images -q redis:6.2.6) localhost:5000/redis:6.2.6 # 验证 docker images | grep redis4.2 典型中间件部署示例
Redis单节点部署
docker run -d --name redis \ -p 6379:6379 \ -v /data/redis:/data \ localhost:5000/redis:6.2.6 \ --requirepass "yourpassword" \ --appendonly yesMySQL 5.7部署
docker run -d --name mysql \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=securepwd \ -v /data/mysql:/var/lib/mysql \ localhost:5000/mysql:5.7 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_unicode_ci5. 高级配置与优化
5.1 私有镜像仓库搭建
在内网环境中建议部署Registry v2:
# 启动Registry容器 docker run -d \ -p 5000:5000 \ --restart=always \ --name registry \ -v /data/registry:/var/lib/registry \ registry:2 # 配置Docker信任私有仓库 echo '{ "insecure-registries":["your-server-ip:5000"] }' > /etc/docker/daemon.json systemctl restart docker5.2 存储驱动选择
根据服务器环境选择合适的存储驱动:
overlay2(推荐):需要内核版本≥4.xdevicemapper:适用于旧版内核vfs:兼容性最好但性能差
配置方法:
# 查看当前驱动 docker info | grep "Storage Driver" # 修改驱动(需在daemon.json中配置) { "storage-driver": "overlay2", "storage-opts": ["overlay2.override_kernel_check=true"] }6. 运维监控方案
6.1 基础监控配置
建议部署cAdvisor+Prometheus组合:
# 启动cAdvisor docker run \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --publish=8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor:v0.47.06.2 日志管理方案
推荐使用ELK栈处理容器日志:
# Filebeat容器配置示例 filebeat.inputs: - type: container paths: - '/var/lib/docker/containers/*/*.log' output.logstash: hosts: ["your-logstash-server:5044"]7. 常见问题排查指南
7.1 服务启动失败排查
典型错误1:Docker daemon无法启动
# 查看详细日志 journalctl -u docker.service -b --no-pager -n 100 # 常见原因: # 1. 存储驱动不兼容 → 修改daemon.json # 2. 端口冲突 → netstat -tulnp | grep <端口> # 3. 权限问题 → chmod 777 /var/run/docker.sock典型错误2:容器启动后立即退出
# 查看容器日志 docker logs <container_id> # 常见原因: # 1. 配置文件错误 → docker run -it <image> sh 进入检查 # 2. 存储卷权限 → ls -l /data/mysql # 3. 内存不足 → docker stats7.2 网络连接问题
容器网络不通时检查步骤:
- 验证基础网络:
docker run --rm busybox ping 8.8.8.8 - 检查iptables规则:
iptables -L -n -v --line-numbers - 测试端口映射:
nc -zv localhost 6379
8. 安全加固建议
8.1 基础安全配置
- 禁用root用户直接操作:
groupadd docker usermod -aG docker $USER - 启用内容信任:
export DOCKER_CONTENT_TRUST=1 - 定期清理无用资源:
docker system prune -af
8.2 镜像安全扫描
即使在内网环境也应进行漏洞扫描:
# 使用Trivy扫描本地镜像 docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ aquasec/trivy:latest \ image localhost:5000/redis:6.2.69. 性能调优实践
9.1 容器资源限制
建议为生产容器设置资源配额:
docker run -d \ --name mysql \ --memory="4g" \ --memory-swap="4g" \ --cpus="2" \ --cpu-shares=1024 \ localhost:5000/mysql:5.79.2 内核参数优化
调整sysctl参数提升性能:
# /etc/sysctl.conf vm.swappiness = 1 vm.max_map_count=262144 net.ipv4.ip_local_port_range=1024 65000 net.core.somaxconn=102410. 版本升级策略
10.1 离线环境升级步骤
- 在有网络的环境中下载新版本RPM包
- 使用
rpm -Uvh命令升级:rpm -Uvh docker-ce-<new_version>.rpm \ docker-ce-cli-<new_version>.rpm \ containerd.io-<new_version>.rpm - 重启服务:
systemctl restart docker
10.2 回滚方案
保留旧版本包以便快速回退:
rpm -Uvh --oldpackage docker-ce-<old_version>.rpm