利用Docker Compose构建微服务架构

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

利用Docker Compose构建微服务架构

    • 引言
    • Docker Compose 简介
      • 安装 Docker Compose
      • 创建项目结构
      • 编写 Dockerfile
        • 前端 Dockerfile
        • 后端 Dockerfile
        • 数据库 Dockerfile
      • 编写 docker-compose.yml
      • 启动服务
      • 访问应用
      • 关闭服务
    • 微服务之间的通信
    • 环境变量
    • 总结

引言

随着互联网技术的发展,传统的单体应用已经无法满足现代业务的需求。为了提高系统的可伸缩性、灵活性以及维护性,越来越多的开发者开始转向微服务架构。Docker Compose 是 Docker 官方提供的工具,用于定义和运行多容器 Docker 应用程序。本文将介绍如何使用 Docker Compose 构建一个简单的微服务架构。

Docker Compose 简介

Docker Compose 允许你在一个 YAML 文件中定义多个容器及其依赖关系,然后通过一个命令启动所有服务。这大大简化了多服务应用的部署过程。

安装 Docker Compose

在使用 Docker Compose 之前,需要先安装 Docker。安装完成后,可以通过以下命令安装 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

创建项目结构

假设我们要构建一个包含前端、后端和数据库的微服务架构。项目结构如下:

microservices/
├── frontend/
│   └── Dockerfile
├── backend/
│   ├── app.py
│   └── Dockerfile
├── db/
│   └── Dockerfile
└── docker-compose.yml

编写 Dockerfile

前端 Dockerfile
frontend 目录下创建 Dockerfile

FROM node:14WORKDIR /appCOPY package*.json ./
RUN npm install
COPY . .EXPOSE 3000
CMD ["npm", "start"]

后端 Dockerfile
backend 目录下创建 Dockerfile

FROM python:3.8-slimWORKDIR /appCOPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .EXPOSE 5000
CMD ["python", "app.py"]

数据库 Dockerfile
db 目录下创建 Dockerfile

FROM postgres:13ENV POSTGRES_USER=myuser
ENV POSTGRES_PASSWORD=mypassword
ENV POSTGRES_DB=mydb

编写 docker-compose.yml

在项目根目录下创建 docker-compose.yml 文件:

version: '3'services:frontend:build: ./frontendports:- "3000:3000"depends_on:- backendbackend:build: ./backendports:- "5000:5000"depends_on:- dbdb:build: ./dbenvironment:POSTGRES_USER: myuserPOSTGRES_PASSWORD: mypasswordPOSTGRES_DB: mydb

启动服务

在项目根目录下运行以下命令启动所有服务:

docker-compose up

访问应用

打开浏览器,访问 http://localhost:3000,你应该能够看到前端应用。后端服务将在 http://localhost:5000 上运行。

关闭服务

要关闭所有服务,可以在终端中按 Ctrl+C,或者运行以下命令:

docker-compose down

微服务之间的通信

在微服务架构中,服务之间需要相互通信。Docker Compose 提供了一个内部网络,使得服务之间可以通过服务名进行通信。

例如,在后端服务中,可以通过以下方式连接到数据库:

import psycopg2conn = psycopg2.connect(host='db',port=5432,user='myuser',password='mypassword',dbname='mydb'
)

环境变量

在生产环境中,通常会使用环境变量来管理配置信息。Docker Compose 支持从 .env 文件中读取环境变量。

在项目根目录下创建 .env 文件:

POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
POSTGRES_DB=mydb

然后在 docker-compose.yml 中引用这些环境变量:

version: '3'services:frontend:build: ./frontendports:- "3000:3000"depends_on:- backendbackend:build: ./backendports:- "5000:5000"depends_on:- dbenvironment:- DATABASE_HOST=db- DATABASE_PORT=5432- DATABASE_USER=${POSTGRES_USER}- DATABASE_PASSWORD=${POSTGRES_PASSWORD}- DATABASE_NAME=${POSTGRES_DB}db:build: ./dbenvironment:POSTGRES_USER: ${POSTGRES_USER}POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}POSTGRES_DB: ${POSTGRES_DB}

总结

通过本文,你已经学会了如何使用 Docker Compose 构建一个简单的微服务架构。Docker Compose 的强大之处在于它能够简化多服务应用的部署过程,使得开发者可以更专注于业务逻辑的实现。
Docker Compose 项目结构图

Docker Compose 使得微服务架构的构建变得更加简单和高效。
Docker Compose 服务启动图

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

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

相关文章

lru_cache用法

在python中,lru_cache是一个装饰器, 是 Python 标准库中 functools 模块的一部分。lru_cache 装饰器可以用来为一个函数添加一个缓存系统。这个缓存系统会存储函数的输入和对应的输出。如果函数被调用,并且给出了已经缓存过的输入&#xff0c…

Redis未授权访问漏洞复现和修复建议

Redis未授权访问漏洞利用(总结) 一、漏洞介绍及危害1.1 原理1.2 漏洞影响版本1.3 漏洞危害1.4 实战中redis常用命令 二、漏洞复现2.1 环境准备2.1.1 靶机安装redis服务器2.1.2 kali安装Redis客户端(Redis-cli) 三、漏洞利用3.1 利…

无人机之集群控制方法篇

无人机的集群控制方法涉及多个技术和策略,以确保多架无人机能够协同、高效地执行任务。以下是一些主要的无人机集群控制方法: 一、编队控制方法 领航-跟随法(Leader-Follower) 通过设定一架无人机作为领航者(长机&am…

流水线商品标签如何快速打印?商品标签自定义打印软件操作方法

一、概述 【软件可定制详情点文章最后信息卡片】 流水线商品标签如何快速打印?商品标签自定义打印软件操作方法 ‌定义与用途‌ 商品标签打印软件,即用于打印商品标签的应用软件。标签包含产品上的文字、商品详情等说明信息 如图,可以预先…

Python - PDF 分割成单页、PDF 转图片(PNG)

文章目录 PDF 分割成一页页的 PDFPDF 转 PNGPDF 分割成一页页的 PDF import fitz def split_pdf(pdf_path, save_dir):source_pdf = fitz.open(pdf_path)# 遍历source_pdf中的每一页,page_number从0开始计数 for idx

不只是任务分配!管理者应具备的核心认知

背景 二十年,中国的互联网行业飞速发展,让无数年轻人有了从技术岗走向管理岗的机会。然而,许多工程师在走上管理岗位时往往是“仓促上任”,没有足够时间适应管理工作和责任。少数悟性高、能力突出的工程师能够迅速胜任&#xff0…

java拷贝应用场景

文件分块上传:允许大文件分块上传,以便于更高效地管理和恢复上传。 文件元数据存储:在数据库中存储文件的元数据(如文件名、大小、上传时间等)。 异步处理:使用异步方法处理文件上传和下载,以提…

第二十五章 Vue父子通信之sync修饰符

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 2.3. BaseDialog.vue 三、运行效果 一、概述 前面的章节我们讲到,通过v-model我们可以实现父子组件间的通信,但是使用v-model的时候,子组件接收的prop属性名必须固定为valu…

【浪潮商城-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

轻松成为文本文件管理大师,将每个文件夹中的所有TXT分别合并成一个文本文档,发现办公软件TXT合并功能的无限可能

文本文件如潮水般涌来,管理它们成为了一项令人头疼的任务。但是,别怕,有了首助编辑高手软件,你将成为办公软件达人,轻松驾驭这些文本文件,体验无限魅力!想象一下,杂乱无章的文件夹瞬…

单例模式四种写法

饿汉式(线程安全) public class Singleton {// 直接创建实例,在类加载时就完成实例化private static final Singleton instance new Singleton();// 私有构造函数private Singleton() {}// 提供公共的静态方法获取实例public static Single…

安卓13默认连接wifi热点 android13默认连接wifi

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 有时候我们需要让固件里面内置好,相关的wifi的ssid和密码,让固件起来就可以连接wifi,不用在手动操作。 2.问题分析 这个功能,使用普通的安卓代码就可以实现了。 3.代…

青春的海洋:海滨学院班级回忆录项目

3系统分析 3.1可行性分析 通过对本海滨学院班级回忆录实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本海滨学院班级回忆录采用SSM框架,JAVA作为开…

青春海风:海滨学院班级回忆录设计与实现

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了海滨学院班级回忆录的开发全过程。通过分析海滨学院班级回忆录管理的不足,创建了一个计算机管理海滨学院班级回忆录的方案。文章介绍了海滨学院班级回…

C#中JsonConvert.DeserializeObject方法

JsonConvert.DeserializeObject 是一个在 Newtonsoft.Json 库中用来将 JSON 字符串转换为相应 .NET 对象的方法。 以下是一些使用 JsonConvert.DeserializeObject 的示例: 将 JSON 字符串转换为一个匿名对象: string json "{ Name: John Doe, A…

基于matlab的线性卷积演示系统

文章目录 前言1. 卷积的简单介绍1.1 翻褶1.2 移位1.3 相乘1.4相加1.5 整体的运行效果展示 2.App Designer的介绍3.具体的开发步骤3.1 声明成员变量3.2 设计基本布局3.3 编写回调函数 4.运行展示结语 前言 本篇文章按照如下要求,完成线性卷积演示系统 (1)用matlab完…

如何在Linux命令行中使用GhatGPT

2、验明正身,证明我的所在地是国内 3、第一次提问 4、第二次提问 5、问他一首古诗 6、话不多说,现在来展示他的安装过程 7、输入GitHub的网址 https://github.com/aandrew-me/tgpt 8、详情页向下翻 9、到终端输入 下列命令,等待安装&#x…

java并发编程-volatile的作用

文章目录 volatile的作用1.改变线程间的变量可见性2.禁止指令重排序 参考的学习视频 volatile的作用 1.改变线程间的变量可见性 每个线程都有一个专用的工作集内存,下图里面粉色的表示专用工作集内存,黄色的是共享内存工作区,如果加入了vol…

linux中级(防火墙firewalld)

一。firewalld与iptables区别1.firewalld可以动态修改单条规则,不需要像iptables那样,修改规则后必须全部刷新才可生效。firewalld默认动作是拒绝,则每个服务都需要去设置才能放行,而iptables里默认是每个服务是允许,需…

C#/.NET/.NET Core学习路线集合,学习不迷路!

前言 C#、.NET、.NET Core、WPF、WinForm、Unity等相关技术的学习、工作路线集合(持续更新)!!! 全面的C#/.NET/.NET Core学习、工作、面试指南:https://github.com/YSGStudyHards/DotNetGuide C#/.NET/.N…