博客地址:https://blog.csdn.net/CoderPai/article/details/84433481點擊閱讀原文,更好的閱讀體驗
docker系列學習(一):整體認識
docker系列學習(二):Docker + Flask 例子(當前文章)
這是一個簡單的 Docker + Flask 入門教程。我在那裡找到了很多不同的方法,但經過我自己的努力之後,我想分享我能想到的最簡潔的版本。我希望這會有所幫助。在接下來的學習中,你將學習到如何創建,運行,構建,推送,拉取,殺死,修剪和使用 flask 作為 api 在 docker 中如何工作。
設置步驟創建一個文件夾來保存項目。我們將在這裡花費大部分時間,首先我們使用 mkdir 命令創建文件夾。
mkdir hello_docker_flask
之後利用 cd 命令切換到這個目錄。
cd hello_docker_flask
確保安裝了 docker,版本並不是特別重要,因為這些基本命令在所有版本中都大致相同。接下來,我們來查看一下 docker 的版本:
docker -v
Docker version 18.09.0, build 4d60db4
現在 docker 已經準備就緒了,看看你是否有任何正在運行的容器。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<I do not have have any running right now>
如果你剛剛開始,那裡不應該有任何東西。無論哪種方式,讓另一個同時運行也不會有什麼壞處。如果有一些目前正在運行,並且你希望殺死他們,你可以如下操作:
docker kill <CONTAINER ID>
你還可以檢查是否有任何容器,即使他們沒有運行。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mtngt/angular_docker latest ec5a8c5f01f1 2 hours ago 17MB
我們的這些操作雖然沒有產生任何收益,但是檢查一下你已經擁有的東西是一個非常好的習慣。如果你想要清除所有未運行的東西,可以運行如下命令:
docker system prune -a
這將刪除你在本地 docker 實例中的所有內容。所以要小心。好了,現在我們知道了基礎知識,讓我們開始學習吧。
創建文件首先,我們需要一個簡單的 flask 文件,我打算製作一個即能使用 flask 也能使用 flask_restful 的產品。在這一點上,我將假設你知道 Python 基礎知識並安裝了 Python 。
python --version
Python 3.6.3 :: Anaconda, Inc.
在 hellodockerflask 文件夾中創建一個名為 app.py 的新文件,其中包含一些基本的 flask 代碼。
app.py
# app.py - a minimal flask api using flask_restful
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
你會注意到 Python 文件導入了一些東西。雖然你現在可能在本地已經安裝使用它們,但是下一臺機器的下一個人可能不會。所以我們需要創建一個 requirements.txt 文件,以便在我們的 docker 運行時導入它們。
requirements.txt
flask
flask_restful
現在我們在同一目錄中需要一個 Dockerfile。它只是名為 Dockerfile,沒有擴展名,沒有後綴。
Dockerfile
# Dockerfile - this is a comment. Delete me if you want.
FROM python:3.6.3
COPY . /app
WORKDIR /app
RUN pip install -r requirements.txt
ENTRYPOINT ["python"]
CMD ["app.py"]
這個代碼表示:
FROM:該 image 文件繼承官方的 python image,冒號表示標籤,這裡標籤是3.6.3,即3.6.3版本的 python。
COPY:該當前目錄下的所有文件(除了 .dockereignore 排除的路徑),都拷貝誒進入 image 文件的 /app 。
WORKDIR:指定接下來的工作路徑為 /app。
RUN:在 /app 目錄下,運行 pip install -r requirements.txt 命令安裝依賴。注意,安裝後所有的依賴,都將打包進入 image 文件。
EXPOSE 3000:將容器 3000 埠暴露出來,允許外部連接這個埠。
ENTRYPOINT 和 CMD:使用 python app.py 運行該文件。
這就是最簡單的 3 個文件了。我的 hellodockerflask 文件夾看起來像這樣:
hello_docker_flask
│
└───requirements.txt
│
└───Dockerfile
│
└───app.py
Docker Build你仍應該在 hellodockerflask 目錄中。現在我們可以構建我們的 docker image 了。
docker build -t my_docker_flask:latest .
你會得到一堆帶有加載條的輸出,但是等他確定結束之後,你就會得到如下輸出:
Successfully built ddc23d92067e
Successfully tagged my_docker_flask:latest
這是做什麼呢?我們正在構建一個帶有 tag 的鏡像(-tag,-t)mydockerflask:latest ,包含當前目錄中的所有內容。
想近一步了解 tag?可以查看這個文章。
現在我們可以看到我們創造了什麼。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_docker_flask latest ddc23d92067e 45 seconds ago 687MB
但是,它在運行嗎?
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
不!!這是下一步我們要了解的內容。
Docker Run你可以使用 docker run 命令運行剛剛創建的構建。
docker run -d -p 5000:5000 my_docker_flask:latest
然而,這有一些我認為最重要的部分。首先是 -d 從運行中分離出來。這意味著你將看不到任何輸出。如果要查看運行過程,可以刪除 -d 。
接下來是 -p,它指定要運行的埠。在 app.py 文件中,我們使用了 app.run(debug=True, host='0.0.0.0') ,所以我們需要在使用 flask 運行時指定哪個埠,上面你可以看到我用了 5000 。
好的,現在我們可以看到它正在運行!
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
9701 my_docker_flask python app.py 3 min ago Up 4 min 0.0.0.0:5000
查看你的 Flask Restful Api現在你的 api 正在運行。你可以使用幾種方法來檢查它。
終端模式
open -a "Google Chrome" http://127.0.0.1:5000/
瀏覽器模式
你可以直接在瀏覽器中訪問:127.0.0.1:5000 進行查看。
curl 模式
你可以使用 curl 來執行 get 請求。
curl http://127.0.0.1:5000/
{
"hello": "world"
}
將你的 image 推送到 Docker Hub現在,你可以將鏡像推送到 docker hub ,以便以後可以將其拉下來並使用它,這就是為什麼 docker 很棒的原因。
在 docker hub 上創建一個帳戶。
https://hub.docker.com/
然後從你的終端窗口中:
$ docker login -u <YOUR_username>
Password:
Login Succeeded
但請使用你的用戶名,除非你能猜到我的密碼。
現在,我們使用你的用戶名前綴/ 重新標記鏡像。
docker tag my_docker_flask <username>/my_docker_flask
我們可以從一開始就用/ 前綴命名它。但是我覺得到目前為止沒有必要這樣做。現在我們可以把它推到我們的 docker hub 了。
docker push <username>/my_docker_flask
這個過程可能需要一分鐘,但現在 mydockerflask 可以從你的公共 docker hub 獲取了。如果你願意,可以在事後設置密碼。
從 Docker Hub 中提取你的鏡像現在讓我從 docker hub 下拉你的鏡像,但首先我要證明這是有效的,我們不需要我們以前的所有東西。
首先,讓我們 kill 當前所有的 docker。
docker ps
CONTAINER ID IMAGE
9701eed5868d my_docker_flask:latest
kill 這個 docker
docker kill 9701eed5868d
我們只是組織了它,接下來讓我們完全從本地 docker 實例中刪除它。
$ docker system prune -a
$docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
這樣我就做好了所有的準備工作,接下來讓我們從 docker hub 上面拉下我們的鏡像。
docker pull <username>/my_docker_flask
這可能需要一些時間並且還有一些輸出。幾分鐘之後,你就會有自己的鏡像了。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mtngt/my_docker_flask latest ddc23d92067e 33 minutes ago 687MB
現在像以前一樣運行,但請記住,我們有一個新名稱,它現在以/ 為前綴。
docker run -d -p 5000:5000 <username>/my_docker_flask:latest
這樣就又重新啟動了。
docker ps
CONTAINER ID IMAGE
9e2c7644ee48 mtngt/my_docker_flask:latest
我們利用 curl 來驗證一下結果。
$ curl http://127.0.0.1:5000/
{
"hello": "world"
}
作者:chen_h
微信號:862251340
CoderPai 是一個專注於人工智慧在量化交易應用的算法實戰平臺,主要關注人工智慧在量化交易上面的應用。如果你對人工智慧感興趣,請快快關注 「CoderPai」 微信號(coderpai)吧。