本篇記錄實作 docker + flask 建立的過程,從 dockerfile 參數詳細介紹,到 build image,和透過 docker image 產生隔離的執行環境 container,並且使用 docker 運行 flask 網頁。
此篇的完整程式碼放置於 GitHub,歡迎 git clone 使用。
Table
直接實作一個 Flask 的 dockerfile 試試吧!
▍Step 0 Flask 基礎設定
file
├── Dockerfile
├── main.py
└── requirements.txt
此次會使用到的 main.py ,內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Flask Dockerized' if __name__ == "__main__": app.run(debug=True, host='0.0.0.0', port=8888) |
此次會使用到的 requirements.txt,內容如下:
1 2 3 4 5 6 |
Click==7.0 Flask==1.1.1 itsdangerous==1.1.0 Jinja2==2.10.3 MarkupSafe==1.1.1 Werkzeug==0.16.0 |
▍Step 1 撰寫 dockerfile
基本上 Dockerfile 是由一行一行的指令列所組成,一行指令對 Image 來說就是一層的資料層(Layer),一個Image就是靠這樣一層一層的資料累加上去,最後才編譯出自己想要的映像檔,就像蓋房子一樣。
此次會使用到的 dockerfile,內容如下:
1 2 3 4 5 6 7 8 9 |
FROM python:3.7.2-stretch WORKDIR /app ADD . /app RUN pip install -r requirements.txt CMD python main.py |
doclerfile 參數講解:
- FROM:基底映像檔 (base image)
- WORKDIR:建立工作目錄
- ADD:複製指定的檔案、目錄或遠端檔案 URL,將其加入映像檔檔案系統中的指定位置。
- RUN:每一個 RUN 指令會在現有映像檔之上加入新的一層,是在建立 (build) 映像檔的過程中會執行的指令。
- CMD:一個 Dockerfile 中只能有一個 CMD 指令,CMD 則是在容器運行時所執行的指令。
Tip : 如果有多行 RUN 指令,建議可以這樣寫,避免創造過多的 layer
1 2 |
RUN command && \ command2 |
Tip:想了解更多 dockerfile細節?以下文章是我覺得寫得比較清楚的,推薦給大家
- 關於 ADD vs COPY 的差別? 「初學Docker」Dockerfile易混亂的指令
- 關於 RUN vs CMD vs ENTRYPOINT 的差別? 「初學Docker」Dockerfile易混亂的指令
- 關於更多參數可以參考: Day 18 Docker (4) – iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
▍Step 2 將 dockerfile 打包成 image
Image 指的是已經打包好的環境,但是還沒有跑起來的話,就是一堆檔案而已
1 |
$ docker image build -t dockerfile_test . |
指令參數講解:
docker build -t {mage_name} {current_folder}
▍Step 3 透過 image 產生隔離的執行環境 container
image 跑起來之後產生的 instance 就是 container,他們之間的關係就像程式碼跟跑起來的程式,程式碼不跑就只是一堆檔案,但跑起來之後他就會變成一個真的在跑 process
1 |
$ docker run -d -p 80:8888 --name docker0109 dockerfile_test |
指令參數講解:
-d 背景執行
-p 將主機 80 port 與 container的 8888 port 綁定
–name 為 container 命名
更多更多 docker run參數參考: Docker Container 指令:Docker run & Docker exec – 靖.技場
▍完成,開啟瀏覽器連線試試
連線 0.0.0.0:80 或 127.0.0.1:80 ,就可以看到 Flask Dockerized 就表示成功囉!
▍其他 Container 相關指令介紹:
1.查看正在運行 container 清單
1 |
$ docker container ls |
2.查看所有 container 清單
1 |
$ docker container ls -all |
3.查看 container log
1 |
$ docker container logs {name} |
4.進入 container 操作
1 |
$ docker exec -it {name} /bin/bash |
▍最後:
此篇的完整程式碼放置於 GitHub,歡迎 git clone 使用。
- 第一集:實作 Dockerfile + flask 教學 (附GitHub完整程式)
- 第二集:實作 Dockerfile + nginx + ssl + flask 教學 (附GitHub完整程式)
- 第三集:實作 Docker-compose (Flask+Nginx+PostgreSQL)
更多 Flask 教學相關閱讀:
▍關於 Flask 教學系列目錄:
▍其他 Flask 相關教學:
- 【Flask教學系列】Flask 為甚麼需要 WSGI 與 Nginx
- 【Flask教學系列】Flask-SQLAlchemy 資料庫連線&設定入門 (一)
- 【Flask教學系列】Flask-JWT-Extended 實作
- 【Flask教學系列】實作 Flask CORS
- 【Flask教學系列】實作 Flask CSRF Protection
有關Max行銷誌的最新文章,都會發佈在Max的Facebook粉絲專頁,如果想看最新更新,還請您按讚或是追蹤唷!
在〈實作 Dockerfile + flask 教學 (附GitHub完整程式)〉中有 6 則留言
感謝,測試成功!main.py中的單雙引號 及 “-p 80: 8888″多了一個空白,這兩個地方修正就可以完全複製貼上測試了~
HI Quake 感謝留言,目前已經修正唷!
-p 將主機 8888 port 與 container的 80 port 綁定
請問這段是不是寫反了
已修正, Thanks Vincent!
想請教一下,docker image build -t dockerfile_test .,這段指令要打在打裡?,我打在vscode下的指令列,顯示找不到該指令,不知道該怎麼辦
你已經安裝docker了嗎?