创建一个跨平台的Docker开发环境

您阅读过以下语句:

“关于Docker的伟大之处在于,您的开发人员可以运行与生产环境完全相同的容器。”

如今,Docker一直是炒作,并且有这样的说法,许多人想知道如何才能加入并利用使Docker如此受欢迎的任何优势。

就在六个月前,那时我们才开始使用Docker并尝试使其适应我们的流程。 短短几个月后,我们知道我们喜欢它并希望以这种方式运行应用程序,但是我们在某些Docker开发工作流中苦苦挣扎。

作为开发团队的经理,我喜欢在应用程序的整个生命周期中使用相同的流程和技术。 当我们使用Chef在AWS OpsWorks上运行应用以配置服务器和部署应用时,我们使用Vagrant和Chef在本地运行相同的配方以构建我们的开发环境。

Docker开发环境的挑战

我们与Docker的开发花了很长时间才意识到,通用声明并不像听起来那样容易实现。

本文重点介绍了我们试图在Windows,Mac和Linux上创建一致的Docker开发环境时面临的六大挑战:

  1. 在三个不同平台上运行Docker
  2. Windows上的Docker Compose问题
  3. 在无业游民中运行最少的操作系统(boot2docker不支持来宾添加)
  4. 在Mac和Linux上写入对卷的访问权限
  5. 在同一主机端口上运行多个容器
  6. 下载Docker映像的多个副本

在多个操作系统上运行Docker

Docker需要Linux。 如果每个人都运行Linux,这确实不是问题,但是当一个团队使用多个OS时,它将在流程和技术上产生重大差异。 我们团队中的开发人员碰巧使用Windows,Mac和Linux,因此我们需要一个在这三个平台上都能一致工作的解决方案。

“我们需要一个能够在三个平台上保持一致的开发环境解决方案。” 通过…

点击鸣叫

Docker提供了一个在Mac和Linux上运行的解决方案boot2docker 。 boot2docker是一个最小的Linux虚拟机,其安装量足以运行Docker。 它还提供了外壳初始化脚本,以启用从主机操作系统(Windows或Mac)使用Docker命令行工具的功能,并将其映射到在boot2docker VM内部运行的Docker主机进程中。 与VirtualBox结合使用,这提供了一种在Windows或Mac上启动并运行Docker的简便方法。

尽管boot2docker在简单的用例中可以很好地工作,但它使某些条件难以使用。 我将在以下挑战中探讨这些问题。 首先可能很难理解这个主题,所以下面是在本地运行Docker的三个主要选项的简单说明:

Docker-locally1的三种运行方式

在Windows上使用Docker Compose

Docker Compose是用于协调多个容器环境的出色工具,并且实际上在许多方面使Docker可用于开发。 如果必须运行所有正常的Docker CLI命令和标志来启动环境并正确链接它们,那将是我们许多人不愿做的工作。

但是,Compose仍然相对较新,就像Docker本身一样,因此它在Windows上还不能很好地工作。 实际上,Windows上存在许多问题,因此该项目上有一部史诗可以用来解决这些问题: https : //github.com/docker/compose/issues/1085 。 不过,有些好消息是Docker Toolbox声称即将推出对Windows的Compose支持。

(重新)输入流浪汉

我在前面提到过,boot2docker可以很好地创建用于在其中运行Docker的Linux VM,但是它并不是在所有情况下都可以正常工作。

流浪汉已经为开发团队提供一个梦幻般的工具,在过去的几年里,当我开始与码头工人的工作我甚至有点难过从它搬走。 经过几个月的努力使所有东西都可以与boot2docker一起使用,我们将Vagrant带回了方程式。

我们喜欢boot2docker这么小,因为我们不需要功能齐全的Docker主机,但是不幸的是,它不支持同步文件夹所需的VirtualBox来宾添加。 值得庆幸的是,尽管我们发现一个无聊的盒子AlbanMontaigu / boot2docker ,它是boot2docker的一个版本,安装了来宾添加,重量只有28M。 相比之下,最小的Ubuntu 14.04机器为363M。

在卷上写访问

Docker可以将主机文件系统作为卷挂载到容器中。 当容器只需要读取文件时,这很棒,但是如果容器需要将更改写入文件,则可能会出现问题。

在Windows VirtualBox上,同步的文件夹是世界可写入的,Linux权限为777。因此在Windows上,写访问权限不是问题。 但是,在Linux和Mac上,存在文件所有权和使用权限。 例如,当我在Mac上编写代码时,我的用户名是shipley,而uid / gid是1000。但是,在我的容器中,Apache作为uid / gid为33的www-data运行。

因此,当我希望Apache生成可以在其主机上访问以继续进行开发的文件时,由于该Apache以不同的用户身份运行,因此不允许对其进行写操作。 我的选择要么是更改Mac文件系统上文件的所有权/权限,要么是将容器中的用户和uid / gid apache运行方式更改为Shipley和1000。但是,该选项相当草率,不适用于团队开发。

使用VirtualBox,您可以更改同步文件夹的挂载用户/组和权限,但是默认情况下这并不容易。 不过,Vagrant提供了一种非常方便的方式来执行此操作。 这是我们回到流浪者的最大动力之一。 使用Vagrant,我们需要添加到Vagrantfile中的所有内容是:

config.vm.synced_folder "./application", "/data", mount_options: ["uid=33","gid=33"]

使用额外的mount_options ,它将在vm中将/ data文件夹拥有为uid / gid 33,该文件夹在基于Ubuntu的Apache容器中将映射到用户/组www-data。

但是,有趣的是-正如我之前提到的,默认情况下,Windows上的文件系统权限为777。因此,写访问没有问题。 但是,我们发现,当在Docker中使用卷将自定义my.cnf文件安装到mariadb容器中时,如果配置文件是可全局写入的,则mariadb不喜欢它。 同样,Vagrant通过简化安装过程中的文件权限设置来帮助我们:

config.vm.synced_folder "./application", "/data", mount_options: ["uid=33","gid=33","dmode=755","fmode=644"]

运行暴露相同端口的多个容器

我的团队主要开发Web应用程序,因此对我们来说,每个项目/应用程序都公开了端口80,以便在开发过程中进行HTTP访问。

尽管适用于Windows / Mac的boot2docker和适用于Linux的本机Docker使快速,轻松地上手,但您只能将一个容器绑定到主机上的给定端口。 因此,当我们开发暴露同一端口的多个应用程序或应用程序的多个组件时,它将不起作用。 这确实不是秀场上的障碍,但它给您带来不便,因为它要求在非标准端口上运行应用程序,这些应用程序很难使用且难以记住。

但是,通过流浪汉在其自己的VM中运行每个应用程序可以解决此问题。 当然,它会引入更多问题。 像现在一样,您必须通过IP地址访问应用程序,或者在主机文件中将主机名映射到该应用程序。 不过,这的确还不错,因为您只需要为每个应用执行一次即可。

该解决方案引入的另一个问题是运行多个VM需要更多的内存。 由于Docker应该减轻运行完整VM的负担,因此似乎也适得其反。 无论如何,要同时运行多个应用程序并在相同的端口上进行访问,这是一个很小的代价。

下载Docker映像的多个副本

但是,此解决方案创建的最烦人的问题是,既然Docker在多个VM中运行,则每个人都需要下载任何相关的Docker映像。 这只会花费更多的时间和带宽,而且如果我们的开发人员讨厌一件事,那就在等待。

不过,我们能够发挥创意,并且在VM启动时,我们检查了环境变量DOCKER_IMAGEDIR_PATH定义的主机文件夹中DOCKER_IMAGEDIR_PATH有任何Docker映像,如果找到,它将在docker load它们。 然后在完成DOCKER_IMAGEDIR_PATH docker-compose up -d之后,将所有已下载的新映像复制到DOCKER_IMAGEDIR_PATH文件夹中。

宾果游戏,现在只需下载一次每个图像。

结论

在遇到所有这些挑战并找到解决方案之后,我们现在有了一个简单的Vagrantfile,可以将其复制到我们的每个项目中,以提供一致的开发体验,无论开发人员使用哪种操作系统。 今天,我们正在多个项目中使用它,甚至进入了持续集成和在生产环境中向Amazon Elastic Container Service进行蓝绿色部署的阶段(但这是另一篇文章的主题)。

我希望随着时间的流逝和项目的变化,我们将面临更多的挑战,并且随着我们的努力,我们将继续发展解决方案以解决这些问题。 我们的Vagrantfile是开源的,我们欢迎提出建议和贡献。

随时在下面发表您的问题和评论,以使本文更有意义,希望我们也能解决您面临的问题。

资源资源

通过@codeship“创建一致的跨平台Docker开发环境”

点击鸣叫

翻译自: https://www.javacodegeeks.com/2015/08/creating-a-cross-platform-docker-development-environment.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值