快速掌握使用Docker搭建开发环境

随着平台的不断壮大,项目的研发对于开发人员而言,对于外部各类环境的依赖逐渐增加,特别是针对基础服务的依赖。这些现象导致开发人员常常是为了简单从而直接使用公有的基础组件进行协同开发,在出现并行开发的情况特别是针对数据库的变动或数据的更改常常会导致其他开发人员无辜增加问题的排查时间,导致整体的开发效率降低,同时对于远程协助也造成了巨大的障碍。为了解决上述存在的问题,将会利用Docker Compose技术辅助开发人员对于开发环境的搭建,最终实现开发人员只要装有Docker就可以完成整个开发环境的搭建。

知道一个事物和实现这个事物是完全不同的事情。从Docker诞生那天开始,我们就梦想着诸如“15秒部署一个项目”,“版本可控开发环境”,以及时髦的运维用语,如“滚动开发”,“软件定义架构”。处于浪尖的行业人士都在以前所未有的热情参与到将很多名词和工具,例如“编排”,“服务发现”等,定义,重新定义以及商品化大潮中。

我认为这股大潮的催化剂来自于Docker在应用和基础架构之间带来的美妙接口和抽象。开发者可以在不必知道底层架构情况下谈论基础架构,操作人员也不必花大量时间研究如何安装和管理软件。肯定有什么力量隐藏在看似简单的外表下使得大家生活简化,更加高效。

现实世界时残酷的,不要想当然认为采用一项新技术只会带来享受。过去几年经过一些项目的磨练,经历过奇怪的环境,我认为Docker也不例外。但是某一个经验一般可以直接应用到项目的下一阶段。要想从Docker获得功力,必须浸淫到实际项目中去磨练。

过去一年中,我全身心投入去教授我的关于Dokcer基础的书,Docker in Action。

我注意到几乎所有人开始学习Docker技术时都会纠结于如何创建开发环境,然后才能了解生态系统之内大家的关系。每个人开始都会认为使用Docker会使环境搭建变的简单,也不是完全不对,有很多“容器化”教程都涵盖了创建一个image和如何将某个工具打包到容器(Container)内,但是如何将开发环境Docker化是一个完全不同的事情。

作为一个踏坑先驱者,我可以分享一下我的经验。

我曾经是一个资深Java使用者,但这个分享的经验不是关于Java的,而是围绕着我使用Go和Node开发应用发生的。我有一定的Go开发经验,主动提高在这一领域的能力。进入一个不熟悉领域迅速上手碰到的主要问题就是如何获得正确的工作流,而且我还比较厌恶在笔记本上不断安装软件,这些都驱使我尝试用Docker做这些工作,或者有时候采用Vagrant。

我所参与的项目是用Go写一个标准的REST服务,基于gin,依赖Redis和NSQ的某些库和服务。也就是说需要import一些本地运行着的Redis和NSQ实例的库,更有趣的是我还使用了一些服务于NGINX的静态资源。

对门外汉来说,Go是一种编程语言,实际上还有一种命令行工具也叫“go”。从依赖型管理、编译、测试用例到其它各种任务都使用它。对Go项目来说,除了Git和一个好用的编辑器,剩下就是跟它打交道了。然而还是有一个问题,我不想在笔记本上安装Go,笔记本上我只想安装Git和Docker。这些问题限制了其他环境下的兼容性,并且对新手来说降低了门槛。

这个项目有运行时依赖,意味着此工具集需要为简单环境定义和编排而包括Docker Compose。 很多人会为此感到不适应,那么我们怎么办?开始创建一个Dockerfile或者docker-compose.yml?好吧,先让我告诉大家我是怎么办的,然后解释为什么这么做。

例如在此案中www.sangpi.com中我希望我的本地包是完全自动的。我不喜欢手动逐条执行步骤,而且我的vim配置文件也很简单。我只想从“是否运行”层次控制运行环境。本地化开发环境目标被快速复制,不仅用于提高生产效率,而且用于共享Docker images。 我最终完成了Dockerfile,用来产生包含Go,Node,和我最经常使用的打包工具Gulp的images。 此Dockerfile没有嵌入代码,image也没有嵌入Gulpfile。相反的,在一个建立了的GOPATH(Go workspace的根路径)上定义了一个卷。

最终,我为此images设置了给gulp提供服务的entrypoint,设置默认命令来监控。输出images肯定不是我称为build artifact的东西,从这个意义上来讲,此环境唯一做的就是提供了一个运行实例,帮助我们判断是否代码运行。对我的场景来说,运行的非常棒。而我将“artifacts”用于称呼另外一个build。

下一步我用Compose定义本地开发环境。首先定义了在images中用到的所有Docker Hub 中定义的依赖服务,将他们连接到某一个“目标”服务。此服务引用了新Dockerfile从哪里生成,将本地源目录绑定到新image期望输出的挂载点,暴露一些可以测试的端口。然后,添加了一个服务,可以不断地向目标服务循环发起一系列集成测试。最终,我添加了NGINX服务,挂载了有很多配置文件和静态assets的卷。使用卷的好处在于重复使用配置文件和assets而不用重建image。

所有代码最终会在电脑上生成本地开发环境,当使用:

docker-compose up –d

时,会启动git clone,然后循环运行;不需要重建image或者重启容器。每当.go文件发生变化,Gulp就会重建,并且在运行的容器中重启我的服务。就这么简单。

创建此环境很简单吗?不尽然,但是确实实现了。难道不用容器,而在本地直接安装Go,Node,Gulp不是更简单吗?也许在这个场景是,但也只限于用Docker运行此依赖服务。我不喜欢这样。

我曾经要管理这些工具的不同版本,而产生了复杂的环境变量,到处生成artifacts。我不得不提醒同事们注意这些容易发生冲突的环境变量,他们太缺乏集中版本控制了。

也许你并不喜欢上面描述的环境,或者对项目有不同的需求。很好,确实是这样,本文并不是让所有工具都运行在Docker中,如果这样就说明并没考虑过要解决什么问题。

当我设计这个环境时,考虑过下面几个问题,顾虑,以及某些潜在答案。当开始Docker工作环境时,就会发现实际情况可能比自己的回答更糟糕。

当你考虑打包和环境时,最先考虑的因素是什么?

这个确实是最重要的问题。在此场景中,有几个选项。我可以使用go直接在容器内编程,看起来如下:

其实这个示例中大部分bolierplate可以通过shell别名或者函数隐藏,感觉Go是安装在自己的设备中似的,还可以跟Go工作流联系,创建artifacts。这些特性对非服务项目有益处,但是对库和软件项目就不一定了。

假设你已经在使用Gulp、make、ant或者其他脚本,那么可以继续,并且使用Dokcer作为这些工具的目标。

另外一种方法,我可以通过使用Dockerbuild来定义和控制我的build,获得更多面向Docker的经验。代码如下:

使用Dokcer来控制build有若干好处。可以使用以前编译好的image,Dockerfilebuilds使用缓存方法,使得编译工作只重复最小的步骤(假设有一个很棒的Dockerfile)。最后,这些builds生成的images也可以跟其他开发者共享。

这个案例中,我使用golang资源库中的onbuildimage作为基础。其中包括一些很棒的下载依赖包逻辑。这个方法会生成可以方便用于其他非生产环境的Dockerimage。这个方法对于生产级别的image的问题在于,必须有步骤避免大image并且包括某些初始化脚本,用于启动和监控服务前验证状态。

有意思的是,Docker使用一系列脚本,Makefiles和Dockerfiles。build系统相对很健壮了,负责各种游戏测试,linting等,以及各种操作系统和架构的artifacts。本场景中,容器是用来产生二进制的工具,然而是从一个本地build image中实现的。

扩充Docker build的选项,可以使用Compose来定义一整套开发环境。

Compose负责环境管理。如果觉得系统非常干净并不奇怪,Compose把所有事情都联系起来,优化卷管理,当images缺失时自动build,汇总日志输出。我之所以选这些开关是为了简化服务依赖,也因为它能生成我需要的artifacts。

这个示例是一个运行时容器,Compose或者Docker都有合适的工具做到这点。此场景中,也可能更需要一个分布式image,或者可能希望build可以为本机产生一个二进制文件。

如果期望获得想要的image,必须确保源码或者预编译库在build时候嵌入image中。build时候没有挂载卷,也即需要每次重复时都要重建image。

如果希望在容器内部产生某些artifacts,则需要引入挂载卷。使用Docker命令行或者Compose环境可以很容易实现。但是要注意,除非容器在运行,否则build并不工作,也就意味着不能只用dockerbuild。

汇总

目前没有Docker方式创建开发环境。Docker是一个可编排工具,不只是圣书。与其使用别人已有的dockerbuild系统,不如花一定时间学习此工具,明确自己的需求,然后创建适合自己的Docker环境。

到此这篇关于快速掌握使用Docker搭建开发环境的文章就介绍到这了,更多相关Docker搭建开发环境内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用Docker快速搭建Oracle开发环境的方法教程

    前言 oracle太大了,对于开发人员来说,在本机安装一个oracle代价不菲. 在docker环境中,我找了很久,发现wnameless/oracle-xe-11g 镜像还不错,很方便搭建起来. 但是也发现一个问题,挂载本地卷遇到了麻烦.一旦挂载,就无法登陆了.从官方的issues中发现,有一个fork版本解决了这个问题,记录一下. 创建docker-compose工作目录 mkdir -p oracle/data cd oracle touch docker-compose.yml 配置do

  • 详解MAC OSX Docker开发环境搭建

    MAC OSX  Docker 开发环境搭建 1. 安装Virtualbox 下载地址:https://www.virtualbox.org/ VirtualBox简体中文版下载安装(图解教程)http://www.jb51.net/article/95311.htm 2. 安装boot2docker $ brew install boot2docker # 也可以手工安装: $ curl https://raw.github.com/steeve/boot2docker/master/boot

  • Docker搭建自己的PHP开发环境

    1. 前言 1.1 为什么要用Docker ? 是否有这样的场景,你搞了一个项目,在本地开发时需要搭建环境,放到线上时也需要搭建环境,到公司想暗戳戳玩一下要搭建环境,不搭还不行,因为你的环境依赖还挺多.这个时候如果有了Docker,只需要在机器上装个Docker,放上写好的Dockerfile,一行命令就自动完成这个事,方便又高效,岂不是很爽? 1.2 准备 接下来,本文介绍如何搭建一个PHP的开发环境,将用 zPhal-dockerfiles 做为例子,这是我为我的博客系统准备的一套Docke

  • Ubuntu 搭建基于Docker的LNMP+Redis的开发环境(图文)

    Ubuntu 搭建基于Docker的LNMP+Redis的开发环境 服务器环境:Ubuntu 14.04 1.安装Docker 1.1 执行update命令,和服务器同步软件包,执行apt-get install * 时可以下载最新的软件. 1.2 安装Docker和创建软链接   1.3 启用Docker服务 2. 获取搭建环境所需镜像 2.1 MySQL镜像 2.2 Redis镜像   2.3 nginx-php-fpm镜像 2.4 查看已下载的镜像 对于Docker初学者来说,可以使用现有

  • 利用docker-compose搭建AspNetCore开发环境

    使用docker-compose搭建AspNetCore开发环境 1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上监听一个端口就可以了,不污染主机.再组合各Web程序.Redis/Memcached.SqlServerOnLinux. 新建一个目录sites,所有和集群相关的都放在这里,目录结构如下所示 sites     nginx      

  • 搭建基于Docker的PHP开发环境的详细教程

    现在很多开发者都使用Vagrant来管理他们的虚拟机开发环境,Vagrant确实很酷, 不过也有不少缺点(最主要的是它占用太多的资源).在容器技术.Docker和更多类Docker技术出现后,解决这个问题就变得简单了. 免责声明 由于boot2docker的工作方式,本文所述的方法在你的环境中可能无法正常运行.如果需要在非Linux环境下共享文件夹到Docker容器,还需要注意更多额外的细节.后续我会写篇文章专门来介绍实际遇到的问题. 怎样才算是好的开发环境 首先,我们得知道什么才是好的开发环境

  • PyCharm使用Docker镜像搭建Python开发环境

    在我们平时使用PyCharm的过程中,一般都是连接本地的Python环境进行开发,但是如果是离线的环境呢?这样就不好搭建Python开发环境,因为第三方模块的依赖复杂,不好通过离线安装包的方式安装.本文将介绍如何利用PyCharm来连接Docker镜像,从而搭建Python开发环境. 首先,我们需要准备一下工具: PyCharm专业版 Docker 我们用一个示例项目来演示在PyCharm中如何利用Docker镜像搭建Python开发环境.项目的截图如下: 注意到,在该项目中还没有设置Pytho

  • 快速掌握使用Docker搭建开发环境

    随着平台的不断壮大,项目的研发对于开发人员而言,对于外部各类环境的依赖逐渐增加,特别是针对基础服务的依赖.这些现象导致开发人员常常是为了简单从而直接使用公有的基础组件进行协同开发,在出现并行开发的情况特别是针对数据库的变动或数据的更改常常会导致其他开发人员无辜增加问题的排查时间,导致整体的开发效率降低,同时对于远程协助也造成了巨大的障碍.为了解决上述存在的问题,将会利用Docker Compose技术辅助开发人员对于开发环境的搭建,最终实现开发人员只要装有Docker就可以完成整个开发环境的搭建

  • React Native 搭建开发环境的方法步骤

    本文介绍了React Native 搭建开发环境,分享给大家,具体如下: 准备工作 node -v:确认是否安装Node,若已经成功安装了,则执行下面的命令:否则先进行Node的安装. npm install -g create-react-native-app:使用npm快速创建React Native应用. create-react-native-app AwesomeProject:创建名为AwesomeProject的项目. cd AwesomeProject:进入项目所在文件目录. y

  • 使用Docker构建开发环境的方法步骤( Windows和mac)

    目录 1. 使用 Docker 的好处 2. 安装 Docker 1) Linux 安装 Docker 2) Windows 10 3) macOS 3. Docker 换源 1) Linux 换源 2) Windows 和 Mac 换源 4. 编写 Dockerfile 5. 编写 docker-compose.yml 6. 启动容器 7. 总结 我们在开发中都会遇到这样的问题:在本地开发好功能后,部署到服务器,或者其他人拉到本地接着开发时,会出现功能无法使用的情况. 这些异常情况,大多数时候

  • docker搭建fastdfs环境的方法步骤

    fastdfs是一个开源的分布式文件系统,在实际使用中,通过源码编译安装过程非常复杂,但是通过docker快速构建却非常容易.下面介绍通过docker安装fastdfs的方法. docker镜像的选择也挺重要的,我最开始选择season/fastdfs,发现有些麻烦,有的版本好像带nginx比如1.2,有的版本又不带nginx比如latest.我使用season/fastdfs镜像安装没有成功过,但是使用delron/fastdfs镜像就成功了,而且只需要启动两个容器,一个tracker,一个s

  • AngularJS整合Springmvc、Spring、Mybatis搭建开发环境

    最近想学习AngularJS的使用,网上搜了一圈后,折腾了半天解决bug后,成功使用AngularJS整合Springmvc.Spring.Mybatis搭建了一个开发环境.(这里Spring使用的版本是4.0.6,Mybatis版本是3.2.5,AngularJS的版本是1.0.3) 第一步:创建一Maven项目,在pom.xml下添加需要的包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="

  • Python自动化测试Eclipse+Pydev 搭建开发环境

    Python自动化测试 Eclipse+Pydev 搭建开发环境 C#之所以容易让人感兴趣,是因为安装完Visual Studio, 就可以很简单的直接写程序了,不需要做如何配置. 对新手来说,这是非常好的"初体验", 会激发初学者的自信和兴趣. 而有些语言的开发环境的配置非常麻烦, 这让新手有挫败感,没有好的"初体验",可能会对这门语言心存敬畏, 而失去兴趣. 作为一个.NET程序员, 用惯了Visual Studio.  Visual Studio的强大功能,比

  • 详解mac下通过docker搭建LEMP环境

    在mac下通过docker搭建LEMP环境境 1.安装virtualbox.由于docker是在lxc环境的容器 2.安装boot2docker,用于与docker客户端通讯 > brew update > brew install docker > brew install boot2docker 3.初始化boot2docker,也就是在virtualbox上安装一个docker的host环境 boot2docker init 此时会下载一个镜像 4.启动虚拟机host :~$ bo

  • windows下安装QT及visual studio 2017搭建开发环境

    1.环境搭建 这里并不是说qt必须要和visual studio结合使用,不过用习惯了visual studio开发,继续使用可节省开发时间,并大大提供便利性. 关于安装过程这里不再详细赘述,软件下载链接如下: visual studio:https://www.visualstudio.com/zh-hans/downloads/ QT:http://download.qt.io/archive/qt/(这里推荐安装最新的,原因是vs2017不支持一些老版本的makefile文件生成,这个在文

  • Electron整合React使用搭建开发环境的步骤详解

    简介 用于构建用户界面的 JavaScript 库 步骤 首先创建React npx create-react-app doc 进入到doc项目 cd doc 安装electron npm install electron --save-dev 安装依赖 判断是否为生产环境 cnpm install electron-is-dev --save-dev 在项目根目录创建main.js const { app ,BrowserWindow } = require('electron') const

  • Maven 搭建开发环境

    Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装 JDK. 系统要求 项目 要求 JDK Maven 3.3 要求 JDK 1.7 或以上 Maven 3.2 要求 JDK 1.6 或以上 Maven 3.0/3.1 要求 JDK 1.5 或以上 内存 没有最低要求 磁盘 Maven 自身安装需要大约 10 MB 空间.除此之外,额外的磁盘空间将用于你的本地 Maven 仓库.你本地仓库的大小取决于使用情况,但预期至少 500 MB 操作系统 没有最低 检查 Java 安装

随机推荐