Python语言学习——如何把一个Python应用程序装进Docker
小职 2020-10-12 来源 : 阅读 519 评论 0

摘要:容器无处不在,但是如何在Docker容器中运行Python应用程序呢?本篇介绍了把一个Python应用程序装进Docker的方法,希望对Python的学习有所帮助。

容器无处不在,但是如何在Docker容器中运行Python应用程序呢?本篇介绍了把一个Python应用程序装进Docker的方法,希望对Python的学习有所帮助。

 Python语言学习——如何把一个Python应用程序装进Docker


容器无处不在,但是如何在Docker容器中运行Python应用程序呢?

 

如果您想知道,这些示例需要Python 3.x。

 

在深入讨论容器之前,让我们进一步讨论一下我们想要封装的Python应用程序。

 

这个应用程序是一个web API,它从一个电影集合中返回一个随机的电影。在我们的本地文件夹中,我们有3个文件:

 

app.py # Python application

movies.json # movie collection

requirements.txt # where we specifiy our Python dependencies

app.py包含一个API端点,它返回一个随机的影片:

 

import os

import json

from pathlib import Path

from random import choice

import cherrypy

 

PORT = os.environ.get('PORT', 8888)

 

FOLDER_PATH = Path(__file__).parent

 

with open(FOLDER_PATH / "movies.json", "r") as f:

    MOVIES = json.loads(f.read())

 

class Movie:

    @cherrypy.expose

    @cherrypy.tools.json_out()

    def index(self):

        return {"movie": choice(MOVIES)}

 

cherrypy.quickstart(

    Movie(), config=cherrypy.config.update({

        'server.socket_host': '0.0.0.0',

        'server.socket_port': PORT,

        }))

requirement.txt,我们有我们的依赖包

 

pip install -r requirements.txt

我们可以使用python app.py运行我们的应用程序。

 

运行curl localhost:8888应该返回一个随机的影片,类似于:

 

{

  "movie": {

    "Title": "Opal Dreams",

    "US_Gross": 14443,

    "Worldwide_Gross": 14443,

    "US_DVD_Sales": null,

    "Production_Budget": 9000000,

    "Release_Date": "Nov 22 2006",

    "MPAA_Rating": "PG",

    "Running_Time_min": null,

    "Distributor": "Strand",

    "Source": "Based on Book/Short Story",

    "Major_Genre": "Drama",

    "Creative_Type": "Contemporary Fiction",

    "Director": null,

    "Rotten_Tomatoes_Rating": null,

    "IMDB_Rating": 6.5,

    "IMDB_Votes": 468

  }

}

如何容器化我们的程序

 

包含一个Python应用程序意味着创建一个Docker镜像,其中包含运行它所需要的一切:源代码、依赖项和配置。

 

容器化应用程序的第一步是创建一个新的文本文件,名为Dockerfile:

 

app.py

movies.json

requirements.txt

Dockerfile

在Dockerfile(我们认为是最小可行Dockerfile)中,我们需要指定三个步骤:

 

选择我们想要使用的基本图像

选择我们想要在Docker图像中复制的文件

安装应用程序的依赖项

Base image

 

要指定基本映像,我们使用FROM命令,后面跟着私有或公共映像。

 

在我们的例子中,我们将使用官方的Python Docker映像,该映像可在Docker hub上使用。

 

我们将选择最新可用的基于Ubuntu的python3图像。

 

# 1. Base image

FROM python:3.8.5-slim-buster

图像名称由两个不同的部分组成:image:tag。在我们的例子中,图像是python,标签是3.8.5-slim-buster。

 

这就是第一步所需要的一切。

 

复制应用程序

 

要在Docker图像中复制我们的应用程序,我们将使用copy命令:

 

# 2. Copy files

COPY . /src

此命令将指定的文件(或文件夹)复制到Docker映像中。在我们的例子中,我们希望复制Docker映像中本地文件夹中/src路径下的所有可用文件。

 

值得注意的是,COPY命令的第一部分是相对于构建上下文的路径,而不是相对于我们的本地机器的路径。

 

安装requirements.txt

 

最后一步是在Docker映像中安装我们的依赖项。为了实现这一点,我们将使用RUN命令运行pip安装:

 

# 3. Install our deps

RUN pip install -r /src/requirements.txt

需要注意的一件事是,requirements.txt的路径与我们第一次运行pip安装时不同。

 

这背后的原因是复制的文件在映像内的/src路径下。

 

构建并运行Docker映像

 

# 1. Base image

FROM python:3.8.3-slim-buster

 

# 2. Copy files

COPY . /src

 

# 3. Install our deps

RUN pip install -r /src/requirements.txt

我们的Dockerfile现在已经完成,我们可以使用它来构建Docker映像。为此,我们需要使用docker构建命令:

 

docker build -t movie-recommender .

这个命令使用当前文件夹作为构建上下文构建一个名为movie-recommender的Docker图像。在最后指定我们想要使用的构建上下文的路径)。

 

现在我们可以使用docker run命令运行刚刚构建的图像:

 

docker run movie-recommender python /src/app.py

该命令将在基于电影推荐图像的容器中执行python /src/app.py。

 

但是,如果我们尝试使用curl localhost:8888连接到我们的应用程序,我们将会得到一个错误。

 

这怎么可能?为什么我们不能连接到在容器内运行的应用程序?

 

原因是我们没有将应用程序的端口公开给本地机器。我们可以使用-p HostPort:ContainerPort标志来实现这一点。

 

因此,让我们尝试再次运行该命令,这一次指定我们希望在本地公开端口8888:

 

docker run -p 8888:8888 movie-recommender python /src/app.py

然后curl localhost:8888。

 

这样就在Docker里装入了Python应用程序。


关注“职坐标在线”公众号,免费获取最新技术干货教程资源哦!


本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程