【Docker】针对开发环境、测试环境、生产环境如何编排?
目录
一、引言
二、Docker Compose 文件基础
三、针对不同环境的 Docker 编排
开发环境
测试环境
生产环境
四、配置文件全局变量的编写
五、总结
一、引言
在软件开发和部署的过程中,不同的环境有着不同的需求和配置。Docker 作为一种强大的容器化技术,能够帮助我们轻松地创建和管理不同环境下的应用程序。通过合理地编排 Docker 容器,我们可以确保应用在开发、测试和生产环境中的一致性和可靠性。本文将详细介绍如何针对这三种环境进行 Docker 编排,包括 docker-compose 文件的编写以及配置文件全局变量的设置。
二、Docker Compose 文件基础
Docker Compose 是一个用于定义和运行多个 Docker 容器的工具,它使用 YAML 文件来配置应用程序的服务、网络和卷等方面14. 以下是一个基本的 docker-compose.yml 文件结构:
version: '3.3'
services:# 服务1的配置service1:image: image_name:tagcontainer_name: container_nameworking_dir: /path/to/working/dircommand: command_to_runvolumes:- host_path:container_pathenvironment:- VAR1=value1- VAR2=value2ports:- "host_port:container_port"restart: alwaysruntime: nvidia# 服务2的配置service2:# 类似服务1的配置项...
其中:
version
指定了 Docker Compose 的版本,不同版本可能具有不同的特性和语法14.services
下定义了各个服务,每个服务都有自己的配置,如image
指定了使用的 Docker 镜像,container_name
定义了容器的名称,working_dir
设置了容器内的工作目录,command
是容器启动时要执行的命令14.volumes
用于挂载主机目录到容器内,实现数据的持久化或共享14.environment
设置了容器内的环境变量14.ports
进行端口映射,将容器内的端口映射到主机的端口上,方便外部访问14.restart
定义了容器的重启策略,always
表示容器总是在退出后自动重启14.runtime
指定了容器运行时的环境,如nvidia
表示使用 NVIDIA 的 GPU 运行时环境。
三、针对不同环境的 Docker 编排
开发环境
- 特点:开发环境主要用于开发者进行代码编写、调试和初步测试。通常需要频繁地修改代码和配置,并且对环境的灵活性要求较高,以便快速迭代和验证新功能3.
- Docker Compose 编排示例:
version: '3.3'
services:hy-asr-dev:image: hy-asr:v1.0container_name: hy-asr-server-devworking_dir: /workspace/hy-asrcommand: python3 hy_asr_main.pyvolumes:- /usr/share/zoneinfo:/usr/share/zoneinfo- /etc/localtime:/etc/timezone:ro-./logs:/workspace/hy-asr/logs-./resources:/workspace/hy-asr/resources-../src:/workspace/hy-asr/src # 挂载本地代码目录,方便开发时修改代码environment:- TZ=Asia/Shanghai- CUDA_DEVICE_ORDER=PCI_BUS_ID- CUDA_VISIBLE_DEVICES=0 # 可根据开发机器的GPU资源进行调整(不同环境可视GPU不同,以免出现多个环境使用同一GPU出现显存处理不足的问题)
# 以下是配置全局变量,在配置文件中一般使用 ${KAFKA_BROKER_URL:192.168.0.24:9093} 作为全局可变配置参数- SERVER_PORT=- KAFKA_BROKER_URL=- DB_USERNAME=iotmp- DB_PASSWORD=- DB_HOST=- DB_PORT=- MINIO_ENDPOINT=- MINIO_ACCESS_KEY=- MINIO_SECRET_KEY=- MINIO_BUCKET_NAME=- MINIO_SECURE=ports:- "8668:8666"restart: alwaysruntime: nvidia
在开发环境的编排中,我们额外挂载了本地的代码目录../src
到容器内的/workspace/hy-asr/src
,这样开发者在主机上修改代码后,容器内的代码也会同步更新,无需重新构建镜像。同时,我们可以根据开发机器的实际情况调整 GPU 设备的可见性和端口号等配置。
测试环境
- 特点:测试环境用于对开发完成的功能进行系统的测试,包括功能测试、性能测试等。测试环境的配置应该尽可能地接近生产环境,以确保测试结果的准确性和可靠性,但也可能需要一些特定的测试工具和配置3.
- Docker Compose 编排示例:
version: '3.3'
services:hy-asr-test:image: hy-asr:v1.0container_name: hy-asr-server-testworking_dir: /workspace/hy-asrcommand: python3 hy_asr_main.pyvolumes:- /usr/share/zoneinfo:/usr/share/zoneinfo- /etc/localtime:/etc/timezone:ro-./logs:/workspace/hy-asr/logs-./resources:/workspace/hy-asr/resourcesenvironment:- TZ=Asia/Shanghai- CUDA_DEVICE_ORDER=PCI_BUS_ID- CUDA_VISIBLE_DEVICES=2- SERVER_PORT=8667- KAFKA_BROKER_URL=- DB_USERNAME=- DB_PASSWORD=- DB_HOST=- DB_PORT=- MINIO_ENDPOINT=- MINIO_ACCESS_KEY=- MINIO_SECRET_KEY=- MINIO_BUCKET_NAME=- MINIO_SECURE=Falseports:- "8667:8666"restart: alwaysruntime: nvidia
与开发环境相比,测试环境的编排可能会使用不同的外部服务地址或测试数据库等配置,以模拟真实的生产环境场景。例如,这里的KAFKA_BROKER_URL
、DB_HOST
等配置与开发环境有所不同,指向了专门为测试环境搭建的服务。
生产环境
- 特点:生产环境是应用程序最终运行的环境,要求高度的稳定性、可靠性和安全性。配置应该经过严格的测试和验证,并且尽可能地优化性能和资源利用3.
- Docker Compose 编排示例:
version: '3.3'
services:hy-asr-prod:image: hy-asr:v1.0container_name: hy-asr-server-prodworking_dir: /workspace/hy-asrcommand: python3 hy_asr_main.pyvolumes:- /usr/share/zoneinfo:/usr/share/zoneinfo- /etc/localtime:/etc/timezone:ro-./logs:/workspace/hy-asr/logs-./resources:/workspace/hy-asr/resourcesenvironment:- TZ=Asia/Shanghai- CUDA_DEVICE_ORDER=PCI_BUS_ID- CUDA_VISIBLE_DEVICES=3- SERVER_PORT=80- KAFKA_BROKER_URL=prod_kafka.example.com:9092- DB_USERNAME=prod_user- DB_PASSWORD=Prod@Passw0rd- DB_HOST=prod_db.example.com- DB_PORT=3306- MINIO_ENDPOINT=prod_minio.example.com:29000- MINIO_ACCESS_KEY=prod_admin- MINIO_SECRET_KEY=ProdAdmin@123!- MINIO_BUCKET_NAME=dida- MINIO_SECURE=Trueports:- "8669:8666"restart: alwaysruntime: nvidia
在生产环境中,我们使用了正式的域名和生产级别的配置,如prod_kafka.example.com
、prod_db.example.com
等,并且将端口映射到了标准的 HTTP 端口 80。同时,对于敏感信息如数据库密码等,应该使用更严格的安全措施进行管理,这里只是简单示例,实际生产中可能会使用加密存储或从安全的配置中心获取等方式。
四、同时启动docker-compose开发环境、测试环境、生产环境
示例:docker-compose.yml文件内容如下
version: '3.3'
services:# 开发环境服务hy-asr-dev:image: hy-asr:v1.0container_name: hy-asr-server-devworking_dir: /workspace/hy-asrcommand: python3 hy_asr_main.pyvolumes:- /usr/share/zoneinfo:/usr/share/zoneinfo- /etc/localtime:/etc/timezone:ro-./logs:/workspace/hy-asr/logs-./resources:/workspace/hy-asr/resources-../src:/workspace/hy-asr/srcenvironment:- TZ=Asia/Shanghai- CUDA_DEVICE_ORDER=PCI_BUS_ID- CUDA_VISIBLE_DEVICES=0 # 容器可见GPU(假设服务器为多显卡,课件GPU可设置为0, 1, 2, 3)- SERVER_PORT=8667
# 以下是配置全局变量的值,若在项目中配置文件中有使用${... : ...}指定值,会使其替换为这里定义的全局变量值- KAFKA_BROKER_URL=- DB_USERNAME=- DB_PASSWORD=- DB_HOST=- DB_PORT=- MINIO_ENDPOINT=- MINIO_ACCESS_KEY=- MINIO_SECRET_KEY=- MINIO_BUCKET_NAME=- MINIO_SECURE=ports:
# 原需调用的接口为10.0.4.66:8666,映射后调用该开发环境服务接口为10.0.4.66:8667- "8667:8666" # 8667是在容器外的映射端口,8666是容器内项目实际需要调用服务的端口restart: alwaysruntime: nvidia# 测试环境服务hy-asr-test:image: hy-asr:v1.0container_name: hy-asr-server-testworking_dir: /workspace/hy-asrcommand: python3 hy_asr_main.pyvolumes:- /usr/share/zoneinfo:/usr/share/zoneinfo- /etc/localtime:/etc/timezone:ro-./logs:/workspace/hy-asr/logs-./resources:/workspace/hy-asr/resourcesenvironment:- TZ=Asia/Shanghai- CUDA_DEVICE_ORDER=PCI_BUS_ID- CUDA_VISIBLE_DEVICES=2- SERVER_PORT=8668- KAFKA_BROKER_URL=- DB_USERNAME=- DB_PASSWORD=- DB_HOST=- DB_PORT=- MINIO_ENDPOINT=- MINIO_ACCESS_KEY=- MINIO_SECRET_KEY=- MINIO_BUCKET_NAME=- MINIO_SECURE=Falseports:
# 原需调用的接口为10.0.4.66:8666,映射后调用该测试环境服务接口为10.0.4.66:8668- "8668:8666"restart: alwaysruntime: nvidia# 生产环境服务hy-asr-prod:image: hy-asr:v1.0container_name: hy-asr-server-prodworking_dir: /workspace/hy-asrcommand: python3 hy_asr_main.pyvolumes:- /usr/share/zoneinfo:/usr/share/zoneinfo- /etc/localtime:/etc/timezone:ro-./logs:/workspace/hy-asr/logs-./resources:/workspace/hy-asr/resourcesenvironment:- TZ=Asia/Shanghai- CUDA_DEVICE_ORDER=PCI_BUS_ID- CUDA_VISIBLE_DEVICES=3- SERVER_PORT=80- KAFKA_BROKER_URL=- DB_USERNAME=- DB_PASSWORD=- DB_HOST=- DB_PORT=- MINIO_ENDPOINT=- MINIO_ACCESS_KEY=- MINIO_SECRET_KEY=- MINIO_BUCKET_NAME=- MINIO_SECURE=Trueports:
# 原需调用的接口为10.0.4.66:8666,映射后调用该生产环境服务接口为10.0.4.66:8668- "8669:8666"restart: alwaysruntime: nvidia
五、配置文件全局变量的编写
配置文件可变全局变量如何定义?
如下使用 ${KAFKA_BROKER_URL:192.168.0.4:9093} 形式
kafka:broker_url: ${KAFKA_BROKER_URL:192.168.0.4:9093}topic_name: ${KAFKA_TOPIC_NAME:hy-asr-audio}consumer_topic: ${KAFKA_CONSUMER_TOPIC:hy-asr-generate}group_id: ${KAFKA_GROUP_ID:hy-asr}auto_offset_reset: ${KAFKA_AUTO_OFFSET_RESET:earliest}enable_auto_commit: ${KAFKA_ENABLE_AUTO_COMMIT:true} # 是否自动提交偏移量,默认为true
在 Docker Compose 文件中,我们可以使用环境变量来设置配置文件的全局变量,这样可以方便地在不同环境中切换配置,而无需修改 Docker Compose 文件本身。例如,对于KAFKA_BROKER_URL
,我们可以这样设置:
environment:- KAFKA_BROKER_URL=${KAFKA_BROKER_URL:192.168.0.4:9093}
这里的 ${KAFKA_BROKER_URL:192.168.0.4:9093}
表示如果环境变量KAFKA_BROKER_URL
未设置,则使用默认值192.168.0.4:9093
。在实际使用中,我们可以在启动 Docker 容器之前,在主机上设置相应的环境变量,或者在 CI/CD 流程中通过脚本设置环境变量,从而实现不同环境下的配置切换。例如,在开发环境中,也可以在终端中执行 export KAFKA_BROKER_URL=dev_kafka.example.com:9092
,然后再运行 docker-compose up
,这样容器内的KAFKA_BROKER_URL
环境变量就会使用开发环境的配置。
相关文章:

【Docker】针对开发环境、测试环境、生产环境如何编排?
目录 一、引言 二、Docker Compose 文件基础 三、针对不同环境的 Docker 编排 开发环境 测试环境 生产环境 四、配置文件全局变量的编写 五、总结 一、引言 在软件开发和部署的过程中,不同的环境有着不同的需求和配置。Docker 作为一种强大的容器化技术&…...

小程序项目的基本组成结构
分类介绍 项目根目录下的文件及文件夹 pages文件夹 用来存放所有小程序的页面,其中每个页面都由4个基本文件组成,它们分别是: .js文件:页面的脚本文件,用于存放页面的数据、事件处理函数等 .json文件:…...
001-mysql安装
[rootcentos701 ~]# hostname -I 10.0.0.200 172.17.0.1 [rootcentos701 ~]# hostname centos701 [rootcentos701 ~]# rpm -qa | grep mariadb [rootcentos701 ~]# rpm -e --nodeps mariadb-libs-5.5.65-1.el7.x86_64 [rootcentos701 ~]# useradd mysql -s /sbin/nologin #创建…...

预训练模型与ChatGPT:自然语言处理的革新与前景
目录 一、ChatGPT整体背景认知 (一)ChatGPT引起关注的原因 (二)与其他公司的竞争情况 二、NLP学习范式的发展 (一)规则和机器学习时期 (二)基于神经网络的监督学习时期 &…...

高通---Camera调试流程及常见问题分析
文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中,经常会遇到各种状况,本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…...

【冷冻电镜】RELION5.0使用教程总结
准备数据集: A test data set composed of 5 tomograms of immature HIV-1 dMACANC VLPs, which is available at EMPIAR-10164. 原始倾斜系列数据需要是单独的影片或单独的运动校正图像,但不是组合倾斜系列堆栈。 mdoc 文件包含每个倾斜系列的元数据。…...

【Maven系列】深入解析 Maven 镜像配置
前言 Maven 是一个流行的 Java 项目管理和构建工具,可以自动化构建项目、管理依赖、生成报告等。在Maven构建项目时,通常经常需要下载各种依赖。默认情况下,Maven 会从中央仓库下载这些依赖,但在某些情况下,这个过程可…...

优质翻译在美国电子游戏推广中的作用
美国作为世界上最大的视频游戏市场之一,为寻求全球成功的游戏开发商提供了无与伦比的机会。然而,美国市场的文化和语言多样性使其成为一个复杂的导航景观。高质量的翻译在弥合开发者和这些充满活力的观众之间的差距方面发挥着关键作用,确保游…...

数据结构---栈(Stack)
1. 简介 栈(Stack)是计算机科学中的一种抽象数据类型,它遵循特定的操作顺序,即后进先出(Last In First Out,LIFO)。这意味着最后添加到栈中的元素将是第一个被移除的。栈的基本操作通常包括&am…...

【全网最新】若依管理系统基于SpringBoot的前后端分离版本开发环境配置
目录 提前准备: 下载源代码 设置依赖 设置后台连接信息 运行后台 运行前端 安装npm依赖 启动前端 登录网页客户端 提前准备: 1、安装mysql 5以上就可以。 2、安装redis. 3、安装npm npm下载地址:https://nodejs.org/dist/v22.12…...
limit(0,10)和limit(10,10)有什么区别吗?
在SQL查询中,LIMIT子句用于限制查询结果的数量。LIMIT子句通常有两种形式: LIMIT offset, countLIMIT count 这里的offset表示从哪一条记录开始选取,count表示选取多少条记录。 LIMIT(0,10):这种形式的LIMIT子句表示从第一条记录…...
grpc与rpcx的区别
什么是微服务?rpc架构的主要区别rpcx与grpc的区别rpcx:grpc:为什么grpc要使用http2,为什么不适应http1或者http3?为什么grpc要使用proto而不是json或者其他数据格式? 为什么rpcx快,快多少?rpcx的具体性能指标与grpc比较: 什么是微服务? 整体功能通过多个程序实现,每个程序…...

基于XML的AOP开发
AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程。 AOP相关术语: 目标对象(Target): 你要去代理的对象,可以理解为之前很单纯的那个对象。 代理对象(Proxy): 你把你那个单纯的对象给我,…...

pdf也算是矢量图——pdf大小调整--福昕pdf
有时候需要把pdf作为矢量图放到latex论文中,有时候需要裁剪掉空白的部分,就需要用福昕pdf进行编辑, 参考文章:福昕高级PDF编辑器裁切工具怎么用?裁切工具使用方法介绍_福昕PDF软件工具集 (foxitsoftware.cn)...

Web应用程序文件包含-Server2233-解析
B-6 Web应用程序文件包含 任务环境说明:服务器场景名称:Server2233...

AI开发: 知识图谱的初识,学会制作知识图谱- Python 机器学习
一、知识图谱的概念 知识图谱是一个通过图结构来表示和组织知识的工具,它将事物、概念和它们之间的关系以图的形式呈现出来,图中的节点代表实体(比如人物、地点、事件等),而边代表这些实体之间的各种关系(…...

Ubuntu Linux用户与组的管理
Ubuntu Linux操作系统- 第一弹 由猪猪侠开启Linux操作系统的学习 文章目录 前言Linux操作系统的发展Linux版本 Linux用户账户及其类型超级用户系统用户普通用户 Ubuntu超级用户权限与管理员Linux的超级用户权限解决方案Ubuntu管理员sudo命令su命令Ubuntu启用root登录 组账户及其…...
算力100问☞第32问:密集计算的关键技术有哪些?
1、高性能处理器和图形处理器 高性能处理器和图形处理器作为计算系统中的核心组件,发挥着至关重要的作用。 高性能处理器是密集计算的基础。它们采用先进的制程技术和架构设计,能够提供更高的时钟频率和更多的核心数量,从而实现更快的计算速…...

Rust : 生成日历管理markdown文件的小工具
需求: 拟生成以下markdown管理小工具,这也是我日常工作日程表。 可以输入任意时间段,运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…...

【并集查询】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...