当前位置: 首页 > 面试题库 >

什么是一个好的docker webdev工作流程?

聂鹏云
2023-03-14
问题内容

我有种预感docker可以极大地改善我的webdev工作流程-
但我还没有设法解决如何将docker添加到堆栈中的问题。

基本软件堆栈如下所示:

软件

  • 提供自定义LAMP堆栈的Docker映像

    • Apache与几个模块
    • MySQL数据库
    • 的PHP
    • 一些CMS,例如Silverstripe
    • GIT

工作流程

我可以想象工作流程看起来如下所示:

发展历程

  1. 编写一个Dockerfile定义满足上述要求的LAMP容器的
    • REQ:机器应该在启动后立即启动apache / mysql
  2. 建立Docker映像
  3. 将运行CMS所需的文件复制到例如 ~/dev/cmsdir
    • ~/dev/cmsdir/版本控制之下
  4. 运行Docker容器,然后以某种方式挂载~/dev/cmsdir/var/www/容器上
  5. 填充数据库
  6. 做在 /dev/cmsdir/
  7. 提交并关闭Docker容器

部署方式

  1. 设置远程主机(例如,使用ansible)
  2. 将容器映像推送到远程主机
  3. cmsdir通过git 获取-project
  4. 运行Docker容器,拉入数据库并挂载cmsdir/var/www

现在,在纸面上看起来一切都很好,但是我不确定这是否是正确的方法。

问题:

  1. 在本地进行开发时,如何使数据库在容器实例的重新启动之间保持不变?还是我需要在旋转容器之前每次都运行sql-dump?

  2. 我是否应该为db和apache服务器分别设置容器实例?还是为上述用例配备一个容器就足够了?

  3. 如果将单独的容器用于数据库和服务器,我如何同时自动上下旋转它们?

  4. 我实际上将如何安装/dev/cmsdir/到容器目录中/var/www/?我应该为此使用数据量吗?

  5. 我错过任何陷阱了吗?有什么可以简化的吗?


问题答案:
  1. 如果需要CMS容器独立的数据库持久性,则可以将一个容器用于MySQL,将一个容器用于CMS。在这种情况下,您可以使MySQL容器仍在运行,并且可以根据需要独立地重新部署CMS。

对于开发-
另一个选择是使用数据卷从主机/开发机映射mysql数据目录。这样,您可以使用git(在主机上)管理mysql的数据文件(在docker中),并在需要时随时(在启动mysql容器之前)“重新加载”初始状态。

  1. 是的,我认为您应该为db提供一个单独的容器。

  2. 我只使用基本脚本:

    #!/bin/bash
    

    $JOB1 = (docker run … /usr/sbin/mysqld)
    $JOB2 = (docker run … /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2

  3. 是的,您可以使用data-volumes -v开关。我将其用于开发。您可以使用只读挂载,因此,如果需要,将不会对此目录进行任何更改(您的应用程序应将数据存储在其他任何地方)。

    docker run -v=/home/user/dev/cmsdir:/var/www/cmsdir:ro image /usr/sbin/apache2
    

无论如何,对于最终部署,我将使用dockerfile构建和映像 ADD /home/user/dev/cmsdir /var/www/cmsdir

  1. 我不知道 :-)


 类似资料:
  • 我在网上搜索了很多,但我没有找到任何明确的答案。到目前为止,我的理解是: < li >消费者手动为每个提供者编写合同(也许他们为合同添加了版本控制?) < li >消费者与提供商共享合同 < li >提供商使用Spring Cloud Contract Verifier依赖项和插件来生成几个测试文件 < li >提供商针对其服务运行测试文件并生成测试结果 < li >提供程序通过运行测试生成单个存

  • 我试图了解Uber Cadence的子工作流的用例。与简单地将工作流拆分为函数相比,子工作流的优势是什么?我有一个相当复杂的工作流,我正在考虑将其拆分为多个子工作流,但我不确定这样做的利弊。

  • BDD是一个评估软件需要如何运行的过程,然后编写代码所依据的验收测试。您可以使用TDD方法编写代码,为方法编写单元测试,并围绕单元测试(代码、测试、重构)构建类。当代码编写完成时,您将对其进行测试,以查看是否满足原始的验收测试。 有经验的人可以对我的解释进行评论,并用这些敏捷原则来演示一个简单的应用程序吗?我看到在不同的出版物中有大量关于BDD和TDD的文本,但我正在研究这两个过程在现实世界的开发

  • 使用“隐式”流,在资源所有者(即用户)给予访问权限后,客户端(可能是浏览器)将获得访问令牌。 然而,在“授权代码”流程中,客户端(通常是web服务器)只有在资源所有者(即用户)给予访问权限后才获得授权代码。使用该授权代码,客户机然后对API进行另一次调用,将client_id和client_secret与授权代码一起传递,以获得访问令牌。这里都描述得很好。 问题是:当“隐式”流接缝很好时,为什么还

  • 通过“隐式”流,在资源所有者(即用户)给予访问权之后,客户端(可能是浏览器)将获得一个访问令牌。 然而,对于“授权代码”流,客户端(通常是web服务器)仅在资源所有者(即用户)给予访问权之后才获得授权代码。使用该授权代码,客户机然后对API进行另一次调用,传递client_id和client_secret以及授权代码,以获得访问令牌。这里都有很好的描述。 这两个流具有完全相同的结果:访问令牌。不过

  • 根据我所看到的,在Spring Cloud Dataflow(SCDF)中创建流将部署底层应用程序,绑定通信服务(如RabbitMQ),设置Spring Cloud stream环境变量,并启动应用程序。这一切都可以使用cf push命令轻松手动完成。 同时,我在Spring Cloud Dataflow中遇到了一些缺点: SCDF服务器是PCF上的内存占用者(我有一个只有6个应用程序的流,但我需