Py学习  »  docker

使用Docker高效搭建开发环境

HULK一线技术杂谈 • 5 年前 • 470 次点击  

女主宣言

Docker 作为轻量级的基于容器的解决方案,它对系统侵入性低,容易移植,天生就适合做复杂业务部署和开发环境搭建,今天给大家带来的是我司开发是如何使用 Docker 高效搭建开发环境的。本文最先发布于 OpsDev,转载已获取作者授权。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

前言

作为一个平时喜欢折腾的开发人员,我喜欢尝试各种环境,使用感兴趣的各种开源软件。


同时,我也是有一些相对的小洁癖,很喜欢Linux中权限最小化原则,我也不喜欢自己的环境中有太多不知道的东西。


做了多年的Web开发,我接触到的环境大致如下:


  1. 操作系统从CentOS 5到CentOS 7;

  2. Web server从apache到Nginx;

  3. 开发语言从最初的php5.2到php7,又到现在主要使用Go,马上还会开始接触C++;

  4. 数据库从Mysql5.1到现在的5.7,前阵子又开始折腾mariadb;

  5. cache选型从memcache到redis;

  6. 队列用过kafka,去年开始大量使用NSQ;


公司虽然有专门负责部署、运维这些服务的同学,但我在开发的时候,还是喜欢自己来搭建这些东西,因为这样通常可以对使用到的服务有更多的认识,也能帮助自己使用的更好。


今天我就来和大家分享下我是如何高效的搭建好自己的开发环境的。


1

搭建前说明

这里先说明一点,对每个开源软件,我几乎都是自己编译部署的,而不会使用类似yum install这种方式,也很少直接下载官方编译好的二进制包,这都是为了能多深入了解用到的开源软件。


但一些依赖的动态库文件,如zlib等,还有编译工具,如gcc、make等,我都是通过方便的yum install这种方式直接安装的,否则会累死。


2

传统做法

我在很长的一段时间内,都是把每个软件的编译、安装过程写成一个脚本,之后再需要用的时候直接运行脚本即可,但这样的方式,通常会遇到下面这些问题:


  1. 脚本只能在我当时的操作系统环境下运行。记得当时购买过不同服务商的vps,虽然不同vps我都使用同样的Linux发行版,但脚本通常都不能一键跑完。这也是没办法,因为每个vps服务商都会制作自己的操作系统镜像版本。

  2. 操作系统升级,如CentOS5 - 6,或是换为Ubuntu,这样基本上脚本都跑不了。

  3. 软件升级,如Mysql5.2 - 5.6,构建工具改为cmake,依赖库改变或升级。

  4. 如果某个软件依赖的公共库版本和其它软件不同,且公共库升级后和旧版不兼容,那你就只能为这个软件单独编译公共库了,如果只是普通的公共库还好,但如果是所需要的编译工具版本不同,那可就惨了。


上面这些问题,如果你想每个发行版维护一个脚本,那会累死,因为一旦你每次想升级一个软件,难道每个发行版都要编译一遍吗?这就变成了收获价值很低的体力劳动了。


由于喜欢折腾的个性,我对操作系统的升级以及软件包版本的升级又经常发生,所以一直以来,我都在寻找一个好方法,能很方便的维护好自己的开发环境,尽量做到只=新东西只为它工作一次,最后我找到了docker,目前我都是用它来搭建自己的开发环境的。


3

Docker做法

先概括介绍下我的方法:


  1. 让每个软件运行在容器中,因为运行的容器环境是可以固定下来的,所以编译安装脚本写一个就可以了。

  2. 代码使用数据卷的方式加载到需要的容器中。

  3. 因为是开发环境,所以网络方面使用最简单的--net=host。

  4. 将镜像的创建、容器的启动维护在git项目中,并抽象出统一的构建过程,很方面的做到新软件接入,新机器部署。


下面用实例来说明吧:


示例Nginx环境构建


我将构建过程放到git中:

https://gitee.com/andals/docker-nginx


Readme中记录了构建所需要执行的脚本命令,大家访问上面的网址就可以看到,这里我简单介绍下项目的结构:


DockerFile说明


Dockerfile结构如下:


整个构建框架为:


  1. 把构建需要的包(pkg目录中)放到镜像中;

  2. 把构建脚本放到镜像中;

  3. 执行构建脚本;

  4. 容器启动时,执行init.sh,里面启动相应的服务。


Readme.md中记录了执行构建的命令和容器运行命令,示例运行如下:

说明:

  • --volumes-from=data-home这个就是我放置代码的数据卷,我喜欢把代码放到$HOME下面;

  • /data/Nginx中放置Nginx的conf、log等,每个软件运行时的conf、log、data等我都统一放置在/data下面;

  • 启动容器时使用--net=host,作为开发环境简单实用;

  • 我就是通过这种方法完成了开发环境的构建,不再有多余的重复工作,并且新机器部署开发环境效率极高。


4

辅助工具dockerbox

使用docker环境后,有个问题,就是没有办法很方便的和软件交互。


这是因为软件都执行在容器中,比如重启Nginx吧,需要下面这几步:

  1. 找到Nginx这个容器;

  2. 进入Nginx这个容器;

  3. 在容器里面再执行reload.


也可以是:

  1. 找到Nginx这个容器;

  2. 使用docker exec.


但无论哪种方式,都比原先直接执行命令麻烦的多。


另外,有时也需要进入容器中,查看服务的运行情况。


为了方便的做这些事情,我开发了一个工具dockerbox,可以很方便的做到这些事情。


dockerbox的详情及使用方法请见:

https://github.com/ligang1109/dockerbox


5

配置开机运行

最后再说下如何配置开机启动。


我使用虚拟机搭建的开发环境,所以配置这个会省事好多,

dbox请参考dockerbox的使用方法。


6

结束语

上面说的是我现在使用的开发环境搭建方法,有兴趣爱折腾的同学不妨试试看,如果你有更好的方法,也希望能分享给我。


生命不息,折腾不止:-D

HULK一线技术杂谈

由360云平台团队打造的技术分享公众号,内容涉及云计算数据库大数据监控泛前端自动化测试等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/rS3QRQbe9P
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/11109
 
470 次点击