开篇

提起Docker,有很多人第一印象会认为它就是一个虚拟化容器,所以大家特别容易陷入到一种误区,就是觉得Docker只是在Linux操作系统之上又增加了一层,就跟OS上跑了一个VMWare一样。Docker一定变得又慢又复杂。还不如原生安装的服务看起来舒服。

实际上这是误区,Docker管理的各种服务,都是操作系统原生的进程,并不是一个虚拟化产物,它的正确定义是应用容器引擎。

那怎么去理解这个应用容器引擎呢?就要说说Docker的核心原理了——其中主要机制之一,通过Linux的namespace机制实现了资源隔离,这个资源隔离就包括了:

  1. UTS,对主机名和域名的隔离
  2. IPC,对信号量、消息队列和共享内存的隔离
  3. PID,对进程编号的隔离
  4. Network,对网络设备、网络协议栈、网络端口对隔离
  5. Mount,对挂载点(文件系统)的隔离
  6. User,对用户和用户组的隔离。

这些隔离机制都是Linux内核的namespace机制实现,也是Docker容器设计的精髓。

就好像原来是一个300平米的大house,就住着一家人,卧室、厨房、卫生间这一家人独享。可是房子太大完全可以住三个家庭,不仅能公摊一部分费用,还能为主家带来额外的收益。那么就要对这个大house重新进行规划设计,满足三个家庭的需要,制定一些生活制度,有些资源是可以共享的,但关键资源就必须隔离开,保护隐私嘛!其实大家说到底还是在一个大房子内平等的生活。

用了这个比喻其实就是告诉大家,你就把Docker理解为一个房子多个家庭的规划安排包租婆,Docker管理了很多的容器服务,容器服务就是在宿主机上跑着的,例如MySQL、Nginx、微服务等等都是容器服务,大家都是在一个OS上平等的运行着,只不过进了自己房间,你对别人房间的情况就一无所知了。那么这不仅保护了各个服务之间不会产生对资源争用,而且还能根据预先入户的协议,分配好CPU、内存、磁盘的容量。这样大家住在一起也是明明白白的,谁也不能沾了谁的便宜。当然了对外的网络端口还是需要各家分配不同的。

有了这个本事,你就能在有限的云资源上跑很多服务啦!我自己做的公司网站跑在阿里云的ECS CentOS7,就跑了三个Docker容器:Nginx、MySQL、Wordpress,我才给分配了512M内存,够抠门吧,但是运行地妥妥的,只是物理内存是在太小,有时候重启服务,OS报内存资源就不够了,必须把Docker也重启,清空一下内存就好了。

我给当时老东家的两个互联网平台产品用了三台ECS性能不错的服务器,4核,16G内存,足足跑了50多个微服务和其他基础服务,真的是把资源榨得是干干净净。关键还有服务日志隔离、环境变量隔离、全局配置隔离等待,好处实在太多了。关键对我们产品在互联网架构上的Devops提供了良好的基础支撑,我可以在一台虚拟机上跑两套微服务,一套生产、一套测试,测试好的微服务升级版本号,变成新的生产微服务,老的微服务进入过渡替换期。详见:构建互联网医疗平台的Devops应用架构

问题集锦

1. Docker必须联网吗?

连接互联网不是必要的。可以内部搭建Docker Registry服务。我曾经就是在阿里云的多台机器的其中一台做了Registry服务,然后让其他机器通过内网的5000端口访问就可以了,记得给每台服务器的docker服务都配置一下都不走SSL。

我们也只有远程发布才让自己的开发客户端,访问Nginx的HTTP SSL端口,反向代理到Registry仓库,那么就需要在服务端装一个Docker版的nginx,因为公网尽量走HTTPS。如下图所示:

关于内网怎么装Docker的问题,你需要先找一个能上网的机器,通过docker hub做好你自己的Docker images,最好会dockfile怎么做,这是个脚本技术,主要有一些本地化和参数优化需要再做一下Docker images,然后Docker push到内网私有register服务仓库就可以了,其他内网机器只要Docker pull命令,就可以使用你制作的Docker images了。

windows系统下开发,就下载安装windows的Docker desktop使用和mac版本一样。

2. Docker里面的程序如何实现热更新?

用Dockerfile构建一个镜像,并生成了一个容器来运行程序,现在程序代码发生了变更,想要实现热更新如何实现呢?

一般Docker更新的方式,都是pull下来新的images,然后重启容器,当然也有一些讨巧的办法,通过对Docker内的发布程序目录镜像到本地目录,那么每次只上传程序包,更新服务器本地目录之后再进行Docker重启,这种方式免去了Docker体量太大,上传慢的问题。

但是这些都需要重启容器,不算真正意义上的热更新,在线业务系统往往允许的抖动时长会很严苛,而且即便是Docker镜像在测试环境都已经测试的没有问题了,放到生产服务器上也不能没有经过验证就直接替换,若是web系统,我建议用api网关+docker-compose+多版本运行的方式来实现热更新,而且这也会使得升级抖动的影响降到最低。如下图所示:T 为测试,P为生产,v1、v2就是docker-compose的多版本发布,通过API网关重定向微服务新版本跳转,实现最小升级抖动。

具体意思我简要说一下,就是让docker-compose作为你的应用发布的整体,这样无论是微服务也好,单体应用也好,就都统一作为一个单元部署管理了!

然后对需要更新的新版本程序,发布出新版本的docker-compose,QA验证无误后,再由api网关实现动态切换,Docker热更新的大体思路就是这样。

3. Docker挂载数据卷的时候映射文件会出现不同步?

学习Docker的时候发现 映射redis.conf 会出现这种情况 难道一定要先从容器中拷贝一份再运行yml吗

Docker映射配置文件的时候,一定是先要有这个文件,记住,而不是等其内部会创建这个文件,否则它只会创建出目录。

因此Docker映射文件不存在就走映射目录了。

所以第一种方式:是配置文件已经存在,也就是自己上传到服务器自定义配置目录,然后Docker直接映射过去,这时候映射文件或者映射目录一个道理。

第二种方式:配置目录映射到自定义目录,容器运行过程脚本自动化写入,那么配置目录的各项文件就需要在容器初始化过程中,由脚本对镜像内的打包配置文件完成写入。

其实我做过一个Redis的优化过的生产级的Docker,走的是第一种方式,需要你自己上传一下配置,可以看看我的gitee源代码仓库,gitee仓库也就做了这一个面向Redis中文化、性能调参过的dockerfile以及配置文件。·在gitee中搜索“读字节” 有个我写得不错的单机版Redis Dockerfile文件,里面对性能做过优化,大家可以用来学习。

结束语

总之在目前Kubernetes如日中天的时代,我们有时候要冷静思考一下,到底我们有必要搞得那么复杂吗?难道Docker还不够用吗?如果配合上Portainer这种在线免费的Docker管理工具,能让你的云上服务群管理的很好。

但是有一点是有门槛的,那就是玩Docker一定要不断历练自己的Linux能力,包括脚本编写能力,因为有些Docker Images并不能按照你的实际环境满足你的使用需求,需要自建Dockerfile,我就在以前的工程中配合Maven编写了自己的Dockerfile和Shell脚本,微服务从打包到发布,一气呵成,而且可以灵活去选择哪个微服务进行更新。这就真的需要深刻的去理解Linux了。

这些都并不是说会用Docker就够了,实际上面对更复杂的K8s,熟悉Linux这个问题一样是绕不过去的。因此还是关键的那一步,容器时代,用好容器引擎是从简单的Docker开始,并且在搞定程序之外历练自己的Linux功力,你的技术将提升得更快!

可以阅读另一篇关于分布式和大数据技术的详细文章:

人人都爱Kubernetes,Docker难道就不香了吗?的更多相关文章

  1. NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

    一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经 ...

  2. NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  3. NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

  4. NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索

    一.主从复制架构简介 通过前面几篇的介绍中,我们都是在单机上使用Redis进行相关的实践操作,从本篇起,我们将初步探索一下Redis的集群,而集群中最经典的架构便是主从复制架构.那么,我们首先来了解一 ...

  5. 【转】 NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索

    一.主从复制架构简介 通过前面几篇的介绍中,我们都是在单机上使用Redis进行相关的实践操作,从本篇起,我们将初步探索一下Redis的集群,而集群中最经典的架构便是主从复制架构.那么,我们首先来了解一 ...

  6. 【转】NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

  7. 【转】NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

    一.Redis API For .Net 首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库.目前最流行的就是Se ...

  8. 【转】NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装

    一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经 ...

  9. Head First Python之人人都爱列表(1-初识Python)

    IDLE 内置函数==BIF==built-in function 默认地,内置函数都是紫色,字符串是绿色,关键字是橙色. tab:自动补全 Alt-P:前一个 Alt-N:下一个 列表的特性 列表看 ...

随机推荐

  1. 利用matplotlib和cmaps根据已有的colormap,重新定义colormap

    算法网上这哥们总结的还可以[1] ,但是使用matplotlib自定义colormap自己掌握的还不够,写在这里 希望达到的目标 使用什么样的颜色,可以自己定义 方便的调用其他人的色标, 使用一部分c ...

  2. PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) 目录 PAT (Basic Level) Practice (中文) 1050 螺旋矩阵 (25 分) ...

  3. kong更改日志格式

    基于业务的需求,需要对网关层的日志进行适当定制,以满足使用kibana的制图. 对于kong的日志格式更改,可查看到的资料都过于繁琐,特此记录. 修改kong的日志格式 # ctl edit depl ...

  4. UML相关汇总

    类图 类图是UML最常用的图之一,用于描述面向对象程序设计中,类.接口等结构之间的关系,如图 类图中涉及到以下几种类型的对象 UMLClass 如图中Class1,代表类 UMLOperation 如 ...

  5. 【笔记】《Redis设计与实现》chapter10 RDB持久化

    chapter10 RDB持久化 10.1 RDB文件的创建和载入 有两个Redis命令可以用于生成RDB文件,SAVE和BGSAVE SAVE阻塞服务器进程进行RDB文件的创建,BGSAVE则创建服 ...

  6. 一次死锁导致CPU异常飘高的整个故障排查过程

    目录 一.问题详情 top 命令截图 联系腾讯云排查 检查系统日志发现异常 二. 问题解析 三.问题原因 最终结论 四.扩展 进程的几种状态 马后炮 如何快速清理僵尸进程(Z) 内核参数相关 如何查看 ...

  7. Day05_20_Java中类的创建和对象的实例化

    类的创建和对象的实例化 类的定义 类属于引用数据类型,java语言中所有的.class都属于引用数据类型 在类体当中,方法体之外定义的变量被称为 成员变量,成员变量没有赋值,系统默认是0: 语法结构: ...

  8. 浅入Kubernetes(12):Deployment 的升级、回滚

    目录 更新 上线 会滚 缩放 Deployment 直接设置 Pod 水平自动缩放 比例缩放 暂停 Deployment 上线 本篇内容讨论 Pod 的更新和回滚,内容不多. 更新 打开 https: ...

  9. OO Unit1 总结

    OO Unit1 总结 每次作业的思路和技术分析 No.1 一共写了8个类,2个接口,主要的其实只有4个类1个接口 主要接口: PowerFunction就是每一项去掉系数的那一部分,有求导和乘法两个 ...

  10. 老Python总结的字典相关知识

    字典 Python中的字典(dict)也被称为映射(mapping)或者散列(hash),是支持Python底层实现的重要数据结构. 同时,也是应用最为广泛的数据结构,内部采用hash存储,存储方式为 ...