我以前的几篇基于故事的文章似乎真的很成功,并且我收到了大家的一些很好的反馈。 因此,我认为我将继续本系列,并开始介绍更详细的主题,例如容器化和Docker 。
我们将再次关注我们的高级开发人员Gemma,她致力于改善在线漫画阅读器/商店的代码库 。 如果您有兴趣了解这个故事的开始方式,那么建议您查看以下内容:
如果您想了解有关Docker的更多信息,那么我强烈建议您阅读这本书-Docker:启动和运行:在生产中运送可靠的容器
问题
在向基于微服务的方法过渡期间,Gemma监督了一些新面孔加入她的团队。 加入新团队时总会有一条学习曲线,过渡期会降低团队的整体效率,因为他们希望在工作机器上进行所有设置。
任何新手都不应该感到束手无策,因此,Gemma将她的一些高级工程师与新手放在一起,试图使他们尽快开始使用代码库。
依赖与环境地狱
最初,Gemma团队中只有4个人,他们都是紧密合作的单位,能够非常迅速,轻松地在彼此的机器上解决任何依赖性问题或环境问题,而不会浪费太多时间。
但是,随着团队的扩大,不同环境的数量成为一个问题。 一个团队成员可能已经在CentOS上运行,另一个在MacOS上运行,另一个在Windows 10上运行。由于有3种各自的服务构成了漫画查看器,这意味着他们必须确保每台机器都设置了正确的依存关系和环境变量才能运行。
一个团队成员可能已经在其计算机上安装了Python 3.1,而帐户服务实际上需要Asyncio才能正常工作。 Asyncio仅在该语言的版本3.4中可用,因此该服务将无法在其计算机上启动。
现在,尽管这可能有些微不足道,但它确实代表了花费时间尝试将每个人都同步到正确的版本。 随着代码库的复杂性增加,运行它所需的环境配置也随之增加。
三, Config — 12因子应用
如果您致力于使应用程序对云友好,那么您可能会遇到12个因素 。 Gemma和她的团队正在尝试确保应用程序中的每个服务都遵守所有这些因素,以便轻松地扩展和部署他们的服务,而几乎不需要人工。
第三个因素是您在环境中存储所有配置项。 这通常意味着使用python命令,例如:
import os
db_pass = os.environ["DB_PASS"]
为了检索数据库密码等。但是,这使得在本地计算机上运行它相当困难,并且必须首先设置所有这些变量,才能运行程序。 您可以使用Powershell脚本或bash脚本之类的方法来执行此操作,但是要使此跨平台兼容需要花费时间和精力,并且任何更改都变得很困难。
问题
为所有新来者设置适当的依赖项和环境变量的组合开始变得有点负担,并且有时针对生产数据库运行测试。 这是由于开发人员忘记将环境变量设置回开发值。
随着未来团队进一步扩展的计划,这个问题需要解决。
解决方案— Docker
这是Gemma发现容器化和Docker的奇妙世界的时候。 通过容器化,Gemma和她的团队能够定义其应用程序在Dockerfile
运行所需的所有内容,然后使用一个简单的命令运行其新创造的Dockerfile
应用程序。
他们首先将用Python编写的帐户服务转换为使用docker,然后提出了类似以下内容的内容:
FROM python:3.6.3
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
EXPOSE 80
ENV DB_PASS dolphins
CMD ["python", "app.py"]
他们指定了希望其应用程序运行的精确Python版本,指定了应用程序的工作目录,并运行了pip install -r requirements.txt
来安装所有必要的Python依赖项。 最后,他们暴露了端口80,这是基础Python应用程序运行所在的端口。
您会在倒数第二行看到,他们还能够指定其DB_PASS
环境变量,该环境变量随后将使他们能够连接至开发数据库。
运行他们的应用
定义此Dockerfile
的真正Dockerfile
在于,团队中的每个人都可以使用以下2个命令在本地计算机上安装Docker之后构建并启动应用程序:
docker build -t py36-account-service .
docker run --name "py36-account-service" -d -p 9000:80 py36-account-service
随后,它将消失,下载所需的所有需求,并构建我们的Docker映像文件,随后可以运行它。
![](https://i-blog.csdnimg.cn/blog_migrate/f53a985f09536e4bf933816ba012558e.png)
之后,她可以通过调用上面指定的第二个Docker命令来运行应用程序。
![](https://i-blog.csdnimg.cn/blog_migrate/9aa7abbd965a2d57eef96a5da1af2e6c.png)
通过将应用程序迁移到这种新格式,这意味着该团队的任何新手都可以被告知只要他们还没有安装Docker就可以简单地安装它们,然后运行这两个命令,并且他们在自己的机器上可以运行帐户服务。 从长远来看,这最终将节省大量时间。
这可以在所有开发人员操作系统中正常运行,而不必大惊小怪。
处理多种环境
因此,尽管上述结构允许开发人员在其应用程序的一个环境中启动并运行,但并不能解决开发人员在生产环境中意外运行应用程序测试的问题。
为了解决这个问题,我们可以做一些事情,例如指定要传递给应用程序的--env-file
。 在这些环境文件中,我们可以分别指定我们的开发,测试和生产凭证。 然后,我们可以指定希望我们的应用程序启动并使用我们的开发数据库,如下所示:
docker run my_app --env-file .dev
结论
通过利用docker,Gemma和她的团队能够最大程度地减少新开发人员进入团队的进入门槛,并极大地减少了在有效的开发环境中建立和运行人员的时间。
通过对应用程序进行Docker标准化,他们还可以利用弹性容器服务(ECS)等AWS服务,而不必担心底层操作系统等,从而简化了部署。这最终节省了他们的时间,精力和成本。就像在普通EC2实例上运行它一样。
![](https://i-blog.csdnimg.cn/blog_migrate/e8ea0e26d26835129693d7023fcf2ba1.png)
结论
希望您发现这个故事既有趣又启发人! 我很喜欢这种新的写作风格,并且希望它能与大多数技术文章所采用的更加冗长和枯燥的风格有所不同。
我希望这有助于突出Docker的优势以及如何将其用于日常应用程序以改善开发人员的工作流程。 它不仅应该用于微服务之类,而且对于更大的单片应用程序也可以提供很多价值。
如果您觉得这很有用,请在评论部分或通过发推文@ Elliot Forbes告诉我。 我很高兴听到任何反馈!
From: https://hackernoon.com/an-introduction-to-docker-through-story-8ae5594d7446