Docker Compose快速入门

本教程旨在通过指导您开发基本Python web应用程序来介绍Docker Compose的基本概念。
使用Flask框架,该应用程序在Redis中提供了一个命中计数器,提供了如何在web开发场景中应用Docker Compose的实际示例。
即使您不熟悉Python,这里演示的概念也应该是可以理解的。
这是一个非规范性的示例,仅强调了使用Compose可以做的关键事情。

一、前提条件

确保您具有:

  • 已安装最新版本的Docker Compose
  • 对Docker概念和Docker工作原理的基本理解

1、设置 

   1.1为项目创建目录:

mkdir composetest
cd composetest

1.2 在项目目录中创建名为app.py的文件,并将以下代码粘贴到中:

import timeimport redis
from flask import Flaskapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)def get_hit_count():retries = 5while True:try:return cache.incr('hits')except redis.exceptions.ConnectionError as exc:if retries == 0:raise excretries -= 1time.sleep(0.5)@app.route('/')
def hello():count = get_hit_count()return 'Hello World! I have been seen {} times.\n'.format(count)

在本例中,redis是应用程序网络上redis容器的主机名,使用默认端口6379。

1.3 在项目目录中创建另一个名为requirements.txt的文件,并将以下代码粘贴到中:

flask
redis

1.4 创建Dockerfile并将以下代码粘贴到中:

# syntax=docker/dockerfile:1
FROM python:3.10-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run", "--debug"]

代码解析: 

这告诉Docker:

  • 从Python 3.10映像开始构建映像。
  • 将工作目录设置为/code。
  • 设置烧瓶命令使用的环境变量。
  • 安装gcc和其他依赖项
  • 复制requirements.txt并安装Python依赖项。
  • 将元数据添加到映像中,以描述容器正在侦听端口5000
  • 复制当前目录。在项目中添加到workdir。在图像中。
  • 将容器的默认命令设置为烧瓶运行--debug。

2、在Compose文件中定义服务

Compose简化了对整个应用程序堆栈的控制,使在单个可理解的YAML配置文件中管理服务、网络和卷变得容易。

在项目目录中创建一个名为compose.yaml的文件,并粘贴以下内容:

services:web:build: .ports:- "8000:5000"redis:image: "redis:alpine"

该Compose文件定义了两个服务:web和redis。
web服务使用从当前目录中的Dockerfile构建的映像。然后,它将容器和主机绑定到暴露的端口8000。此示例服务使用Flask web服务器的默认端口5000。
redis服务使用从Docker Hub注册表中提取的公共redis映像。

3、使用Compose构建和运行应用程序

使用单个命令,可以从配置文件中创建和启动所有服务。

3.1、从项目目录中,通过运行docker-compose-up来启动应用程序。

docker compose upCreating network "composetest_default" with the default driver
Creating composetest_web_1 ...
Creating composetest_redis_1 ...
Creating composetest_web_1
Creating composetest_redis_1 ... done
Attaching to composetest_web_1, composetest_redis_1
web_1    |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
redis_1  | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis_1  | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started
redis_1  | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
web_1    |  * Restarting with stat
redis_1  | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379.
redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
web_1    |  * Debugger is active!
redis_1  | 1:M 17 Aug 22:11:10.483 # Server initialized
redis_1  | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
web_1    |  * Debugger PIN: 330-787-903
redis_1  | 1:M 17 Aug 22:11:10.483 * Ready to accept connections

Compose提取Redis映像,为代码构建映像,并启动您定义的服务。在这种情况下,代码在构建时静态复制到映像中。

3.2、输入http://localhost:8000/在浏览器中查看应用程序的运行。

如果这不能解决,您也可以尝试http://127.0.0.1:8000.
您应该会在浏览器中看到一条消息,内容是:

Hello World! I have been seen 1 times.

3.3、刷新页面 

数字应该递增。

Hello World! I have been seen 2 times.

3.4、切换到另一个终端窗口,并键入docker image ls以列出本地图像。

此时列出图像应该返回redis和web。 

docker image lsREPOSITORY        TAG           IMAGE ID      CREATED        SIZE
composetest_web   latest        e2c21aa48cc1  4 minutes ago  93.8MB
python            3.4-alpine    84e6077c7ab6  7 days ago     82.5MB
redis             alpine        9d8fa9aa0e5b  3 weeks ago    27.5MB

您可以使用docker inspect<tag or id>检查镜像

3.5、通过在第二个终端的项目目录中运行docker compose down,或者在启动应用程序的原始终端中单击CTRL+C来停止应用程序。

4、用Compose Watch 编辑Compose file

编辑项目目录中的compose.yaml文件以使用watch,以便可以预览正在运行的compose服务,这些服务将在您编辑和保存代码时自动更新:

services:web:build: .ports:- "8000:5000"develop:watch:- action: syncpath: .target: /coderedis:image: "redis:alpine"

无论何时更改文件,Compose都会将文件同步到容器内/code下的相应位置。复制后,绑定程序更新正在运行的应用程序,而不重新启动。

5、使用Compose重新构建并运行应用程序

在项目目录中,键入docker compose watch或docker compose up--watch以构建和启动应用程序,并启动文件监视模式。

docker compose watch
[+] Running 2/2â Container docs-redis-1 Created                                                                                                                                                                                                        0.0sâ Container docs-web-1    Recreated                                                                                                                                                                                                      0.1s
Attaching to redis-1, web-1⦿ watch enabled
...

6、更新应用程序

查看Compose Watch的操作:

6.1、在app.py中更改问候语并保存。例如,更改Hello World!Docker给Hello的消息:

return 'Hello from Docker! I have been seen {} times.\n'.format(count)

6.2、在浏览器中刷新应用程序。问候语应更新,计数器仍应递增。

6.3、完成后,运行docker compose。 

7、拆分服务

使用多个Compose文件可以为不同的环境或工作流自定义Compose应用程序。这对于可能使用数十个容器的大型应用程序非常有用,所有权分布在多个团队中。

  1. 在您的项目文件夹中,创建一个名为 infra.yaml 的新 Compose 文件。
  2. 从你的 compose.yaml 文件中删除 Redis 服务,并将其粘贴到新的 infra.yaml 文件中。确保在文件的顶部添加了 services 顶级属性。你的 infra.yaml 文件现在应该看起来像这样:
    services:redis:image: "redis:alpine"
  3.  在您的compose.yaml文件中,添加include顶级属性以及infra.yaml文件的路径。
include:- infra.yaml
services:web:build: .ports:- "8000:5000"develop:watch:- action: syncpath: .target: /code

 运行docker compose up以使用更新的compose文件构建应用程序,然后运行它。您应该会在浏览器中看到Hello world消息。

8、尝试其他一些命令

  • 如果要在后台运行服务,可以将-d标志(用于“分离”模式)传递给docker compose-up,并使用docker compose-ps查看当前正在运行的内容:
    docker compose up -dStarting composetest_redis_1...
    Starting composetest_web_1...docker compose psName                      Command               State           Ports         
    -------------------------------------------------------------------------------------
    composetest_redis_1   docker-entrypoint.sh redis ...   Up      6379/tcp              
    composetest_web_1     flask run                        Up      0.0.0.0:8000->5000/tcp
  • 运行docker compose--help以查看其他可用命令。
  • 如果启动Compose with docker Compose up-d,请在完成服务后停止服务:
    docker compose stop
  • 使用docker compose down命令,您可以删除所有内容,完全删除容器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双击移动硬盘打不开?原因分析与数据恢复全攻略

在日常生活和工作中&#xff0c;移动硬盘作为数据存储和传输的重要工具&#xff0c;扮演着至关重要的角色。然而&#xff0c;当我们遇到双击移动硬盘无法打开的情况时&#xff0c;往往会感到十分困扰。本文将详细探讨双击移动硬盘打不开的原因&#xff0c;并提供两种有效的数据…

go webview/wails学习记录

文章目录 webview安装基础代码错误情况wails安装初始化一个项目错误信息使用arco-design(在初始化项目上修改代码)修改窗口图标多页面展示添加自定义图标-iconfont制作伸缩侧边栏侧边栏菜单在form中使用select且select联动选择使用go读取本地excel文件在转json_str使用go将json…

骨折检测数据集VOC+YOLO格式717张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;717 标注数量(xml文件个数)&#xff1a;717 标注数量(txt文件个数)&#xff1a;717 标注类别…

GANs生成对抗网络的学习

1.GANs生成网络的定义 GANs是一种深度学习模型&#xff0c;用于生成新的数据实例&#xff0c;如图像、音频和文本。它主要由两部分组成&#xff1a;生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;。 2.生成器 生成器的目标是创造出…

PC网游、页游、手游、端游各类游戏收集整理大集合-90%以上游戏带视频架设教程

本游戏资源提供给大家学习及参考研究借鉴美工之用&#xff0c;请勿用于商业和非法用途&#xff0c;无任何技术支持&#xff01; 干货列表

VMware中的虚拟机设置开启VT虚拟化

虚拟机系统关机打开虚拟机设置-----点击处理器----勾选虚拟化引擎---确定即可

vs2019+QT扩展 定义自定义模块选择

环境&#xff1a;vs2019QT扩展&#xff08;2.63.2&#xff09; 对于我们如果想将自己的模块&#xff0c;或类似于QtXlsx这样的库直接添加到QT目录中时&#xff0c;也想可以通过选择模块自动引入头文件和库文件时&#xff0c;可以直接通过修改配置文件的方式添加到模块选择界面…

一款非常好用的python OCR文字识别框架

项目简介 一个文档 OCR 工具包,它具有以下功能: 支持 90 多种语言的 OCR,其基准测试优于云服务 任何语言的行级文本检测 布局分析(表格、图像、标题等检测) 读取顺序检测 它适用于一系列文档(有关更多详细信息,请参阅用法和基准)。 DetectionOCRLayoutReading Order 阅…

神经网络的工程基础(零)——PyTorch基础

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch06_optimizer/gradient_descent.ipynb 本文将介绍PyTorch的基础。…

Linux防火墙(以iptables为例)

目录 Linux配置防火墙1. 引言2. 什么是防火墙3. Linux中的防火墙3.1 iptablesiptables命令参数常用方式&#xff1a;3.1.1 安装iptables3.1.2 配置iptables规则3.1.3 示例一&#xff1a;使用iptables配置防火墙规则4. iptables执行过程 Linux配置防火墙 1. 引言 在互联网时代&…

【从零开始学习RabbitMQ | 第三篇】什么是延迟消息

目录 前言&#xff1a; 延迟消息&#xff1a; 延迟消息实现方式&#xff1a; 死信交换机&#xff1a; 延迟消息插件&#xff1a; 1.基于注解的方式 2.基于Bean的方式 总结&#xff1a; 前言&#xff1a; 在现代软件开发中&#xff0c;异步消息处理已成为构建可扩展、高可…

闲鱼详情API接口探析

随着互联网的快速发展&#xff0c;我国闲置交易市场逐渐繁荣&#xff0c;闲鱼作为阿里巴巴旗下闲置交易平台&#xff0c;已经成为众多用户的选择。为了方便开发者构建第三方应用&#xff0c;闲鱼提供了详细的API接口&#xff0c;联讯数据将对闲鱼详情API接口进行深入分析&#…

你真的懂firewalld吗?不妨看看我的这篇文章

一、firewalld简介 firewalld防火墙是Linux系统上的一种动态防火墙管理工具&#xff0c;它是Red Hat公司开发的&#xff0c;并在许多Linux发行版中被采用。相对于传统的静态防火墙规则&#xff0c;firewalld使用动态的方式来管理防火墙规则&#xff0c;可以更加灵活地适应不同…

ctfhub中的SSRF相关例题(中)

目录 上传文件 gopher协议的工作原理&#xff1a; gopher协议的使用方法&#xff1a; 相关例题: FastCGI协议 FastCGI协议知识点 相关例题&#xff1a; Redis协议 知识点&#xff1a; 相关例题 第一种方法 第二种方法 上传文件 gopher协议的工作原理&#xff1a; …

开箱元宇宙| 探索家乐福如何在The Sandbox 中重新定义零售和可持续发展

有没有想过 The Sandbox 如何与世界上最具代表性的品牌和名人的战略保持一致&#xff1f;在本期的 "开箱元宇宙 "系列中&#xff0c;我们与家乐福团队进行了对话&#xff0c;这家法国巨头率先采用web3技术重新定义零售和可持续发展。 家乐福的用户平均游玩时间为 57 …

maven部署到私服

方法一:网页上传 1、账号登录 用户名/密码 2、地址 http://自己的ip:自己的端口/nexus 3、查看Repositories列表&#xff0c;选择Public Repositories&#xff0c;确定待上传jar包不在私服中 4、选择3rd party仓库&#xff0c;点击Artifact Upload页签 5、GAV Definition选…

蓝桥杯嵌入式国赛笔记(3):其他拓展板程序设计(温、湿度传感器、光敏电阻等)

目录 1、DS18B20读取 2、DHT11 2.1 宏定义 2.2 延时 2.3 设置引脚输出 2.4 设置引脚输入 2.5 复位 2.6 检测函数 2.7 读取DHT11一个位 2.7.1 数据位为0的电平信号显示 2.7.2 数据位为1的电平信号显示 2.8 读取DHT11一个字节 2.9 DHT11初始化 2.10 读取D…

exe4j --实现把jar包打成exe可执行文件

工具准备 1.Java编辑器&#xff0c;如&#xff1a;idea、eclipse等&#xff0c;下载地址&#xff1a; IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrains https://www.jetbrains.com/idea/ 2.exe4j&#xff0c;下载地址&#xff1a; ej-technologies - Java A…

SQL试题使得每个学生 按照姓名的字⺟顺序依次排列 在对应的⼤洲下⾯

学⽣地理信息报告 学校有来⾃亚洲、欧洲和美洲的学⽣。 表countries 数据如下&#xff1a; namecontinentJaneAmericaPascalEuropeXiAsiaJackAmerica 1、编写解决⽅案实现对⼤洲&#xff08;continent&#xff09;列的 透视表 操作&#xff0c;使得每个学生 按照姓名的字⺟顺…

常用批处理命令及批处理文件编写技巧

一常用批处理命令 1.查看命令用法&#xff1a;命令 /? //如&#xff1a;cd /? 2.切换盘符目录&#xff1a;cd /d D:\test 或直接输入 d: //进入上次d盘所在的目录 3.切换目录&#xff1a;cd test 4.清屏:cls 5.“arp -a” //它会列出当前设备缓存中的所有…