使用Docker统一团队的开发环境

开场白

做为一个技术团队的Leader,你是如何保证成员的开发环境达到公司的标准,或者是你定制的最低要求的?
若是你的回答是:差很少就好了,有问题再说,那么,你已经在给本身挖坑了。php

同事A的开发环境中用的是PHP 7.1,因此他在代码里写了这么一个函数:node

function getName(?int $id): string {
    return 'name';
}

好的,?int 的意思是你的参数必须是数字,可是能够填一个数字之外的特殊类型,那就是null。mysql


同事B用的是PHP 7.0,那么抱歉,他得这么改:linux

function getName(int $id = null): string {
    return 'name';
}

?int须要被改为int,由于那是7.1的Nullable语法nginx


同事C用的是 PHP 5.6,好的,继续改吧:git

function getName($id = null) {
    return 'name';
}

全部的类型定义都得移除,沮丧吗?sql



好的,你做为Leader?怎么选择用哪一个同事的代码做为最终输出?可想而知,选择哪一个都不合适。docker

选择 7.1

同事C 在抱怨,要那么高的版本真的好吗?我没用过新特性,也不感兴趣。bash

选择 7.0

同事A 在抱怨了,新语法多简洁啊,一个 ?int 就搞定了。服务器

选择 5.6

同事A/B 在抱怨,为何不用强类型,写代码太没乐趣了。




为何

问题出在Leader,给了成员太多的选择。会有什么后果?

优势 缺点
部分红员的利益受损
内部意见不统一,产生隔阂
可能出现被动学习新知识,生产力降低
维护多个不一样时期的项目时,本地环境的版本切换十分不方便
你的领导能力受到质疑
在诱惑面前,人们每每会选择最有利于本身的方式。不要试图去挑战人性,做为Leader的你,必须比任何一个成员都先作出选择。

正题

Docker

我不想讲docker是什么,由于其余人的博客里已经写烂了。

你须要知道的是,你能够把开发环境扔进docker,而后让每一个成员忘记本身电脑里的开发环境。至于用了什么版本的php、mysql、linux、nginx、nodeJs,已经固定在docker里了。
你不再用担忧你的成员会用其余版本的环境去写代码了,由于你已经制定了你的规矩。

优势 缺点
成员没得选,只能用同一个版本的环境 Leader须要写Docker配置
成员只须要知道docker怎么启动,零学习成本
技术方面的交流障碍减小
代码符合项目的基本需求,生产力提高
即便再多项目也不要紧,由于每一个项目都是docker启动,不须要考虑版本
Leader能够花更多精力在其它事情了

Dockerfile

也许你已经写完了全部的Dockerfile配置,并把这些文件放进了项目的根目录dockers/,同时为你的成员写好了一个构建脚本build.sh,接着加入版本控制(git,svn),最后推到git服务器等待成员拉取最新的开发环境。好的,成员们开始构建你定制的开发环境了。

# 构建镜像
sh build.sh

# 查看构建的镜像
docker images

# 根据镜像生成容器,仅供参考。本文不讲述docker具体用法
docker run -it -d php:7.1 /bin/bash
docker run -it -d nginx:1.14.0 /bin/bash
docker run -it -d mysql:5.7 /bin/bash

犀利的你可能把生成容器的操做写成一个脚本quick-start.sh,并且用的风声水起。笔者拍拍你的肩膀,同窗,为何不用docker-dompose呢?

Docker Compose

能够这么说吧,这个东西就像是同时启动了多个你想要启动的镜像,并且你还能够同时结束生成的容器。

# 同时启动
docker-compose up

# 同时结束
docker-compose down

是的,很任性,你只须要配置一下你须要启动哪些镜像,而后把配置放到根目录docker-dompose.yml中便可。
固然了,还有更多特性,好比 哪些容器之间须要互相关联,被关联的容器要用什么别名,需不须要等待关联容器启动完成以后再启动本身,等等。。。

补充

若是您的项目比较多,那么推荐您利用git的子模块(点击访问)去维护你的docker配置。这样您改配置只要改一个地方,全部项目里面都会同步过去的,极大的提升了您的效率和维护成本。

# 假设已经建好docker的git仓库   git@git_repository_a
# 那么在您的开发项目中,初始化只需这样作:
git submodule add git@git_repository_a

# 您会发现项目根目录多了一个文件 .gitmodules 以及多了一个docker仓库的文件夹

结语

可能不算是一篇技术文章,只是抛砖引玉,引导新的Leader怎么带领团队走向正规化的道路。如果真要写那么细,可能10篇都不够写了。有什么技术方面的问题能够在下方留言。

相关文章
相关标签/搜索