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

时间:2013-11-23 15:58:42

标签: docker

我预感docker可以大大改善我的webdev工作流程 - 但我还没有完全了解如何处理将docker添加到堆栈的项目。

基本软件堆栈如下所示:

软件

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

    • 具有多个模块的Apache
    • MYSQL
    • PHP
    • 某些CMS,例如Silverstripe
  • GIT

工作流

我可以想象工作流看起来有点如下:

开发

  1. 写一个Dockerfile来定义符合上述要求的LAMP容器
    • REQ:机器应该在启动后立即启动apache / mysql
  2. 构建泊坞窗图片
  3. 将运行CMS所需的文件复制到例如~/dev/cmsdir
    • ~/dev/cmsdir/置于版本控制
  4. 运行docker容器,并以某种方式将~/dev/cmsdir挂载到容器上的/var/www/
  5. 填充数据库
  6. /dev/cmsdir/
  7. 工作
  8. 承诺&关闭码头集装箱
  9. 部署

    1. 设置远程主机(例如,使用ansible)
    2. 将容器图像推送到远程主机
    3. 通过git
    4. 获取cmsdir - 项目
    5. 运行泊坞窗容器,拉入数据库并将cmsdir装入/var/www
    6. 现在,这在纸面上看起来相当不错,但我不太确定这是否是正确的方法。

      问题:

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

      2. 我应该为db和apache服务器分别设置容器实例吗?或者为上述用例设置一个容器是否足够?

      3. 如果为数据库和服务器使用单独的容器,我怎样才能同时自动上下旋转?

      4. 我如何将/dev/cmsdir/实际挂载到容器/var/www/ - 目录中?我应该使用data-volumes吗?

      5. 我是否错过了任何陷阱?什么可以简化?

4 个答案:

答案 0 :(得分:46)

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

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

  2. 是的,我认为你应该有一个单独的db容器。

  3. 我只使用基本脚本:

    #!/bin/bash
    
    $JOB1 = (docker run ... /usr/sbin/mysqld)
    $JOB2 = (docker run ... /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2
    
  4. 是的,您可以使用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构建和映像

  5. 我不知道:-)

答案 1 :(得分:9)

你想使用docker-compose。按照这里的教程。非常简单。似乎勾选你所有的盒子。

https://docs.docker.com/compose/

答案 2 :(得分:4)

我理解这篇文章目前已有一年多了,但我最近问自己非常相似的问题,并对你的问题有几个很好的答案。

  1. 您可以设置MySQL docker实例,并将数据保留在无状态数据容器上,即数据容器不需要主动运行

  2. 是的,我建议为您的Web服务器和数据库使用单独的实例。这就是Docker的力量。

  3. 查看this repo我一直在建设。基本上它就像make build& make run您可以在本地运行Web服务器和数据库容器。

  4. 首次运行容器时使用-v参数,这会将容器上的特定文件夹链接到运行容器的主机。

  5. 我认为您的想法很好,目前可以实现您所要求的一切。

  6. Here is a turn key solution实现了您列出的所有需求。

答案 3 :(得分:1)

我整理了一个易于使用的 docker compose 设置,该设置应符合您的开发工作流程要求。

https://github.com/ehyland/docker-silverstripe-dev

主要功能

  • 持久性数据库<​​/ li>
  • 您选择HHVM + NGINXApache2 + PHP5
  • 使用xDebug
  • 调试和设置断点

README.md应该足够明确,以便让您入门。