Docker Compose快速入门

news2024/11/13 10:08:54

本教程旨在通过指导您开发基本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 time

import redis
from flask import Flask

app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)

def get_hit_count():
    retries = 5
    while True:
        try:
            return cache.incr('hits')
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.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 up

Creating 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 ls

REPOSITORY        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: sync
          path: .
          target: /code
  redis:
    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: sync
          path: .
          target: /code

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

8、尝试其他一些命令

  • 如果要在后台运行服务,可以将-d标志(用于“分离”模式)传递给docker compose-up,并使用docker compose-ps查看当前正在运行的内容:
    docker compose up -d
    
    Starting composetest_redis_1...
    Starting composetest_web_1...
    
    docker compose ps
    
           Name                      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.coloradmin.cn/o/1686050.html

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

相关文章

Window Linux 权限提升

#基础点&#xff1a; 0、为什么我们要学习权限提升转移技术&#xff1a; 简单来说就是达到目的过程中需要用到它 心里要想着我是谁 我在哪 我要去哪里 1、具体有哪些权限需要我们了解掌握的&#xff1a; 后台权限&#xff0c;数据库权限&#xff0c;Web权限&#xff0c;用户权…

React 中Redux结合React-Redux使用类组件版本(一)

一、Redux是什么&#xff1f; 1.Redux是一个专门用于状态管理的js库 2.它可以用在React、Angular、Vue的项目中&#xff0c;但基本与React配合使用。 3.作用&#xff1a;集中式管理React应用中多个组件共享的状态。 二、Redux 工作流程 三、Redux的三个核心概念 1.action 动…

线上研讨会 | 探索非标自动化产线行业的数转智改之路

报名链接&#xff1a; 2024 达索系统工业大发展在线研讨会 (tbh5.com)

azure gpt 技术教程教学 | 在Azure OpenAI 上部署GPT-4o

Azure OpenAI GPT-4o是OpenAI推出的最新旗舰级人工智能模型。GPT-4o模型设计为能够实时对音频、视觉和文本进行推理&#xff0c;这是迈向更自然人机交互的重要一步。该模型的一大特点是能够处理多种类型的数据输入和输出&#xff0c;包括文本、音频和图像&#xff0c;实现了跨模…

521源码-在线客服-CRMChat网页版客服系统 UNIAPP 全方位在线客服系统源码与管理体系平台

CRMChat客服系统&#xff1a;基于Swoole4Tp6RedisVueMysql构建的高效沟通桥梁 CRMChat是一款独立且高性能的在线客服系统&#xff0c;它结合了Swoole4、Tp6、Redis、Vue以及Mysql等先进技术栈&#xff0c;为用户提供了卓越的在线沟通体验。该系统不仅支持在Pc端、移动端、小程…

软考 软件设计师 场景分析题 速成篇

文章目录 试题一&#xff1a;数据流图&#x1f496; 基本图形元素1. 外部实体2. 数据存储3. 加工4. 数据流 &#x1f4da; 例题&#xff08;1&#xff09;实体名称&#xff08;2&#xff09;数据存储名称&#xff08;3&#xff09;数据流① 父子图平衡② 加工有输入有输出④ 数…

visual studio snippet常用注释片段

Visual Studio 2022 添加自定义代码片段_vs2022 代码片段-CSDN博客 dclass.snippet: <?xml version"1.0" encoding"utf-8"?> <CodeSnippets xmlns"http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> …

Pip,whl,源码编译安装Python库

pip安装 pip 是 Python 包管理工具&#xff0c;用于安装和管理 Python 包。pip 是 Python 开发中不可或缺的工具&#xff0c;能够帮助开发者轻松地管理项目所需的各种库和依赖。无论是安装新包、升级现有包还是卸载不需要的包&#xff0c;pip 都提供了简单而强大的命令来完成这…

YOLOv5改进 | 主干网络 | 用repvgg模块替换Conv【教程+代码 】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 尽管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作为一个anchor base的目标检测的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。…

【02】GeoScene Enterprise(Windows)许可更新

如果在Windows环境下部署了GeoScene Enterprise基础环境&#xff0c;也就是部署了server、portal、datastore、web adaptor四大组件&#xff0c;当试用许可到期后&#xff0c;拿到新的许可想要更新许可&#xff0c;从而使得软件能够正常工作&#xff0c;下述步骤是更新GeoScene…

WebRTC 音频抗弱网技术

实时音视频通话一直是我们通信行业必不可少的一门技术&#xff0c;并且近今年音视频边缘设备产品涌现出很多设备&#xff0c;然而&#xff0c;在当今网络环境中&#xff0c;网络传输质量确常常无法得到有效的保障&#xff0c;那么&#xff0c;在当今弱网环境下&#xff0c;如何…

DeepRec Extension 打造稳定高效的分布式训练

DeepRec Extension 即 DeepRec 扩展&#xff0c;在 DeepRec 训练推理框架之上&#xff0c;围绕大规模稀疏模型分布式训练&#xff0c;我们从训练任务的视角提出了自动弹性训练&#xff0c;分布式容错等功能&#xff0c;进一步提升稀疏模型训练的整体效率&#xff0c;助力 DeepR…

Vue3:动态路由+子页面(新增、详情页)动态路由配置(代码全注释)

文章目录 实现思路调用后端接口获取用户权限获取页面权限动态绑定到路由对象中动态添加子页面路由 实现思路 emm&#xff0c;项目中使用动态路由实现根据后端返回的用户详情信息&#xff0c;动态将该用户能够访问的页面信息&#xff0c;动态生成并且绑定到路由对象中。但是后…

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II

【leetcode面试经典150题】-80. 删除有序数组中的重复项 II 1 题目介绍2 个人解题思路2.1 代码2.2 思路 3 官方题解 1 题目介绍 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组…

MongoDB基础入门到深入(七)建模、调优

文章目录 系列文章索引十一、MongoDB开发规范十二、MongoDB调优1、三大导致MongoDB性能不佳的原因2、影响MongoDB性能的因素3、MongoDB性能监控工具&#xff08;1&#xff09;mongostat&#xff08;2&#xff09;mongotop&#xff08;3&#xff09;Profiler模块&#xff08;4&a…

2024电工杯数学建模竞赛选题建议+初步分析

提示&#xff1a;DS C君认为的难度&#xff1a;B<A&#xff0c;开放度&#xff1a;A<B。 以下为AB题选题建议及初步分析&#xff1a; A题&#xff1a;园区微电网风光储协调优化配置 题目描述&#xff1a; 园区微电网由风光发电和主电网联合为负荷供电&#xff0c;需要…

18kw 机架式液冷负载的使用方法有哪些?

机架式液冷负载是一种高效、节能的散热设备&#xff0c;广泛应用于数据中心、服务器房等场所。它通过将冷却液循环流动&#xff0c;将热量从负载设备带走&#xff0c;实现设备的稳定运行。以下是18kw机架式液冷负载的使用方法&#xff1a; 1. 安装前准备&#xff1a;在安装机架…

【Linux】-Spark分布式内存计算集群部署[20]

注意&#xff1a; 本节的操作&#xff0c;需要前置准备好Hadoop生态集群&#xff0c;请先部署好Hadoop环境 简介 Spark是一款分布式内存计算引擎&#xff0c;可以支持海量数据的分布式计算。 Spark在大数据体系是明星产品&#xff0c;作为最新一代的综合计算引擎&#xff0c…

对于高速信号完整性,一块聊聊啊(8)

什么是Df和Dk 介电常数( D k )、介质损耗( D f ) 介电常数&#xff1a;材料如果在受到外部电场作用时能够储存电能&#xff0c;就称为“电介质”。比如说&#xff0c;电容可以存储电荷&#xff0c;而当电容平板中间填充有介质时&#xff0c;存储的电荷会更多。介电常数越大&a…

Nginx配置全攻略:掌握Nginx的高级技巧,提升你的Web服务器性能!

作为一个资深的技术人员&#xff0c;全面理解Nginx的配置是非常重要的。本文将详细介绍Nginx配置文件的各个部分&#xff0c;包括介绍、命令或语法、主要作用以及使用方法等。 一、Nginx简介 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器&#xff0c;它的…