写点什么

使用 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:003884

评论

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

关于智能编码助手【通义灵码】,开发者们这么说...

阿里巴巴云原生

阿里云 云原生 通义灵码

RPA的九大主要特征:全面优化业务流程的利器

八爪鱼采集器︱RPA机器人

RPA 自动化 RPAxAI

稳健前行,合规筑基:哈银消费金融在变革中引领稳健增长新篇章

极客天地

SQLAlchemy 在 Python 中的同步与异步操作及CRUD实现指南

代码忍者

新时代下,作为IT 管理员的我们如何快速构建一个安全高效的IT 体系

coxi_vv

1Panel 运维效率

Go 语言异常处理

FunTester

行业智能化的“火车头效应”,由星河AI金融网络启动

脑极体

AI 网络 通信

PPT时间轴怎么画?用这款AI工具自动生成,告别手绘!

职场工具箱

职场 PPT 绘图工具 时间轴制作软件 AI生成PPT

聚伙伴,创价值,享未来——2024年锐科信息赋能伙伴加速智能化沙龙活动圆满举行

叶落便知秋

哈银消费金融:深耕消保与风控 稳健展现发展潜力

极客天地

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

不在线第一只蜗牛

数业智能心大陆:用AI关怀青少年心理健康

心大陆多智能体

智能体 AI大模型 心理健康 数字心理

解锁未来财富密码:AI自动化副业创收班——终身财富加速器

霍格沃兹测试开发学社

关于 API 你应该知道的一切

幂简集成

API

GitHub星标破万!Python学习教程(超详细),真的太强了!

我再BUG界嘎嘎乱杀

Python 编程 后端 开发语言 学习教程

软件测试岗位的经典面试题

老张

软件测试 面试题 职场成长 面试求职

云原生与AI融合持续深化,华为推动全球智能化新浪潮

新消费日报

MES系统如何支持多品种小批量生产

万界星空科技

工业互联网 制造业 生产管理系统 mes 万界星空科技

关于智能编码助手【通义灵码】,开发者们这么说...

阿里云云效

阿里云 云原生 通义灵码

统一多层网关好处多,阿里云云原生 API 网关打造全能型网关

阿里巴巴云原生

阿里云 云原生 云原生API

元宇宙虚拟展厅是如何制作、配置和维护的?

3DCAT实时渲染

云展厅 元宇宙开发 元宇宙解决方案 元宇宙线上虚拟展厅

中移动集团SRE人员能力提升培训圆满结课

雅菲奥朗

DevOps 运维 SRE SRE培训 SRE认证

无人驾驶,并非无人之地

自象限

人工智能 自动驾驶 AI

公司最大的内卷,偷偷做单元测试

禅道项目管理

项目管理 程序员 软件测试 单元测试 测试人员

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