Docker容器化开发流程(一)介绍
文章目录
- 目标
- 容器化开发模式
- 生产环境使用docker 的问题
- 容器化流程
目标
- 了解容器化开发模式
- 了解容器化开发流程
参考: Docker技术入门与实战 第二版 书籍
[认识容器](https://snailclimb.gitee.io/javaguide/#/docs/tools/Docker)
Docker 从入门到实践
以下多引用于Docker技术入门与实战 第二版这本书籍
容器化开发模式
传统开发流程
传统模式中,开发团队在开发环境中完成软件开发,本地完成单元测试,测试通过,则可提交到代码版本管理库;测试团队打包进行进一步测试。运维团队把应用部署到测试环境,开发团队或测试团队再次进行测试,没问题后通知部署人员发布到生产环境。在上述过程中涉及三个环境:开发、测试和生产,以及三个团队:开 发、测试、运维。多个环境和多个团队之间的这种交互,很容易出现彼此环境不一致的情况,浪费不必要的人力物力。
在之前的工作流程中,基本可以分为测试环境和线上环境两种。
开发阶段:一般是本公司的服务器提供测试环境,测试环境提供关系型数据库或者是nosql数据库环境支持,开发人员本地使用本机的jdk和tomcat开发和测试。
测试阶段:开发人员将项目部署到测试环境下,在测试环境中安装jdk和tomcat部署运行项目,供测试人员测试
线上阶段:通常要把各种服务(比如nginx,mysql,jdk,tomcat,redis等等),安装到由客户提供的线上环境中,再部署和运行项目。
出现的问题:测试环境和线上环境会存在差异,本来在测试环境项目好好的,到线上环境后项目就不能正常运行。这是真实存在的,何况在客户提供的服务器,线上可能还运行着很多服务,很多时候不能快速定位项目为什么会运行报错,也不能擅自修改某些服务配置。或者本身的测试环境可能是windows,但是现在换成了linux。
想要解决的问题:使用容器化的技术,docker来解决环境不一致的情况
容器化开发流程
在容器化的应用中,项目架构师和开发人员的作用贯穿整个开发、测 试、生产三个环节。 项目伊始,架构师根据项目预期创建好需要的基础 base 镜像,nginx、tomcat、mysql镜像或者将 Dockerfile 分发给所有开发人员,所有开发人员根据 Dockerfile 创建的容器或者从内部仓库下载的镜像进行开发,达到开发环境的充分一致。若开发过程中需要添加新的软件,只需要向架构师申请修改基础 base 镜像的 Dockerfile即可。 开发任务结束后,架构师调整 Dockerfile或者Docker 镜像,然后分发给测试部门,测试部门马上就可以进行测试,消除了部署困难等难缠的问题。
注意事项
首先,在开发和测试环境中,推荐使用- v 共享文件夹来存储开发人员的
程序代码,避免频繁打包操作。
其次,利用基础 base 镜像的继承特性来调整镜像的轻微变更。例如当需
要测试程序对不同版本 JDK 的支持情况时,只需改变 base 镜像的 JDK 设置,然
后其他依赖它的镜像在重新创建的过程中就可以自动完成更新。
最后,测试部门应当注意 Docker 以及镜像的版本,并经常对部署后的应
用程序进行性能上的测试。
生产环境使用docker 的问题
如果Docker 出现不可控的风险,是否考虑了备选的解决方案;是否需要对 Docker 容器做资源限制,以及如何限制,如CPU、内存、网
络、磁盘等;目前,Docker对容器的安全管理做得不够完善,在应用到生产环境之前
可以使用第三方工具来加强容器的安全管理。如使用 apparmor 对容器的能力进行限制、使用更加严格的 iptable 规则、禁止 root 用户登录、限制普通用户权限以及做好系统日志的记录;
容器化流程
基于上面提供的内容,我们来尝试搭建一下这种方案。
每一步会单独写一个文档,来学习和了解这种方式
第一步:指定基础的dockerfile文件,搭建基础镜像。
目标: * 了解dockerfile 的文件指令 * 了解如果创建镜像假设我们的项目是spring boot 工程,需要连接mysql 和 redis 数据库,假定测试环境是linux 环境,通过 nginx 代理,将请求分发到两个tomcat上,也就是说通过两个tomcat 提供服务,那我们需要创建以下这些镜像文件:jdk+tomcat 一个镜像 nginx 一个镜像 mysql 一个镜像 redis 一个镜像这里有一个疑问 为什么不把所有服务,都封装成一个镜像,这跟我们之前安装服务有区别吗? 将多个应用服务解耦到不同容器中,保证了容器的横向扩展和复用。 应该保证在一个容器中只运行一个进程。 尽量让每个镜像的用途都比较集中、单一,避免构造大 而复杂、多功能的镜像;复杂镜像会让后期的维护和修改难以进行。 容器应该是短暂的: 通过 Dockerfile 构建的镜像所启动的容器应该尽可能短暂(生命周期短)。「短暂」意味着可以停止和销毁容器,并且创建一个新容器并部署好所需的设置和配置工作量应该是极小的。如果创建一个包含很多服务的镜像,在容器启动和配置方面是很复杂的。 使用docker来配置和启动服务会更加方便。参考:https://yeasy.gitbooks.io/docker_practice/introduction/why.html
第二步:搭建私有docker register (仓库)
目标: * 了解如何搭建私有docker 仓库通常公司的环境都是内网的,开发人员和测试人员是连接不上docker hub 的,就算制定好了镜像,发布到 docker hub 上也是pull不下来的。更何况有时候并不想将配置好的镜像发布到公网上面。 所以,需要搭建私有的docker仓库,将基础镜像上传到私有docker仓库供其他人下载使用。
第三步:在测试环境 pull 镜像,将容器启动起来,开发人员在本地开始开发项目。
目标:* 了解容器间的互联和端口映射这里会涉及到容器间的互联和宿主机与容器的端口映射
第四步:将项目提交至测试环境运行测试,并将测试环境同步到线上环境
目标: * 通过修改基础镜像,将镜像部署到线上环境,运行项目
Docker容器化开发流程(一)介绍相关推荐
- Docker容器化开发
目录 1.初识Docker 1.1.Docker概念 1.2.安装Docker 1.3.docker架构 3.docker命令 3.1.进程相关命令 3.2.镜像相关命令 3.3.容器相关命令 4.D ...
- 如何在开发和生产环境中使用 Docker 容器化 Golang 应用
你是否想写一个使用 Docker 容器化的 Golang 应用程序?本文的目的就是帮助你快速将你的 Golang 应用程序容器化,以用于 开发 (带热加载)和 生产 目的. 开始之前 请先安装 Doc ...
- 悟空CRM11.0 PHP版本docker容器化部署全流程
由于本地服务器为PHP5.3,项目部署需要PHP >= 7.0.*,所以选择docker容器化部署,服务器系统为centos7.3,所有的sql文件都在项目路径 public/sql下 目录 一 ...
- Docker容器化技术教程,24小时快速入门
Docker介绍 Docker简介和安装 Docker是什么 为什么使用Docker 和普通虚拟机的对比 打包.分发.部署 小结 Docker部署的优势 Docker通常用来做什么 重要概念:镜像.容 ...
- 微软发布 VS Code 容器化开发工具,大大简化物联网设备开发
近日(北京时间 2019 年 7 月 9 日),微软宣布了 Azure IoT Tools for VS Code 的全新功能:通过在容器中封装编译器.设备 SDK 以及基本库,大大简化了设备交叉编译 ...
- 通过 Azure Pipelines 实现持续集成之docker容器化
Intro Azure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的好消息,在 Github 的 Marketplace 里有个 Azure Pipel ...
- Docker 容器化部署
文章目录 思维导图 概念 安装(基于 centos7) 结构 Docker 命令 进程(daemon)相关命令 镜像(image)相关命令 容器(container))相关命令 数据卷 数据卷容器 d ...
- Docker容器化部署config-server无法直接访问
Docker容器化部署config-server无法直接访问 1. 本机ip启动方式: 2. Docker容器启动 1)问题 2)解决办法 - 本机启动 - 服务器启动俩种方式 3. dockerfi ...
- Azure 物联网开发者体验 7 月更新:边缘计算开发工具,ARM64 设备开发,VS Code 容器化开发工具...
欢迎来到 Azure 物联网开发者体验的 7 月更新! 在本次发布中,微软为物联网开发人员提供了许多新的功能和改进! 物联网边缘计算开发工具正式发布 Azure IoT Edge 于 2017 年发布 ...
最新文章
- 这 10 个简单的面试题,却隐藏大坑,大厂的套路防不胜防
- Intel Realsense C/C++ 转 python (9)rs-multicam 多摄像头可视化窗体显示
- Web群集与日志管理Haproxy搭建
- ASP.NET Core分布式项目实战(Consent 确认逻辑实现)--学习笔记
- iphonex如何关机_iPhoneX怎么关机 iPhoneX如何强制重启【详细步骤】
- mysql创建触发器的权限_MYSQL设置触发器权限问题的解决方法
- 当 Python 中混进一只薛定谔的猫……
- c# 指定打开某个路径下的CMD_Node.js 环境在 Windows 系统下安装与搭建教程
- 判断一个数字是整数还是小数
- ndows 内存诊断工具,Windows自带内存诊断工具来帮你检测电脑内存的稳定
- STM32 - L4系列芯片手册: 总线架构
- 运算放大器stb仿真与闭环增益备忘
- ICS-GNN:Lightweight Interactive Community Search via Graph Neural Network
- SpringCloud Gateway报500 Invalid host: lb://xxx
- 如何替换一个Linux内核函数的实现-热补丁原理
- 【影像学基本知识】MR----T1,T2
- 女博士5天被骗85万!如果网络骗子遇到的是程序员……
- 关于手机功能NFC(以华为V9为例)
- java实现qlearning,DQN(Deep Q-learning)入门教程(一)之强化学习介绍
- java刻画三角形和梯形和圆形,三角形、梯形和圆形的类封装.doc
热门文章
- XDOS DAS Call WIS NET F6 (HELP)- WIS Is Not Available Solution
- 【Python图形绘制】使用turtle库实现美国队长盾牌
- Hive Serde
- 015 Django 云笔记项目(可以略过)
- 腾讯“立知”被疑抄袭“即刻”
- 5G LTE窄带物联网(NB-IoT)8
- CSDN积极响应网信办“知识社区问答”行为规范管理,共筑健康网络空间
- win8/win8.1提示在关闭了用户控制的情况下 无法打开这个应用
- 三分建设,七分运营|用现代化安全运营应对数据安全风险
- Win10右键菜单没有新建选项怎么解决?