情境三:手上有一個影像辨識App(用Flask架構出來),用container做為測試環境

這裡我們拆解成三個部分,一般來說無絕對先後順序,有可能一開始就用docker開發, 有可能從既有的服務容器化。

  1. 開發程式碼檔案
  2. 設置好container
  3. 啟用app服務並測試

先編寫好我們的dockerfile,直接下載pytorch image,並在裡面安裝使用到的工具 git, vim, jupyter和flask:

FROM pytorch/pytorch

RUN apt-get update && \
    apt-get install -y git vim && \
    python -m pip install jupyter flask

接著Build image,

根據平常開發程式碼放置地方,有三種選擇:

(i) 在github

> docker run -it -p 30:30 image_net_app
> git clone https://github.com/oicjacky/ML-course-of-Lee.git
> cd ML-course-of-Lee/ImageNetAPP/
> ls
README.md  app.py  imagenet_class_index.json  inference.py

(ii) 在本機端,掛載硬碟方式啟動container

> docker run -it -p 30:30 -v C:\Users\user\Pyvirtualenv\course_CNN\ImageNetAPP:/mount/ImageNetAPP image_net_app
> cd /mount/ImageNetAPP
> ls
README.md  __pycache__  app.py  dockerfile  imagenet_class_index.json  inference.py

(iii) 一樣在本機端,但在Build image時就把它一起打包進去

# 內容和上面dockerfile一樣
# '.'代表你目前工作目錄底下檔案都會複製進去/mount/ImageNetAPP
# 可以用.dockerignore
COPY . /mount/ImageNetAPP

這裡我選擇(i)作為操作結果。

進入container後,設定好環境變數後,就可以跑flask服務啟動app.py:

最後我們測試從本機送請求給container的app服務:

import requests
resp = requests.post("http://localhost:30/predict",
                     files={"file": open(r'C:\Users\user\Pyvirtualenv\course_CNN\images\kobe.png','rb')})
print(resp.json())

這時container裡的terminal:

可以看到我們成功收到172.17.0.1(我的本機)的POST request,服務返回模型判斷這張照片是basketball。

Reference

  1. Docker
  2. 如何將 Docker 應用在資料科學
  3. Dockerfile實踐
  4. Docker for beginners
  5. A great docker_practice repo by Cheng-hao, Lee