使用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篇都不夠寫了。有什麼技術方面的問題能夠在下方留言。

相關文章
相關標籤/搜索