如何在 DevOps 生命周期的开发阶段使用 docker?

2023-11-24

我有几个与 Docker 在开发阶段的使用相关的问题。

devops

我将提出三种不同的场景来说明如何在开发环境中使用 Docker。假设我们正在 Java 和 Spring Boot 中创建一个 REST API。为此,我需要一个 MySQL 数据库。

  1. 第一个场景是拥有一个用于使用 MySQL 容器进行开发的 docker-compose,以及一个使用 MySQL 和另一个容器中的 Java 应用程序 (jar) 进行生产的 docker-compose。为了进行开发,我启动了 docker-compose-dev.yml 以仅启动数据库。使用 IDE(例如 IntelliJ Idea)启动和调试应用程序。对代码所做的任何更改,IDE 将识别并通过应用更改来重新启动应用程序。

  2. 第二种场景是,对于开发和生产环境,都拥有一个包含数据库和应用程序容器的 docker-compose。这样,每次我对代码进行更改时,我都必须重建映像,以便将更改加载到映像中并再次启动容器。这种场景可能是最典型的,用于使用 Docker 进行开发,但由于每次有变化都需要重建镜像,所以看起来很慢。

  3. 第三种情况是前两种情况的混合。两个 docker-compose。开发 docker-compose 包含两个容器,但具有允许实时重新加载应用程序、映射卷和使用 Spring Dev Tools 等机制。通过这种方式,容器被启动,如果文件发生任何更改,应用程序容器将检测到存在更改并将重新启动。对于生产,只需使用两个容器创建一个 docker-compose,但没有实时重新加载的功能。在我看来,这将是理想的场景,但我认为这非常依赖于所使用的技术,因为并非所有技术都允许实时重新加载。

问题如下。

  • 使用 Docker 进行阶段时,以下哪种场景最典型?

  • 场景 1 提出得好吗?即仅对外部服务(例如数据库、队列等)进行docker化,并使用IDE进行应用程序的开发和调试,而不使用Docker。

我提出的疑问和场景是在我提出场景2的问题之后出现的。每次更改代码时,都必须重新构建映像并再次启动容器,这会极大地浪费时间。简而言之,一个问题是:如何避免这种情况?

在此先感谢您的时间。

NOTE: 这可能是一个需要征求意见的问题,但了解开发人员通常如何处理这些问题会很高兴。


免责声明:这是我对 Mars 先生提出的问题的个人看法。尽管我尽力用实际来源来支持我的答案,但这主要是基于我自己的经验和一些常识

使用 Docker 进行开发时,以下哪种场景最典型?

我在几个项目中见过这 3 个场景,每个场景都有各自的优点和缺点。不过,我认为使用 Docker Compose 允许动态代码重新加载的场景 3 在灵活性和一致性方面是最有利的:

  • Dev 和 Prod Docker Compose 非常匹配,这意味着 Dev 环境尽可能接近 Prod 环境
  • 开发时不必不断重建镜像,但在需要时很容易做到
  • 很多技术都支持这种场景,比如你提到的 Spring Dev Tools,还有 Python Flask 等。
  • 您可以轻松利用Docker Compose 扩展了又名配置共享机制(也可以用于场景 2)

场景 1 提出得好吗?即仅对外部服务(例如数据库、队列等)进行docker化,并使用IDE进行应用程序的开发和调试,而不使用Docker。

场景 1 很常见,但 IDE 环境可能与 Docker 容器中的环境不同(并且很难保持从 IDE 环境到 Docker 环境的每个库、依赖项等的版本匹配)。它还可能需要在开发和生产之间经历一个中间步骤,以在进入生产之前实际测试开发工作后构建的 Docker 映像。

根据我自己的经验,当您在实际进行开发时不想与 Docker 打交道时,并且/或您使用的语言或技术不适合场景 3 中描述的动态重新加载时,这样做非常好。但最终它只是增加了环境之间的偏差以及开发和生产部署方法之间的复杂性。

必须重建镜像并再次启动容器是对时间的极大浪费。简而言之,一个问题是:如何避免这种情况?

除了您描述的场景之外,您还可以通过利用Docker 构建缓存并设计 Dockerfile。例如,Python 应用程序通常会将代码复制为构建的最后(或几乎最后)步骤,以避免使缓存无效,而对于 Java 应用程序,可以拆分代码以避免每次都编译整个应用程序代码更改 - 这取决于您的实际设置。


我个人使用的工作流程大致匹配场景 3,例如:

  • a docker-compose.yml与我的生产环境对应的文件
  • a docker-compose.dev.yml这将覆盖我的主 Docker Compose 文件的某些方面,例如从我的机器安装代码、向命令添加开发特定标志等 - 它将运行如下
    docker-compose -f docker-compose.yml -f docker-compose.dev.yml 
    
    但也有可能有一个docker-compose.override.yml as Docker Compose 默认使用覆盖
  • 在某些情况下,我必须针对特定情况使用其他覆盖,例如docker-compose.ci.yml在我的 CI 上,但通常主 Docker Compose 文件足以描述我的 Prod 环境(如果不是这种情况,docker-compose.prod.yml做到了这一点)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 DevOps 生命周期的开发阶段使用 docker? 的相关文章

随机推荐

  • 在 package.json 中设置 process.env var

    我正在尝试使用 package json 设置和检索节点应用程序 process env 变量 因此通过研究问题 我找到了一个通过 配置 部分设置 检索 process env 的示例 因此我添加了一个新配置部分如下图 config var
  • 获取 Jenkinsfile 失败的错误原因

    我有以下内容post故障部分 post failure mail subject u2639 env JOB NAME env BUILD NUMBER has failed body Build env BUILD URL is fail
  • 如何将“过滤器”应用到 AVCaptureVideoPreviewLayer

    我的应用程序当前正在使用 AVFoundation 从 iPhone 后置摄像头获取原始摄像头数据 并将其实时显示在 AVCaptureVideoPreviewLayer 上 我的目标是有条件地将简单的图像滤镜应用到预览图层 图像未保存 因
  • 如何使用 Android Studio 在 firebase 中检查“用户电子邮件已存在”

    我正在尝试更改我的代码 但是 它失败了 我的输出还是一样 也就是说 如果用户输入的电子邮件已经存在或不存在 验证 此电子邮件已被注册 还是出来了 为什么 有人可以我的编码有什么问题吗 这是我的方法 public boolean isChec
  • Next.js cookie 无法通过路由器中间件

    我正在尝试使用新的 Next Js 12 中间件功能创建一些路由保护 我的身份验证基于 cookie 上设置的 JWT 令牌 我之前已经使用 Next Js 上的 API 后端实现了这一点 没有出现任何问题 并且当点击 API 路由时 co
  • 如何在 CodeIgniter 的 url 中隐藏控制器名称?

    所以问题是我正在使用 htaccess 来隐藏 index php 但我仍然在 url 中获取控制器名称 如下所示 http example com name controller about我的问题是 是否可以隐藏控制器的名称 以便只显示
  • 错误:接口转换interface {}是[]interface {},而不是map[string]interface {}

    我正在构建一个项目 该项目从用户那里获取一个术语 然后执行谷歌搜索并返回 json 格式的标题列表 我正在使用 serpwow API 执行谷歌搜索并尝试解析响应 但是我收到错误消息 panic interface conversion i
  • 如何导出 DLL 中的类函数,但不是整个类

    我开发了一个 Win32 DLL 提供了下面的详细信息 并希望为函数 Connnect 和 LogOut 创建一个 CLI C 包装器 我知道可以从 DLL 导出整个类和函数 class CClientLib public CClientL
  • iOS 8 SDK:模态 UIWebView 和相机/图像选择器

    我发现 在针对 iOS 8 进行编译 并在 iOS 8 中运行 时 UIWebView无法显示相机 图像选择器 如果UIWebView位于以模态方式呈现的视图控制器中 它在直接 悬挂 在窗口上的视图控制器中工作没有问题rootViewCon
  • 猴子补丁 Python 类

    我有一个类 位于一个单独的模块中 我无法更改它 from module import MyClass class ReplaceClass object MyClass ReplaceClass 除了这个文件之外 这不会改变 MyClass
  • 闭包在 for 和 foreach 循环中的行为不同

    在 C 中尝试闭包时 我发现如果它们在循环中捕获迭代器变量 它们的工作效果会相当出乎意料 var actions new List
  • 四叉树查找邻居

    我正在寻找一种算法来查找四叉树的邻居 在示例图像中 我得到了红色节点 如何找到蓝色节点 有任何想法吗 有一些已知的算法 去看一下 相泽邦夫等人 四叉树中的恒定时间邻居查找 实验结果 卡斯图里 瓦拉达拉詹 通过四叉树的所有最近邻居 罗伯特 约
  • 为什么我的 golang 通道会出现死锁错误?

    package main import fmt sync func push c chan int wg sync WaitGroup for i 0 i lt 5 i c lt i wg Done func pull c chan int
  • 相对于每组中的值的比例(通过 dplyr)

    我有一组时间序列 我想根据它们在特定时间间隔内的值来缩放它们 这样 每个系列当时都将处于 1 0 并按比例变化 我不知道如何用 dplyr 做到这一点 这是一个使用 for 循环的工作示例 library dplyr data expand
  • iOS11自定义导航栏高度

    首先感谢您来到这里并帮助解决我的问题 谢谢你 在iOS11 beta6中 sizeThatFits 似乎不适用于 UINavigationBar 我注意到 UINavigationBar 结构已通过 Reveal 我的应用程序更改 我已尽力
  • 使用 python range 生成整数递减列表

    这是一个简单的问题 我有 range 1 11 1 这给了我 10 9 8 7 6 5 4 3 2 1 有没有一种 更干净 的方法来生成上述列表 也许只有一个功能 你可以用它range 10 0 1
  • 使用着色器时,在 QGLWidget 中使用 QPainter 而不是 OpenGL

    许多 Qt 特别是 4 6 用户都会熟悉 OpenGL 教程中提供的 Overpainting 示例 我正在尝试做一些非常相似的事情 但使用纯 OpenGL 数据的着色器 而不是旧的固定功能管道 Set background and sta
  • Highstock 在 x 轴上使用数字而不是日期

    我需要在页面上输出一个绘图 我正在考虑海斯托克或 Highcharts 来实现这一点 Highstock 界面更可取 因为导航器窗格在重新缩放后显示了绘图的其余部分 然而 我的绘图在 x 轴上有数字 但没有日期 时间 有没有办法将 High
  • 为什么我在 nginx 反向代理上收到 404?

    下面是我的配置 除了well known路线 我不明白为什么 如果我提出请求http example tech connect我收到 404 如果我向http api example tech我也得到了404 我看不出我哪里出了问题 因为这
  • 如何在 DevOps 生命周期的开发阶段使用 docker?

    我有几个与 Docker 在开发阶段的使用相关的问题 我将提出三种不同的场景来说明如何在开发环境中使用 Docker 假设我们正在 Java 和 Spring Boot 中创建一个 REST API 为此 我需要一个 MySQL 数据库 第