女主宣言

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

使用Docker高效搭建开发环境相关推荐

  1. 深入浅出Docker(五):基于Fig搭建开发环境

    本文原创版权归 infoq 肖德时 所有,此处为技术收藏,如有再转,请于篇头保留原创作者及出处,以示尊重! 作者: 肖德时 原文: http://www.infoq.com/cn/articles/d ...

  2. Android群英传神兵利器读书笔记——第一章:程序员小窝——搭建高效的开发环境

    Android群英传神兵利器读书笔记--第一章:程序员小窝--搭建高效的开发环境 目录 1.1 搭建高效的开发环境之操作系统 1.2 搭建开发环境之高效配置 基本环境配置 基本开发工具 1.3 搭建程 ...

  3. 《iOS 8开发指南(第2版)》——第1章,第1.3节工欲善其事,必先利其器——搭建开发环境...

    本节书摘来自异步社区<iOS 8开发指南(第2版)>一书中的第1章,第1.1节1.3 工欲善其事,必先利其器--搭建开发环境,作者 管蕾,更多章节内容可以访问云栖社区"异步社区& ...

  4. ecology9 后端开发环境搭建_利用Vagrant快速搭建开发环境

    Docker大家应该都了解吧,一个非常方便的技术,可以让我们随时随地部署应用.但是部署应用虽然方便了,开发环境的搭建还是那样的,要自己安装一大堆软件.那么有没有类似的工具可以方便我们呢?这就是本文要的 ...

  5. [精简]RuoYi开发实战-搭建开发环境

    文章目录 简介 说明 RuoYi环境准备 JDK 安装docker mysql安装 redis 6.2安装 下载源码 数据库初始化 Redis配置 数据源配置 Logback报错解决 测试后端是否启动 ...

  6. 2021-05-31 - Laravel - 搭建开发环境 - 学习/实践

    1.应用场景 主要用于快速安装Laravel开发环境,比如Laravel Sail, Laradock或者使用Laravel[PHP]自带的Web Server进行开发,或者学习/练习-- 2.学习/ ...

  7. 仿掘金社区全栈项目开发(一)-搭建开发环境

    整个项目的技术栈 搭建开发环境 linux操作系统 我是直接买的阿里云服务器,没有用虚拟机. 常用linux命令 查看linux系统 lsb_release -a 查看操作系统的信息 uname -a ...

  8. 直接用现成的docker镜像创建开发环境

    在Docker Hub 上直接搜索搭建好的开发环境,然后把本地代码mount到docker, 不把时间浪费在搭建开发环境上. mount本地代码可参考建立基于docker的编译环境 - 云梦泽渔夫 - ...

  9. Linux/Mac/Windows - 搭建开发环境的变化记录

    1.应用场景 主要是记录和回顾个人 Windows / Linux / Mac下搭建开发环境的变化,同时参考搭建部署生产环境[Linux]. 2.学习/操作 1. 文档 设置 Linux/Mac 本地 ...

最新文章

  1. JSF实现“Hello World!”
  2. python多程优化_Python 基本功: 13. 多线程运算提速
  3. [ARM-Linux]Linux-MATLAB安装
  4. textview多行ellipsize=end不显示省略号的解决方法(一)
  5. 存储器块清零c语言版,存储器块清零实验报告
  6. 将内容引用到其他栏目
  7. GitHub推出“AI程序员”插件 !
  8. javascript 键值keyCode
  9. 一些php+mysql的开源网上商城
  10. python的基础是java_Python基础学习
  11. YDOOK:VSC VisioStudio Code 设置 鼠标滚轮缩放字体大小 滚轮控制字体放大缩小
  12. H.265视频编码原理总结
  13. 助力金融科技产业发展 360金融AI之夜成功举办
  14. B站 bilibili 视频、分区、up主数据合集
  15. 重要!SpringBoot一个非常蛋疼的无法启动的问题解决
  16. R语言基础入门(全)
  17. 人工智能期末复习——速通知识点
  18. Animation动画效果
  19. 医学影像数据格式转换(.mha转.jpg)
  20. 近期风靡互联网的Deep Dream人工智能图像识别软件

热门文章

  1. Linux下设置普通用户使用sudo命令
  2. Eclipse提速优化方法
  3. 设计模式之不简单的工厂模式(二)
  4. linux系统软件包依赖关系,Ubuntu解决包依赖关系
  5. java mq发送sdk_【转载】java实现rabbitmq消息的发送接受
  6. opencv颜色识别_opencv-python污水颜色识别
  7. 12月13日云栖精选夜读 | 干货 :5个提醒,让你远离“数据呆”
  8. 【Processing日常2】群星1
  9. 同步I/O 和 异步I/O
  10. 批量生成10个虚拟主机配置