一、Docker 离线安装包(CentOS 7 x86_64)
1. 官方下载目录(可直接浏览器访问)
Docker 官方 CentOS 7 稳定版包地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
2. 推荐版本(稳定兼容 CentOS 7)
直接复制链接到浏览器下载:
containerd.io: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.20-3.1.el7.x86_64.rpmdocker-ce-cli: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-20.10.24-3.el7.x86_64.rpmdocker-ce: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.24-3.el7.x86_64.rpm
说明:下载这 3 个核心包,就能在内网 CentOS7 上离线安装 Docker。
二、内网 CentOS 7 离线安装步骤(直接复制执行)
把这些文件传到内网服务器的任意目录,比如 /home/app/docker-offline,然后执行以下命令:
bash
运行
# 1. 进入安装包目录
cd /home/app/docker-offline
# 2. 安装所有 rpm 包(按顺序或批量安装)
sudo rpm -Uvh *.rpm --force --nodeps
# 3. 启动 Docker 服务
sudo systemctl start docker
# 4. 设置开机自启
sudo systemctl enable docker
# 5. 验证安装是否成功
docker --version
如果看到类似 Docker version 24.0.7, build ... 的输出,就说明安装成功了。
操作方案(离线安装 Docker 两种方式)
方式 1:rpm 本地安装(推荐)
bash
运行
# 进入dabao目录
cd /app/algo/dabao
# 本地批量安装所有docker rpm包
yum localinstall -y *.rpm
# 启动docker并设置开机自启
systemctl start docker
systemctl enable docker
# 验证
docker -v
方式 2:解压 docker.tar 离线部署(无 yum 权限时使用)
bash
运行
tar -zxvf docker.tar.gz
# 解压后按内部readme脚本执行二进制部署
配套 Python 环境部署流程
- 解压 Miniconda 压缩包,离线安装 conda
- 进入
linux-pip目录,使用pip install --no-index --find-links=. *.whl离线安装所有 python 依赖 - 解压
algo_service.tar.gz启动算法业务服务
三、启动 Docker 并设置开机自启
bash
运行
# 启动服务
systemctl start docker
# 开机自动启动
systemctl enable docker
# 查看运行状态
systemctl status docker
最优方案:rpm 离线安装(不用 yum,用原生 rpm 命令)
步骤 1:按依赖顺序逐个安装 rpm 包
bash
运行
# 1. 先装容器运行时containerd
rpm -ivh containerd.io-1.6.33-3.1.el7.x86_64.rpm
# 2. 安装docker客户端
rpm -ivh docker-ce-cli-24.0.7-1.el7.x86_64.rpm
# 3. 安装docker主程序
rpm -ivh docker-ce-24.0.7-1.el7.x86_64.rpm
# 4. 构建插件
rpm -ivh docker-buildx-plugin-0.11.2-1.el7.x86_64.rpm
# 5. compose插件
rpm -ivh docker-compose-plugin-2.20.2-1.el7.x86_64.rpm
⚠️ 如果提示权限不足: 找管理员获取 root 密码,执行 su - 输入密码切换 root 后再执行上面 rpm 命令。
步骤 2:启动 Docker 服务
安装完成后执行:
bash
运行
systemctl start docker
systemctl enable docker
# 查看运行状态
systemctl status docker
步骤 3:验证安装
bash
运行
docker -v
docker compose version
方案 1:获取 root 权限,离线补齐依赖(推荐,稳定标准安装)
1. 先拿到正确 root 密码,切换管理员
联系运维拿到 root 密码执行:
bash
运行
su -
2. 离线批量安装所有 rpm(自动处理依赖顺序)
bash
运行
/usr/bin/rpm -ivh *.rpm --nodeps
--nodeps 参数强制忽略依赖校验,绕过 container-selinux 缺失报错,一次性安装全部 5 个 docker 相关 rpm。
3. 启动 docker 服务
bash
运行
systemctl start docker
systemctl enable docker
docker -v
方案 2:二进制免 rpm 安装(完全不需要 root 密码 / 无依赖限制,兜底方案)
利用目录里 docker.tar 二进制压缩包,仅需普通用户权限部署:
- 解压二进制包
bash
运行
tar -xvf docker.tar
- 将 docker 二进制程序放到用户可执行目录
bash
运行
mkdir -p ~/.local/bin
cp docker/* ~/.local/bin/
chmod +x ~/.local/bin/docker dockerd
- 临时添加环境变量(当前终端生效)
bash
运行
export PATH=$HOME/.local/bin:$PATH
- 后台启动 dockerd(普通用户容器,不占用系统服务)
bash
运行
dockerd --data-root ~/docker-data &
# 验证
docker -v
三、关键补充说明
--nodeps参数风险:强制忽略依赖后,部分 selinux 容器权限功能会缺失,仅内网业务使用无影响;- 二进制方案局限性:不会注册系统 systemd 服务,重启服务器后需要重新执行
dockerd &启动; - 根源问题:这台服务器离线环境缺少
container-selinux依赖 rpm,且你无 root 权限,标准 rpm 安装流程被阻断
文档命令:sudo rpm -Uvh *.rpm --force --nodeps
- 如果你知道 sudo 密码,执行:
bash
运行
sudo rpm -Uvh *.rpm --force --nodeps
- 若 sudo 无权限、只能切 root,先输密码登录 root:
bash
运行
su -
rpm -Uvh *.rpm --force --nodeps
参数说明: --nodeps:跳过依赖检测,规避 container-selinux 缺失报错; --force:强制覆盖安装文件,避免文件冲突。
一、方案 1:基于 Miniconda 官方镜像(推荐,干净标准)
1. 在线可拉取的基础镜像(有外网时)
dockerfile
# 基于miniconda3 python3.12
FROM continuumio/miniconda3:24.5.0
# 创建业务环境
RUN conda create -n rail_algo python=3.12 -y
# 激活环境、安装依赖
SHELL ["conda","run","-n","rail_algo","/bin/bash","-c"]
RUN pip install *.whl --no-index --find-links=/packages
离线使用方式:先在外网导出镜像包 docker save -o miniconda3.tar continuumio/miniconda3:24.5.0,传到内网用 docker load -i miniconda3.tar 导入。
二、方案 2:基于 CentOS7 系统镜像,离线安装 Miniconda(适配你当前服务器系统)
和你本地现有的 Miniconda3-py312_24.5.0-Linux-x86_64.sh 安装包完美配套,纯离线构建,不需要外网镜像:
dockerfile
# 底层和宿主机统一 CentOS7
FROM centos:7
# 拷贝你dabao上层的miniconda安装脚本进容器
COPY Miniconda3-py312_24.5.0-Linux-x86_64.sh /tmp/
# 静默安装miniconda
RUN bash /tmp/Miniconda3-py312_24.5.0-Linux-x86_64.sh -b -p /opt/miniconda3
# 写入环境变量
ENV PATH="/opt/miniconda3/bin:$PATH"
# 创建算法专属conda环境
RUN conda create -n algo python=3.12 -y
# 离线安装whl依赖包
COPY linux_packages /packages
SHELL ["conda","run","-n","algo","/bin/bash","-c"]
RUN pip install --no-index --find-links=/packages *.whl
# 启动你的铁路算法服务
WORKDIR /app
COPY rail_algo_service-code /app
CMD ["conda","run","-n","algo","python","main.py"]
离线打包流程(你内网场景)
- 外网导出
centos:7基础镜像docker save -o centos7.tar centos:7 - 把
centos7.tar、miniconda 安装脚本、所有 whl 离线包、项目代码一起传到内网服务器 - 内网先导入系统镜像:
docker load -i centos7.tar,再执行docker build构建带 conda 的算法镜像
二、导入 Miniconda 镜像包操作(你当前目录文件)
重登录权限生效后执行导入:
bash
运行
# 回到algo目录
cd /app/algo
# 离线加载conda基础镜像
docker load -i Miniconda3-py312_24.5.0-Linux-x86_64.tar.gz
本地已有 Python/conda 环境 + 业务程序打包 Docker 完整步骤
前置说明
你现在机器是 Linux,本地有完整 Miniconda3-py312 环境、rail_algo_service 业务代码,分两种打包方案:
- 方案 A(推荐离线可用):导出 conda 环境清单 + 代码构建镜像(镜像体积小)
- 方案 B(完全复刻本地环境):导出完整 conda 环境目录打包进镜像(和本机环境 1:1)
方案 A:基于环境清单构建(通用、体积小)
步骤 1:导出本地 conda 环境配置
进入你的 conda 环境,导出依赖清单
bash
运行
# 激活你正在使用的conda环境
conda activate base
# 导出环境yml(记录所有包版本)
conda env export > algo_env.yml
# 复制yml到代码目录
cp algo_env.yml /home/app/algo/rail_algo_service0603/
步骤 2:进入代码目录,编写 Dockerfile
bash
运行
cd /home/app/algo/rail_algo_service0603
vim Dockerfile
Dockerfile 内容:
dockerfile
# 基础镜像选用CentOS7(适配你现有服务器环境)
FROM centos:7
# 1. 复制Miniconda离线安装包到容器内
COPY ../Miniconda3-py312_24.5.0-0-Linux-x86_64.sh /tmp/
# 静默安装miniconda到/opt/miniconda3
RUN bash /tmp/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh -b -p /opt/miniconda3 && \
rm -f /tmp/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh
# 将conda加入环境变量
ENV PATH="/opt/miniconda3/bin:$PATH"
# 2. 复制环境依赖文件
COPY algo_env.yml /tmp/
# 根据yml创建conda环境
RUN conda env create -f /tmp/algo_env.yml
# 自动激活conda环境
ENV CONDA_DEFAULT_ENV=base
# 3. 复制业务代码到容器工作目录
WORKDIR /app
COPY . .
# 暴露端口(根据你的服务实际端口修改,示例8080)
EXPOSE 8080
# 容器启动命令,替换为你的服务启动脚本
CMD ["bash", "start.sh"]
步骤 3:构建镜像
bash
运行
# 末尾的 . 代表Dockerfile所在当前目录
docker build -t rail_algo_service:0603 .
步骤 4:本地测试镜像
bash
运行
# 前台启动测试
docker run --rm -p 8080:8080 rail_algo_service:0603
# 后台常驻启动
docker run -d --name rail_algo -p 8080:8080 rail_algo_service:0603
步骤 5:导出镜像(离线部署到其他机器)
bash
运行
docker save -o rail_algo_service_0603.tar rail_algo_service:0603
# 其他机器导入使用
docker load -i rail_algo_service_0603.tar
方案 B:完整复制本机 conda 环境(1:1 复刻本地环境,无重新安装依赖)
适合内网完全离线、无法在线安装包的场景
步骤 1:打包本地完整 conda 环境目录
bash
运行
# 打包本机miniconda目录
tar -zcvf miniconda3.tar.gz /home/app/miniconda3
# 复制压缩包到代码目录
cp miniconda3.tar.gz /home/app/algo/rail_algo_service0603/
步骤 2:Dockerfile(直接解压本地 conda 包)
dockerfile
FROM centos:7
# 复制conda完整压缩包
COPY miniconda3.tar.gz /opt/
# 解压到容器内/opt/miniconda3
RUN tar -zxf /opt/miniconda3.tar.gz -C /opt/ && rm -f /opt/miniconda3.tar.gz
# 配置环境变量
ENV PATH="/opt/miniconda3/bin:$PATH"
# 复制业务代码
WORKDIR /app
COPY . .
EXPOSE 8080
CMD ["bash", "start.sh"]
步骤 3-5:构建、测试、导出镜像
和方案 A 完全一致,命令通用:
bash
运行
# 构建
docker build -t rail_algo_full_env:0603 .
# 测试运行
docker run --rm rail_algo_full_env:0603
# 导出离线镜像包
docker save -o rail_algo_full.tar rail_algo_full_env:0603
关键补充适配你当前环境的注意事项
1. 离线 whl 包补充(如果有 pip 离线依赖)
若你有 linux_pip 目录下的 whl 包,在 Dockerfile 中增加复制安装逻辑:
dockerfile
# 复制whl包目录
COPY ../linux_pip /tmp/whl
# 离线安装所有pip包
RUN pip install --no-index --find-links=/tmp/whl /tmp/whl/*.whl
2. Kafka 网络适配
你的服务依赖 Kafka(Broker:192.168.74.97:9092):
- 容器内访问宿主机 Kafka:启动容器增加
--net=host参数共享宿主机网络
bash
运行
docker run -d --net=host --name rail_algo rail_algo_service:0603
- 若 Kafka 是容器服务,使用 docker 网络互通。
3. 报错避坑
- docker load 只能导入 docker save 导出的 tar:你之前的 Miniconda 压缩包不是镜像包,不能用 load;
- 权限问题:代码目录、miniconda 包权限不足时,构建前执行
chmod 755 文件名; - 镜像体积过大:优先用方案 A(环境清单),不要直接拷贝完整 conda 目录;
- 启动脚本 start.sh 缺少执行权限:构建前给脚本加权限
chmod +x start.sh。
Linux镜像部分
方案 B(最简替代,不用打包系统根目录)
如果你觉得打包整个系统体积太大,提前在外网机器导出 centos:7 镜像文件传到内网导入:
- 外网机器执行:
bash
运行
docker pull centos:7
docker save -o centos7.tar centos:7
- 内网服务器导入(一次导入永久本地缓存,后续构建不再联网):
bash
运行
docker load -i /home/app/algo/centos7.tar
导入后你原来带 FROM centos:7 的 Dockerfile 就能正常构建,不会再请求外网。
Docker 缓存机制:RUN 安装miniconda 这一层被缓存复用,镜像里 /opt/miniconda3 已经存在,再执行 conda env create 就报前缀已存在。
方案 1:构建时彻底禁用缓存(最快临时解决)
bash
运行
docker build --no-cache -t rail_algo_service:0603 .
--no-cache 完全不使用任何缓存,每一层重新执行,不会复用旧的 miniconda 安装层。
方案 2:永久修复 Dockerfile,把创建环境合并进安装步骤,只一条 RUN
直接全量替换你的 Dockerfile:
dockerfile
FROM centos:7
COPY Miniconda3-py312_24.5.0-0-Linux-x86_64.sh /tmp/
COPY linux-pip/linux-pip /tmp/wheels
RUN bash /tmp/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh -b -p /opt/miniconda3 \
&& rm -rf /tmp/*.sh \
&& /opt/miniconda3/bin/pip install --no-index --find-links=/tmp/wheels /tmp/wheels/*.whl \
&& /opt/miniconda3/bin/conda clean -y --all
ENV PATH="/opt/miniconda3/bin:$PATH"
ENV CONDA_DEFAULT_ENV=base
WORKDIR /app
COPY . .
CMD ["bash","start.sh"]
执行流程
-
vim Dockerfile清空原有内容,粘贴上面代码保存 -
执行无缓存构建
-
bash
运行
docker build --no-cache -t rail_algo_service:0603 .原理说明
之前分多条 RUN 会分层缓存:
-
第一层安装 miniconda(缓存)
-
后面再执行 conda 命令,系统目录已存在,直接报错 现在所有 conda/pip 操作合并一条 RUN,一次性执行,不存在目录残留冲突。
结果:构建成功了!
看日志最后几行:
plaintext
exporting to image
writing image
naming to docker.io/library/rail_algo_service:0603
镜像已经正常打包完成,没有报错。
下一步操作
- 查看镜像确认存在
bash
运行
docker images | grep rail_algo_service
- 启动容器(内网 kafka 需要共享宿主机网络)
bash
运行
docker run -d --net=host --name rail_algo0603 rail_algo_service:0603
- 查看容器运行状态
bash
运行
docker ps | grep rail_algo0603
补充说明
之前旧的报错是你没删掉 conda env create 那一段,现在修改 Dockerfile 删除后,全程只用本地离线 pip 安装,不再访问 anaconda 外网源,构建顺利走完。