使用Docker Compose搭建多服务应用

使用Docker Compose搭建多服务应用

      • Docker Compose简介
      • 安装Docker Compose
        • 在Linux上安装Docker Compose
        • 在macOS上安装Docker Compose
        • 在Windows上安装Docker Compose
      • 创建项目结构
        • Flask应用
        • 安装依赖
        • Dockerfile
      • 配置Docker Compose
      • 构建和运行应用
      • 访问应用
      • 高级配置
        • 环境变量
        • 网络配置
        • 卷挂载
      • 监控和日志
        • 查看日志
        • 查看服务状态
      • 故障排除
      • 总结

在现代软件开发中,多服务应用变得越来越普遍。Docker Compose是一个非常强大的工具,可以帮助开发者轻松地定义和运行多容器Docker应用。本文将详细介绍如何使用Docker Compose搭建一个多服务应用,包括Web应用、数据库和缓存服务。

Docker Compose简介

Docker Compose是一个用于定义和运行多容器Docker应用的工具。通过一个YAML文件(`docker-compose.yml`),你可以配置应用的服务。使用一条命令,你可以创建并启动所有服务,非常适合开发和测试环境。

安装Docker Compose

Docker Compose可以在多种操作系统上安装,包括Linux、macOS和Windows。
在Linux上安装Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
在macOS上安装Docker Compose

如果你使用的是Homebrew,可以通过以下命令安装Docker Compose:

brew install docker-compose
在Windows上安装Docker Compose

Windows用户可以直接从Docker官网下载Docker Desktop,它包含了Docker Compose。

创建项目结构

假设我们要创建一个简单的Web应用,使用Flask作为后端,MySQL作为数据库,Redis作为缓存服务。项目结构如下:
myproject/
├── app/
│   ├── app.py
│   └── requirements.txt
├── docker-compose.yml
└── Dockerfile
Flask应用
在`app/app.py`中创建一个简单的Flask应用:
from flask import Flask, jsonify
import mysql.connector
import redis

app = Flask(__name__)

# 连接到MySQL
mysql_conn = mysql.connector.connect(
    host='db',
    user='root',
    password='password',
    database='testdb'
)

# 连接到Redis
redis_client = redis.StrictRedis(host='cache', port=6379, db=0)

@app.route('/data/<int:id>', methods=['GET'])
def get_data(id):
    # 尝试从缓存中获取数据
    data = redis_client.get(f'data:{id}')
    if data:
        return jsonify({'id': id, 'data': data.decode('utf-8')}), 200

    # 如果缓存中没有数据,从数据库中获取数据
    cursor = mysql_conn.cursor()
    cursor.execute('SELECT * FROM data WHERE id=%s', (id,))
    row = cursor.fetchone()
    cursor.close()

    if not row:
        return jsonify({'error': 'Data not found'}), 404

    # 将数据存储到缓存中
    data = row[1]
    redis_client.set(f'data:{id}', data, ex=3600)  # 缓存1小时

    return jsonify({'id': id, 'data': data}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
安装依赖
在`app/requirements.txt`中列出所需的Python包:
Flask==2.0.1
mysql-connector-python==8.0.23
redis==3.5.3
Dockerfile
在项目根目录下创建一个`Dockerfile`,用于构建Flask应用的Docker镜像:
FROM python:3.9-slim

WORKDIR /app

COPY app/requirements.txt .
RUN pip install -r requirements.txt

COPY app .

CMD ["python", "app.py"]

配置Docker Compose

在项目根目录下创建一个`docker-compose.yml`文件,定义应用的服务:
version: '3'

services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
      - cache
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: testdb
    volumes:
      - db_data:/var/lib/mysql
  cache:
    image: redis:6.2

volumes:
  db_data:

构建和运行应用

在项目根目录下运行以下命令来构建和启动应用:
docker-compose up --build

访问应用

打开浏览器,访问`http://localhost:5000/data/1`,可以看到应用的响应。 ![Docker Compose项目结构示例](https://img-blog.csdnimg.cn/img_convert/c1e0986e66777fbd92a7696a3ac8e027.png)

高级配置

Docker Compose支持许多高级配置选项,如环境变量、网络配置、卷挂载等。
环境变量
可以在`docker-compose.yml`中定义环境变量:
environment:
  MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
  MYSQL_DATABASE: ${MYSQL_DATABASE}
然后在`.env`文件中设置环境变量:
MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE=testdb
网络配置
可以定义自定义网络,以便服务之间更好地通信:
networks:
  app_network:
    driver: bridge

services:
  web:
    networks:
      - app_network
  db:
    networks:
      - app_network
  cache:
    networks:
      - app_network
卷挂载
可以将主机的目录挂载到容器中,以便数据持久化:
volumes:
  - ./data:/var/lib/mysql

监控和日志

Docker Compose提供了丰富的监控和日志功能,可以用于监控和调试。
查看日志
docker-compose logs
查看服务状态
docker-compose ps

故障排除

如果Docker Compose配置出现问题,可以使用以下命令进行故障排除。

docker-compose config

总结

通过本文,你已经学习了如何使用Docker Compose搭建一个多服务应用。我们介绍了Docker Compose的基本概念、安装方法、创建项目结构、配置Docker Compose、构建和运行应用、高级配置(环境变量、网络配置、卷挂载)、监控和日志、故障排除等内容。掌握了这些知识,将有助于你在实际工作中更好地利用Docker Compose来管理多服务应用。
Docker Compose运行结果示例

使用Docker Compose可以显著简化多服务应用的管理和部署。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLaMA系列一直在假装开源...

伙伴们&#xff0c;很奇怪~ 关于LLM的开源与闭源模型的竞争又开始愈发激烈。 众所周知&#xff0c;开源模型以其开放性和社区驱动的特点受到一部分用户的青睐&#xff0c;而闭源模型则因其专业性和性能优化被广泛应用于商业领域。由于大模型最近2年的突然兴起&#xff0c;开源…

i2c与从设备通讯编程示例之开发板测试

编译elf1_cmd_i2c程序 &#xff08;一&#xff09;设置交叉编译环境 &#xff08;二&#xff09;查看elf1_cmd_i2c文件夹Makefile文件。查看当前编译规则&#xff0c;i2c_demo是编译整个工程&#xff0c;clean是清除工程。 &#xff08;三&#xff09;在03_elf1_cmd_i2c文件夹…

开源办公软件 ONLYOFFICE 深入探索

文章目录 引言1. ONLYOFFICE 创建的背景1. 1 ONLYOFFICE 项目启动1. 2 ONLYOFFICE 的发展历程 2. 核心功能介绍2. 1 桌面编辑器2. 1. 1 文档2. 1. 2 表格2. 1. 3 幻灯片 2. 2 协作空间2. 3 文档编辑器 - 本地部署版 3. 技术介绍4. 安装5. 优势与挑战6. 个人体验7. 强大但不止于…

C++ -- 模板进阶

非模板类型参数 模板参数分为类型形参与非类型形参。类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在class 或 typename之类的参数类型名称。非类型形参&#xff1a;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中将该参数当成常量来使用。…

【力扣】Go语言回溯算法详细实现与方法论提炼

文章目录 一、引言二、回溯算法的核心概念三、组合问题1. LeetCode 77. 组合2. LeetCode 216. 组合总和III3. LeetCode 17. 电话号码的字母组合4. LeetCode 39. 组合总和5. LeetCode 40. 组合总和 II小结 四、分割问题6. LeetCode 131. 分割回文串7. LeetCode 93. 复原IP地址小…

HarmonyOS 私仓搭建

1. HarmonyOS 私仓搭建 私仓搭建文档&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-ohpm-repo-quickstart-V5   发布共享包[https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-har-publish-0000001597973129-V5]…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

小林渗透入门:burpsuite+proxifier抓取小程序流量

目录 前提&#xff1a; 代理&#xff1a; proxifier&#xff1a; 步骤&#xff1a; bp证书安装 bp设置代理端口&#xff1a; proxifier设置规则&#xff1a; proxifier应用规则&#xff1a; 结果&#xff1a; 前提&#xff1a; 在介绍这两个工具具体实现方法之前&#xff0…

C++_STL_xx_番外01_关于STL的总结(常见容器的总结;关联式容器分类及特点;二叉树、二叉搜索树、AVL树(平衡二叉搜索树)、B树、红黑树)

文章目录 1. 常用容器总结2. 关联式容器分类3. 二叉树、二叉搜索树、AVL树、B树、红黑树 1. 常用容器总结 针对常用容器的一些总结&#xff1a; 2. 关联式容器分类 关联式容器分为两大类&#xff1a; 基于红黑树的set和map&#xff1b;基于hash表的unorder_set和unorder_ma…

Apache InLong数据集成工具安装部署和功能介绍

环境部署 在开始之前&#xff0c;我们需要安装 InLong 的全部组件 安装 ClickHouse 使用 Docker 快速部署 ClickHouse 数据库&#xff0c;命令如下&#xff1a; docker run -d --rm --nethost --name clickhouse -e CLICKHOUSE_USERadmin -e CLICKHOUSE_PASSWORDinlong -e C…

【开源免费】基于SpringBoot+Vue.JS网上超市系统(JAVA毕业设计)

本文项目编号 T 037 &#xff0c;文末自助获取源码 \color{red}{T037&#xff0c;文末自助获取源码} T037&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

练习LabVIEW第三十二题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十二题&#xff1a; 利用labview elapsed time(已用时间)定时设计输出一个方波 开始编写&#xff1a; 前面板放置一…

从“点”到“面”,热成像防爆手机如何为安全织就“透视网”?

市场上测温产品让人眼花缭乱&#xff0c;通过调研分析&#xff0c;小编发现测温枪占很高比重。但是&#xff0c;测温枪局限于显示单一数值信息&#xff0c;无法直观地展示物体的整体温度分布情况&#xff0c;而且几乎没有功能拓展能力。以AORO A23为代表的热成像防爆手机改变了…

恋爱脑学Rust之智能指针Rc,RefCell和Weak指针

小明和小丽为了维系彼此的关系&#xff0c;一起探索了智能指针的奥秘。通过 Rc、RefCell 和 Weak 的帮助&#xff0c;他们得以克服情感中遇到的种种困境。 第一章&#xff1a;Rc 智能指针的共生 小明和小丽搬进了一个共同的小屋&#xff0c;他们彼此相爱&#xff0c;决定共用…

C语言 | Leetcode C语言题解之第530题二叉搜索树的最小绝对差

题目&#xff1a; 题解&#xff1a; void dfs(struct TreeNode* root, int* pre, int* ans) {if (root NULL) {return;}dfs(root->left, pre, ans);if (*pre -1) {*pre root->val;} else {*ans fmin(*ans, root->val - (*pre));*pre root->val;}dfs(root->…

image_points_to_world_plane详解

分三个部分来聊聊这个算子 一,算子的参数介绍 二,算法的计算过程 三,举例实现 第一部分,算子的介绍 image_points_to_world_plane( : : CameraParam, WorldPose, Rows, Cols, Scale : X, Y) 参数介绍: CameraParam,:相机内参 WorldPose 世界坐标系,也叫物体坐标系(成…

“发放父作业单”是“过数”用例里面的内容吗

刘京城 2020-4-14 23:01 。。。。(注&#xff1a;这是一个人的昵称&#xff0c;不是省略号) 首先&#xff0c;执行者是同一个&#xff0c;那么思考焦点要关注“过数”用例是不是“发放父作业单”用例的一个步骤&#xff0c;和行为操作的频率无关&#xff0c;而是和责任有关&am…

vue3 ref,shallowRef,reactive,shallowReactive使用的简单异同点说明

1、这几个都是负责data的存储及读取的&#xff0c;我们常用的是ref,reactive。 2、看一下shallowRef这个,shallowReactive与其类似。 说明&#xff1a;以官网的说明&#xff0c;这个state.value.count 2是不会触发视图更新的&#xff0c;但是如果直接在<script setup lang…

Java | Leetcode Java题解之第517题超级洗衣机

题目&#xff1a; 题解&#xff1a; class Solution {public int findMinMoves(int[] machines) {int tot Arrays.stream(machines).sum();int n machines.length;if (tot % n ! 0) {return -1;}int avg tot / n;int ans 0, sum 0;for (int num : machines) {num - avg;s…

二分,CF 2036 G - Library of Magic

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 G - Library of Magic 二、解题报告 1、思路分析 首先 query(1, n) a ^…