需要直接使用的可以使用下面的鏈接:
通過網盤分享的文件: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
) - 使用多階段構建減小鏡像體積