docker系列學習(二):Docker + Flask 例子

2022-01-18 coderpai

博客地址: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)吧。

相關焦點

  • Flask + Docker 無腦部署新手教程
    其實在 docker 流行的今天,部署已經要比當初我學的時候要方便得多,但是前段時間我 google 搜了一圈的確沒看到幾篇比較好的 Docker + Flask 的指導,於是寫一篇菜鳥也能看懂的新手教程。本教程的特點就是比較無腦,照著做就能部署成功。同時給出一些連結,想深入一點了解的可以自行深入學習。
  • 如何使用MongoDB和Docker運行Flask應用
    docker-compose.yml現在將flask定義為docker-compose.yml文件中的第一個服務。添加以下代碼以定義Flask服務:在本例中,flask服務將依賴於mongodb,因為mongodb服務充當應用程式的資料庫。dependents確保flask服務僅在mongodb服務運行時運行。networks屬性指定flask服務前端和後端將有權訪問的網絡。定義了flask服務之後,就可以將MongoDB 配置添加到文件中了。在本例中,你將使用官方版本的4.0.8 mongo鏡像。
  • Docker系列教程01-使用Docker鏡像
    前言學習Docker,我們需要掌握它的三大核心概念:鏡像、容器和倉庫。今天先帶大家學習Docker鏡像相關的基礎知識。docker pull 語法docker pull 語法通常情況下, 描述一個鏡像需要包括「名稱+標籤「信息。
  • Docker簡介與簡單使用
    build -t bryantchangflasktest .使用docker images查看已經構建的鏡像: docker run -p 4001:80 bryantchangflasktest ##將4001埠映射到80埠可以看到因為沒有配置Redis所以這裡面的異常是我們預期內的,為了做後面的配置方便,我們將鏡像上傳到公共鏡像,命令如下:docker build -t bryantchangxy
  • 雲計算核心技術Docker教程:Compose使用
    2.使用 docker-compose.yml 定義構成應用程式的服務,這樣它們可以在隔離環境中一起運行。3.最後,執行 docker-compose up 命令來啟動並運行整個應用程式。運行以下命令以下載 Docker Compose 的當前穩定版本:$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local
  • Docker問答錄系列——Docker引擎相關問題(一)
    本系列文章總結了一些初學Docker時比較常見問題的解決方法,解決思路大多遵循Docker官方的最佳實踐的原則而進行的解答。
  • 【Docker】系列教程02-操作Docker容器
    簡介通過前面的學習,相信您已經對鏡像有所了解,是時候學習容器了。容器是Docker的另一個核心概念。簡單來說,容器是鏡像的一個運行實例。正如從虛擬機模板上啟動VM一樣,用戶也同樣可以從單個鏡像上啟動一個或多個容器。
  • Docker系列教程02-操作Docker容器
    簡介通過前面的學習,相信您已經對鏡像有所了解,是時候學習容器了。容器是Docker的另一個核心概念。簡單來說,容器是鏡像的一個運行實例。正如從虛擬機模板上啟動VM一樣,用戶也同樣可以從單個鏡像上啟動一個或多個容器。
  • docker 門外初體驗——docker 安裝(一)
    文章目錄系列文章目錄前言一、docker是什麼?
  • 【長篇博文】Docker學習筆記與深度學習環境的搭建和部署(二)
    歡迎關注我的csdn:原始碼殺手我的CSDN上一篇文章:Docker學習筆記與深度學習環境的搭建和部署(一)https://blog.csdn.net/weixin_41194129/article/details/113823982【長篇博文】Docker學習筆記與深度學習環境的搭建和部署
  • Docker學習筆記(1)
    文章來自零釼實驗室成員南宮十六文章共2694字13圖預計閱讀時間6分鐘點擊原文查看更佳前言最近學習了version容器生命周期管理1.docker run創建一個新的容器並運行一個命令1docker run [options] IMAGE [COMMAND
  • Docker集群管理之Docker Compose
    預告:9月1日晚上8點整,杜航將通過在線培訓的方式詳細探討《Docker集群管理三劍客》,報名地址請點擊這裡與容器技術同樣受到關注的微服務架構也在潛移默化的改變著應用的部署方式,其提倡將應用分割成一系列細小的服務,每個服務專注於單一業務功能,服務之間採用輕量級通信機制相互溝通。
  • Docker再體驗之Docker Compose,及它與Kubernetes的區別
    安裝Docker Compose接上一篇的例子,安裝Docker Compose,並進行賦權和檢驗。sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-composesudo chmod +x /usr
  • docker的/var/run/docker.sock參數
    歡迎訪問我的GitHub這裡分類和匯總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos關於/var/run/docker.sock參數在創建docker容器時,有時會用到/var/run/docker.sock這樣的數據卷參數,例如以下docker-compose.yml
  • Docker學習之工作原理
    想學習好一點技術,最好的方法就是學習這項技術的工作原理。一直很好奇docker是如何實現互不影響的,很是神奇。    通過學習查閱一些資料,慢慢的了解了底層是如何實現的,特此記錄一下。docker run 命令解釋圖    docker run 其實是兩個命令的結合體:docker create 和 docker start。
  • CoreOS實踐指南(七):Docker容器管理服務
    前者是比較推薦的做法,但需學習Dockerfile的寫法,已經超出了這個系列的範圍。後者相對簡單,但不利於後期的鏡像維護管理,這裡僅僅作為演示目的,因此採用這種方法。一、拉取基礎鏡像每一個具體的容器實際上是運行在虛擬出來的獨立空間裡面的,它被設計成只能夠訪問到存在於同一個虛擬空間下面的其他文件。
  • 學習Docker就應該掌握的dockerfile語法與指令
    原有指令 MAINTAINER 已經放棄使用,用 LABEL maintainer="hogwarts@testing-studio.com" 替代。USER:指定運行容器時的用戶名或 UID,後續 RUN 也會使用指定用戶。RUN:RUN 命令是 Dockerfile 執行命令的核心部分。它接受命令作為參數並用於創建鏡像。
  • Linux安裝Docker與Docker常用命令
    \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate
  • Docker極簡入門
    二、Docker容器的安裝與入門1.Docker的安裝過程很簡單,本次試驗是在CentOS7.4中進行的,因此不存在內核版本及系統平臺不支持的情況。~]# systemctl status docker[root@ChatDevOps ~]# systemctl enable docker[root@ChatDevOps ~]# docker info2.docker info:返回所有容器和鏡像的數量、Docker使用的執行驅動和存儲驅動及Docker的基本配置。
  • Docker基礎篇(Dockerfile)-雲原生核心
    DockerFile是什麼  DockerFile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。graph LRA[構建的三步驟]  --> C(1. 編寫Dockerfile文件)A --> D(2. docker build)A --> E(3. docker run)腳本文件的樣式,以centos為例在這裡插入圖片描述腳本文件內容FROM scratchADD centos-7-x86_64-docker.tar.xz /LABEL