docker全离线部署

Docker 全离线部署 Python 应用完整指南

本文详细介绍如何在完全离线的环境中部署 Python应用,涵盖从有网环境准备依赖到离线服务器部署的全流程。

目录


离线部署完整方案

第一步:有网机器准备依赖

1. 拉取基础镜像并保存
bash 复制代码
# 拉取 Python 3.8 镜像
docker pull python:3.8-slim

# 保存为 tar 文件
docker save -o python3.8-slim.tar python:3.8-slim
2. 准备 Python 依赖包
bash 复制代码
# 创建临时目录下载依赖
mkdir /tmp/offline-packages
cd /tmp/offline-packages

# 创建 requirements.txt(与项目一致)
cat > requirements.txt << 'EOF'
streamlit==1.12.0
pandas==1.3.5
numpy==1.21.6
EOF

# 下载所有依赖包(包括子依赖)
pip download -r requirements.txt -d ./packages

如果本机没有 Python 3.8,可以用 Docker 临时容器下载:

bash 复制代码
docker run --rm -v $(pwd):/out python:3.8-slim bash -c "pip download -r /out/requirements.txt -d /out/packages"
3. 修改 Dockerfile(离线安装)
dockerfile 复制代码
FROM python:3.8-slim

WORKDIR /app

# 复制本地依赖包和 requirements
COPY packages/ ./packages/
COPY requirements.txt .

# 离线安装(不连网)
RUN pip install --no-index --find-links=./packages -r requirements.txt

# 复制项目代码
COPY . .

EXPOSE 8501

CMD ["streamlit", "run", "app.py", "--server.address=0.0.0.0", "--server.port=8501"]

第二步:打包传输到离线服务器

bash 复制代码
# 在有网机器上,把以下文件打包
tar czvf deploy-package.tar.gz \
    python3.8-slim.tar \
    packages/ \
    Dockerfile \
    requirements.txt \
    app.py \
    [其他项目文件...]

通过 U 盘/内网/其他方式传到服务器。


第三步:离线服务器部署

bash 复制代码
# 1. 解压
tar xzvf deploy-package.tar.gz
cd deploy-package/

# 2. 加载基础镜像
docker load -i python3.8-slim.tar

# 3. 构建(完全离线)
docker build -t my-streamlit-app .

# 4. 运行
docker run -d -p 8501:8501 --name streamlit-app my-streamlit-app

文件结构总结

复制代码
deploy-package/
├── python3.8-slim.tar      # 基础镜像
├── packages/                 # 所有 Python 依赖 whl 文件
│   ├── streamlit-1.12.0-py2.py3-none-any.whl
│   ├── pandas-1.3.5-xxx.whl
│   └── ...
├── Dockerfile                # 离线安装版本
├── requirements.txt          # 依赖清单
├── app.py                    # 主程序
└── [其他项目文件]

验证离线安装成功

bash 复制代码
# 进入容器检查
docker exec -it streamlit-app bash

# 查看已安装包
pip list | grep streamlit   # 应显示 1.12.0

# 确认没有连网
pip install requests        # 应报错(找不到包)