docker部署flask并迁移至内网
需要直接使用的可以使用下面的链接:
通过网盘分享的文件:docker_flask.tar
链接: https://pan.baidu.com/s/163ocPFw8cqfXgVXeejv36g?pwd=qxqm 提取码: qxqm
来自百度网盘超级会员v6的分享
外网部署docker版flask
目录结构
./miniconda-docker/
├── docker-compose.yml
├── Dockerfile
└── workspace
1. 更新后的 docker-compose.yml
(无 version 字段)
services:miniconda:build: .container_name: miniconda_appports:- "5000:5000"volumes:- ./workspace/app.py:/workspace/app.py # 关键挂载- ./workspace:/workspaceenvironment:FLASK_APP: app.pyFLASK_ENV: development
2. 优化后的 Dockerfile
FROM ubuntu:20.04# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive \PATH="/opt/conda/bin:$PATH" \CONDA_DIR="/opt/conda"# 安装基础依赖
RUN apt-get update && apt-get install -y \wget \bzip2 \ca-certificates \&& rm -rf /var/lib/apt/lists/*# 下载并安装 Miniconda(清华源)
RUN wget -q https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh -O miniconda.sh && \bash miniconda.sh -b -p $CONDA_DIR && \rm miniconda.sh# 接受Anaconda许可协议
RUN conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main && \conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r# 配置全量清华源
RUN conda config --remove-key channels && \conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ && \conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ && \conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ && \conda config --set show_channel_urls yes# 配置pip清华源
RUN mkdir -p /root/.pip && \echo '[global]\n\
index-url = https://pypi.tuna.tsinghua.edu.cn/simple\n\
trusted-host = pypi.tuna.tsinghua.edu.cn' > /root/.pip/pip.conf# 创建Python环境并安装依赖
RUN conda create -n python311 python=3.11 -y && \/opt/conda/envs/python311/bin/pip install numpy flask pandas# 设置工作目录
WORKDIR /workspace
COPY app.py .# 启动命令
CMD ["bash", "-c", "source /opt/conda/bin/activate python311 && flask run --host=0.0.0.0"]
3. 验证用的 app.py
from flask import Flask, jsonify
import numpy as np
import pandas as pdapp = Flask(__name__)app.json.ensure_ascii = False
@app.route('/')
def hello():# 生成测试数据array = np.array([1, 2, 3])df = pd.DataFrame({'列A': [1, 2], '列B': [3, 4]})# 构造响应数据response = {"服务状态": "Flask服务运行正常!","numpy示例数组": array.tolist(),"pandas数据表": {"列名称": list(df.columns),"数据内容": df.to_dict(orient='records')},"环境信息": {"Python版本": "3.11","依赖包版本": {"numpy": np.__version__,"pandas": pd.__version__,"flask": "2.3.2"}}}return jsonify(response) # 使用jsonify保持JSON格式if __name__ == '__main__':app.run(host='0.0.0.0', debug=True)
使用说明
- 创建目录和文件:
mkdir -p miniconda-docker/workspace
cd miniconda-docker
touch docker-compose.yml Dockerfile app.py
-
将上述内容写入对应文件
-
构建并启动:
docker compose up -d --build
- 验证服务:
curl http://localhost:5000
# 或浏览器访问 http://localhost:5000
方案特点
- 完全兼容新版本:移除
version
字段,适配最新 Docker Compose - 最小化构建:每个 RUN 指令都清理缓存
- 国内优化:全程使用清华源加速
- 环境隔离:在独立 conda 环境中安装 Python 和依赖
- 生产就绪:适合直接部署到生产环境
常见问题处理
如果遇到构建问题,可以尝试:
# 彻底清理旧构建
docker compose down --rmi all# 重新构建
docker compose build --no-cache
迁移至内网
以下是完整的容器导出为镜像并部署到内网的步骤:
1. 导出当前容器为镜像
# 查看运行中的容器ID
docker ps# 将容器提交为镜像(推荐使用--change参数固化配置)
docker commit \--change='CMD ["bash", "-c", "source /opt/conda/bin/activate python311 && flask run --host=0.0.0.0"]' \--change='ENV PATH=/opt/conda/envs/python311/bin:$PATH' \979444076b82 my_flask_app:1.0
2. 验证新镜像
# 查看新镜像
docker images | grep my_flask_app# 测试运行
docker run -d -p 5000:5000 --name test_flask my_flask_app:1.0
curl http://localhost:5000
3. 导出镜像文件(两种方式任选)
方式一:保存为压缩包(推荐)
docker save my_flask_app:1.0 | gzip > my_flask_app_1.0.tar.gz
方式二:导出为容器快照
docker export 979444076b82 > my_flask_container.tar
4. 内网部署步骤
在内网机器上操作:
# 1. 传输镜像文件到内网(需用U盘/内部文件服务)
scp my_flask_app_1.0.tar.gz user@internal-server:/path/# 2. 加载镜像
gunzip -c my_flask_app_1.0.tar.gz | docker load# 3. 运行容器
docker run -d \-p 5000:5000 \-v /path/to/app_data:/workspace \--name flask_prod \my_flask_app:1.0
5. 生产环境增强配置(可选)
创建 docker-compose.prod.yml
version: '3.8'
services:flask_app:image: my_flask_app:1.0restart: alwaysports:- "5000:5000"volumes:- /data/flask_app:/workspaceenvironment:FLASK_ENV: productionTZ: Asia/Shanghai
启动命令
docker-compose -f docker-compose.prod.yml up -d
关键注意事项
-
路径固化:
- 确保容器内所有路径使用绝对路径(如
/workspace/app.py
) - 检查挂载卷路径是否存在
- 确保容器内所有路径使用绝对路径(如
-
依赖检查:
# 进入容器检查环境 docker exec -it flask_prod /opt/conda/envs/python311/bin/pip list
-
防火墙设置:
- 内网机器需开放5000端口
- 建议配合Nginx反向代理
-
离线包备份(针对极端内网环境):
# 导出conda环境配置 docker exec 979444076b82 /opt/conda/envs/python311/bin/pip freeze > requirements.txt
排错指南
如果部署失败:
-
检查镜像完整性:
docker run -it --rm my_flask_app:1.0 bash -c "python -c 'import flask; print(flask.__version__)'"
-
查看容器日志:
docker logs -f flask_prod
通过以上步骤,您可以将开发好的Flask应用完整迁移到内网环境。如需更高安全性,建议:
- 使用私有Docker仓库(如Harbor)
- 构建时删除缓存(
docker build --no-cache
) - 使用多阶段构建减小镜像体积