作者: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"]
这个代码表示:
这就是最简单的 3 个文件了。我的 hello_docker_flask 文件夹看起来像这样:
hello_docker_flask
│
└───requirements.txt
│
└───Dockerfile
│
└───app.py
你仍应该在 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 -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
现在你的 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"
}
现在,你可以将镜像推送到 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 下拉你的镜像,但首先我要证明这是有效的,我们不需要我们以前的所有东西。
首先,让我们 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