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 <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.

在 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 <YOUR_username>
Password:
Login Succeeded

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

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

docker tag my_docker_flask <username>/my_docker_flask

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

docker push <username>/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 <username>/my_docker_flask

这可能需要一些时间并且还有一些输出。几分钟之后,你就会有自己的镜像了。

docker images
REPOSITORY                TAG    IMAGE ID      CREATED         SIZE
mtngt/my_docker_flask  latest  ddc23d92067e 33 minutes ago  687MB

现在像以前一样运行,但请记住,我们有一个新名称,它现在以 <your_username>/ 为前缀。

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"
}

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

### 如何在 Docker 中安装和配置 Flask #### 1. 准备工作 为了在 Docker 中运行 Flask 应用程序,首先需要创建一个基本的 Flask 应用。可以按照以下方式设置开发环境并编写简单的 Flask 应用。 ```python from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "Hello, Dockerized Flask!" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ``` 此代码定义了一个基础的 Flask Web 应用程序[^3],其中 `host='0.0.0.0'` 是为了让应用程序能够被外部访问。 --- #### 2. 创建 Dockerfile 文件 Docker 使用 Dockerfile 来描述构建镜像所需的步骤。以下是适用于 Flask 的典型 Dockerfile: ```dockerfile # 基础镜像 FROM python:3.9-slim # 设置工作目录 WORKDIR /app # 复制当前项目的依赖到容器中 COPY requirements.txt . # 安装 Python 依赖项 RUN pip install --no-cache-dir -r requirements.txt # 将应用复制到容器的工作目录 COPY . . # 暴露端口 EXPOSE 5000 # 启动命令 CMD ["python", "app.py"] ``` 在此文件中: - `FROM python:3.9-slim` 表示基于官方精简版 Python 镜像。 - `requirements.txt` 列出了所有的 Python 包依赖关系,例如 Flask。 --- #### 3. 构建 Docker 镜像 完成以上两步后,在终端执行以下命令来构建 Docker 镜像: ```bash docker build -t your-flask-app . ``` 这会根据 Dockerfile 自动拉取必要的组件并打包成镜像[^1]。 --- #### 4. 运行容器 通过以下命令启动容器并将主机上的端口映射到容器中的服务端口: ```bash docker run -d -p 80:5000 your-flask-app ``` 这里 `-p 80:5000` 参数表示将宿主机的 80 端口绑定到容器内的 5000 端口[^1]。 --- #### 5. 测试部署效果 打开浏览器或者使用 curl 工具测试是否成功连接到 Flask 应用: ```bash curl http://localhost/ ``` 如果一切正常,则应该看到返回的消息:“Hello, Dockerized Flask!”[^3]。 --- #### 6. 提交至远程仓库(可选) 当本地调试完成后,还可以把制作好的镜像推送到云端存储库以便团队共享或持续集成流程调用。具体操作如下所示: ```bash docker tag your-flask-app registry.example.com/your-repo/your-flask-app:v1.0 docker push registry.example.com/your-repo/your-flask-app:v1.0 ``` 这些指令允许用户将自己的定制化镜像上传至私有或公共注册表服务器上保存备份副本[^4]。 --- ### 注意事项 - 如果计划生产环境下运行该应用,建议考虑采用 Gunicorn 或 uWSGI 替代内置 WSGI server 实现更高效稳定的服务支持[^2]。 - 对于 Windows 用户而言,可能需要注意路径分隔符差异以及权限管理等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值