docker系列学习(二):Docker + Flask 例子

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


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 

你还可以检查是否有任何容器,即使他们没有运行。

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.

在 hello_docker_flask 文件夹中创建一个名为 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 个文件了。我的 hello_docker_flask 文件夹看起来像这样:

hello_docker_flask
│
└───requirements.txt
│
└───Dockerfile
│
└───app.py

Docker Build

你仍应该在 hello_docker_flask 目录中。现在我们可以构建我们的 docker image 了。

docker build -t my_docker_flask:latest .

你会得到一堆带有加载条的输出,但是等他确定结束之后,你就会得到如下输出:

Successfully built ddc23d92067e
Successfully tagged my_docker_flask:latest

这是做什么呢?我们正在构建一个带有 tag 的镜像(-tag,-t)my_docker_flask: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 
Password:
Login Succeeded

但请使用你的用户名,除非你能猜到我的密码。

现在,我们使用你的用户名前缀 / 重新标记镜像。

docker tag my_docker_flask <username>/my_docker_flask

我们可以从一开始就用 / 前缀命名它。但是我觉得到目前为止没有必要这样做。现在我们可以把它推到我们的 docker hub 了。

docker push /my_docker_flask

这个过程可能需要一分钟,但现在 my_docker_flask 可以从你的公共 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 /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 /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"
}

来源:https://medium.com/@mtngt/docker-flask-a-simple-tutorial-bbcb2f4110b5

你可能感兴趣的:(docker)