使用 Python 和 Flask 对你的第一个 Web 应用进行 Docker 化
Docker 架构
所需文件和配置
如何启动容器
加分点:将 Docker 镜像上传到 Docker Hub
如何使用 Python 和 Elasticsearch 衡量新冠疫情对 Jitsi 项目的影响(第二部分)。这次,我的同事(David、Gerardo)和我(Ana)使用 Python 技术和 Flask 框架构建了一个 Web 应用,并将其 Docker 化。这里我们将向您讲解如何
Docker 架构
首先,我们要构建一个包含三个容器的docker应用程序:
- ElasticSearch 图像
- Kibana 镜像
- Web 应用程序图像
对于 ElasticSearch 和 Kibana,我们使用DockerHub预构建的7.8.0 版本镜像。Web 应用程序使用 redis-alpine 镜像。
注意:使用 alpine 的原因是,与传统的 GNU/Linux 发行版(例如 Ubuntu)相比,这个替代方案更小,资源效率更高。
所需文件和配置
您可以在GitLab上获取所需的材料。下图显示了克隆 repo 后您将获得的不同文件
Docker-compose.yml 结构
docker-compose.yml
文件显示了上一节中解释的结构
version: '3'
services:
web:
build: .
ports:
- 5000:5000
networks:
- elastic
redis:
image: "redis:alpine"
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
kib01:
image: docker.elastic.co/kibana/kibana:7.8.0
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
让我们看一下docker-compose.yml
-
端口:将 Docker 端口配置为 Docker 运行的主机端口。在本例中为 5000、5601 和 9200。
-
镜像:为所需服务下载的docker镜像
-
网络:为了连接这三个服务,将其命名为“弹性”
-
环境:配置服务间运行所必需的环境变量,例如 RAM 内存参数。在 Kibana 服务中,需要定义变量
ELASTICSEARCH_URL
和ELASTICSEARCH_HOSTS
,以便将其与 Elasticsearch 服务链接。
Dockerfile 配置
Dockerfile
具有配置 Web 应用程序所需的步骤,以便与我们的 Python 脚本链接,该脚本提取并存储 Elasticsearch 集群中的数据,同时导入impact_dashboard.ndjson
Kibana 以进行先前的可视化。
它在 Alpine 发行版上运行,用于复制应用程序运行所需的文件夹。此外,借助requirements.txt
,您可以添加 Python 脚本所需的所有依赖项。
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP jitsi-data.py
ENV FLASK_RUN_HOST 0.0.0.0
RUN apk add --no-cache git
RUN apk add --no-cache tk-dev
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
COPY mapping.json mapping.json
COPY templates templates
COPY impact_dashboard.ndjson impact_dashboard.ndjson
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
如何启动容器
为了启动应用程序(之前安装了 docker 和 docker-compose),打开终端并执行以下命令
$ docker-compose up
这将启动 dockerfile 中指定的不同命令并下载所需的 docker 镜像。完成后,您可以检查 Elasticsearch (localhost:9200) 和 Kibana (localhost:5601) 是否已成功运行。
现在,是时候使用端口号去 python Flask 应用程序 Web 应用所在的位置了5000
点击start button
将会初始化从 Jitsi git 数据中提取数据(查看jitsi-data.py
更多详情),并将这些数据存储到我们的 ElasticSearch 中。最后,它会导入impact_dashboard.ndjson
到我们的 Kibana,让我们能够以交互方式操作这些数据。
该过程完成后,浏览器将显示下一条消息:
当然,我们可以看到我们的 Elasticsearch 索引和 Kibana 仪表板是否已成功添加到我们的实例中:
默认情况下,时间过滤器设置为过去 15 分钟。您可以使用时间选择器更改时间过滤器,或在页面顶部的直方图中选择特定的时间间隔或时间范围。
现在您已经拥有一个很酷的仪表板,可以分析疫情如何影响 Jitsi 软件开发活动。
加分点:将 Docker 镜像上传到 Docker Hub
使用 Docker Hub 帐户,您可以在 所在位置构建镜像dockerfile
。只需输入:
$ docker build -t dockerhubID/DockerHubreponame:imagetag .
然后,将镜像上传到你的 Docker Hub 仓库(你可以使用 Docker Hub UI 创建仓库)
$ sudo docker push dockerhubID/DockerHubreponame:imagetag
将镜像上传到 Docker Hub 后,任何用户都可以使用以下 docker-compose.yml 使用和运行该应用程序
version: '3'
services:
web:
image: daviddp92/jitsi-data-extraction:1.0.0
ports:
- 5000:5000
networks:
- elastic
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.type=single-node
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
kib01:
image: docker.elastic.co/kibana/kibana:7.8.0
container_name: kib01
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://es01:9200
ELASTICSEARCH_HOSTS: http://es01:9200
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
driver: bridge
总结
我们学习了如何使用 docker-compose 将一个 Web 应用与 Python 技术和 Flask 框架进行 docker 化。我们还学习了如何使用 Docker Hub 镜像来运行该应用程序。
你觉得这个项目怎么样?我们应该改进哪些方面?欢迎反馈 :)
鏂囩珷鏉ユ簮锛�https://dev.to/anajsana95/dockerizing-your-first-web-app-with-python-and-flask-2fn2