写点什么

使用 Docker 高效搭建开发环境

  • 2019-11-25
  • 本文字数:2128 字

    阅读完需:约 7 分钟

使用Docker高效搭建开发环境

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


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


同时,我也是有一些相对的小洁癖,很喜欢 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;


队列用过 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 结束语

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


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/6L4laPwKxeie-kRFenBfMg


2019-11-25 16:004124

评论

发布
暂无评论
发现更多内容

filter、interceptor、aspect不知如何选择,移动应用开发案例教程

android 程序员 移动开发

FART:ART环境下基于主动调用的自动化脱壳方案,androidndk开发教程

android 程序员 移动开发

Flutter Android 端 FlutterInjector 及依赖流程源码分析

android 程序员 移动开发

BroadcastReceiver官方概览,【面试总结

android 程序员 移动开发

ConstraintLayout 1,flutterrow换行

android 程序员 移动开发

JMH实践记录

Clarke

JMH性能基准测试

Coroutine 基本原理,Android开发大佬的百度美团快手等大厂Offer收割之旅

android 程序员 移动开发

Dart _ 什么是Stream,安卓开发不得不会

android 程序员 移动开发

Flutter Android 工程结构及应用层编译源码深入分析,Android面试题及答案2020

android 程序员 移动开发

下一代信息技术论坛云操作系统介绍

架构 操作系统

BroadcastReceiver源码分析,一线互联网大厂中高级Android面试真题收录

android 程序员 移动开发

Chameleon跨端框架——壹个理想主义团队的开源作品,旧版android模拟器

android 程序员 移动开发

如何打造实时性的弹窗?

神策技术社区

UI sdk Android;

BAT资深面试官-带你破解Android高级面试,渣本逆袭大厂面经分享

android 程序员 移动开发

Context那些你不知道的事?,张口就来

android 程序员 移动开发

EventBus核心原理其实保存这三张图就可以弄懂了,收藏一下

android 程序员 移动开发

ConstraintLayout 2,android双击事件响应

android 程序员 移动开发

Dart 层如何 兼容 Android 和iOS平台特性 (1),Android开发面试技巧

android 程序员 移动开发

DialogFragment探索与实现,音视频编解码技术

android 程序员 移动开发

ButterKnife被弃用,ViewBinding才是findView的未来?,秀出天际

android 程序员 移动开发

ByteDance张一鸣:抖音很多年轻人,出色的都有这些闪光点

android 程序员 移动开发

BAT面试有关散列(哈希)表的面试题详解,flutter图片压缩上传

android 程序员 移动开发

ConstrainLayout 基础教程2,2021Android精选面试实战总结整理

android 程序员 移动开发

BAT常见Android面试20题详解,985研究生入职电网6个月

android 程序员 移动开发

(完整版)直播回顾:2021 MAXP 无服务器赛题讲解

亚马逊云科技 (Amazon Web Services)

人工智能 云计算 创新大赛

Butterknife源码分析,android开发环境搭建实验报告

android 程序员 移动开发

Dart Flutter 1,flutter页面跳转动画

android 程序员 移动开发

DateUtils(一个日期工具类),androidauto百度地图

android 程序员 移动开发

Flutter Candies 一桶天下,kotlin编程软件

android 程序员 移动开发

Base64 的原理、实现及应用,面试字节跳动Android工程师该怎么准备

android 程序员 移动开发

BAT同系列公司面试总结,哪些你所不知道的,学习android的好书

android 程序员 移动开发

使用Docker高效搭建开发环境_文化 & 方法_OpsDev 李钢_InfoQ精选文章