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

我有一个预感,码头可以大大改善我的 webdev 工作流程-但我还没有完全成功地理解如何处理一个项目添加 docker 到堆栈。

基本的软件栈应该是这样的:

软件

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

    • Apache with several modules
    • MYSQL
    • PHP
    • 一些 CMS,例如 银条
  • GIT

工作流程

我可以想象工作流程如下:

发展

  1. 编写一个 Dockerfile,定义一个满足上述要求的 LAMP 容器
    • REQ: 机器应该在引导后立即启动 apache/mysql
  2. 构建 Docker 映像
  3. Copy the files required to run the CMS into e.g. ~/dev/cmsdir
    • ~/dev/cmsdir/置于版本控制之下
  4. 运行 docker 容器,并以某种方式将 ~/dev/cmsdir挂载到容器上的 /var/www/
  5. Populate the database
  6. /dev/cmsdir/工作
  7. 提交并关闭码头容器

部署

  1. 设置远程主机(例如使用可视化)
  2. 将容器映像推送到远程主机
  3. 通过 git 获取 cmsdir-项目
  4. Run the docker container, pull in the database and mount cmsdir into /var/www

Now, this looks all quite nice on paper, BUT I am not quite sure whether this would be the right approach at all.

问题:

  1. 在本地开发时,如何使数据库在容器实例重新启动之间保持持久性?或者每次旋转容器之前都需要运行 sql-dump 吗?

  2. 对于 db 和 apache 服务器,我是否应该有单独的容器实例?或者对于上面的用例只有一个容器就足够了吗?

  3. 如果对数据库和服务器使用单独的容器,如何能够同时自动地上下旋转它们?

  4. 我实际上如何将 /dev/cmsdir/挂载到容器 /var/www/-目录中? 我应该利用 数据量吗?

  5. 我漏掉了什么陷阱吗? 有什么可以简化的吗?

19490 次浏览
  1. 如果需要独立于 CMS 容器的数据库持久性,那么可以为 MySQL 使用一个容器,为 CMS 使用一个容器。在这种情况下,您可以让 MySQL 容器仍然运行,并且可以根据需要独立地重新部署 CMS。

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

  2. Yes, I think you should have a separate container for db.

  3. 我使用的只是基本的脚本:

    #!/bin/bash
    
    
    $JOB1 = (docker run ... /usr/sbin/mysqld)
    $JOB2 = (docker run ... /usr/sbin/apache2)
    echo MySql=$JOB1, Apache=$JOB2
    
  4. 是的,您可以使用数据卷 v 开关。我会用这个来开发。您可以使用只读挂载,因此如果需要,不会对此目录进行任何更改(无论如何,您的应用程序应该将数据存储在其他地方)。

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

    Anyway, for final deployment, I would build and image using dockerfile with ADD /home/user/dev/cmsdir /var/www/cmsdir

  5. 我不知道: -)

我知道这篇文章已经有一年多的历史了,但是我最近也问了自己一些类似的问题,并且对你们的问题有了一些很好的回答。

  1. 您可以设置一个 MySQL docker 实例,并在无状态数据容器(即不需要主动运行的数据容器)上保存数据

  2. 是的,我会建议为你的网络服务器和数据库有一个单独的实例。这就是 Docker 的力量。

  3. 看看我一直在构建的 这个回购。基本上它就像 make buildmake run一样简单,你可以让一个 web 服务器和数据库容器在本地运行。

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

  5. 我认为你的想法是 很好,它是目前可能实现所有你的要求。

这里是一个交钥匙的解决方案 实现所有的需求,你已经列出。

你想使用码头-组合。按照这里的教程。非常简单。似乎勾选所有的框。

Https://docs.docker.com/compose/

我已经整合了一个易于使用的 码头作曲设置,应该符合您的开发工作流程的要求。

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

主要特色

  • 持续性数据库
  • 选择 HHVM + NGINXApache2 + PHP5
  • 使用 xDebug 调试和设置断点

README.md应该足够清晰,可以让你开始。