Docker相关知识点

标签: 无 分类: 未分类 创建时间:2021-07-07 06:08:50 更新时间:2024-11-23 02:04:25

1.前言

(1) Docker的应用场景

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

(2) Docker的优点

  • 快速,一致地交付您的应用程序

  • 响应式部署和扩展

  • 在同一硬件上运行更多工作负载

  • 部署方便

  • 部署安全

  • 隔离性好

  • 快速回滚

  • 成本低

  • 管理成本更低

(3) Docker的缺点

  • 隔离性
  • 性能
  • 存储方案
参考文章:
1.Docker 入门教程
2.Docker 教程
3.面试题: Docker的优缺点
4.Docker 微服务教程
5.虚拟化技术 - Docker Vs. 虚拟机 (这篇文章对于虚拟机和Docker对比写的更加的全面,从使用到的技术,常用的虚拟机以及相互之间的区别等方面都进行了一定程度的解析)

1.有趣的docker镜像

这个章节我不知道放在哪,其实我发现这个东西,也是在接收了别人的服务器之后发现的,我以为服务器上没有装docker,后来装了,装了之后,我使用 docker images 查看,竟然已经有了一些镜像,我才知道,原来以前这台服务器上已经安装了docker,并且运行了一些容器。

本着学习的精神,我查看了这几个镜像和容器的作用

  • collabora/code
  • kylemanna/openvpn
  • onlyoffice/documentserver

2.Docker进程的隔离性

这个问题是偶然发现的,就是我在linux上使用ps命令查看java的时候,发现了宿主机上本来没有的进程,/usr/local/java/jdk-13/bin/java 这个目录在宿主机上是没有的,但是在docker中是存在的。

在docker容器中,使用ps命令,是看不到宿主机上的java进程的,但是在宿主机上使用ps命令,却可以查看容器中的ps进程。

3.一个容器运行一个进程的哲学

我在一个docker中运行了多个jar程序,结果总是有一两个程序导致cpu过载,占满了整个服务器内存,但是单独启动其中的一个两个,问题就不是很大,这是什么原因呢?真是让我头大。

后来我想到了这种在一个容器中运行多个进程的方式,是不是不合适呢? 查了多篇文章,都是建议说,一个容器运行一个进程,这样符合docker的哲学,也方便扩展和伸缩。至于原因,我就不粘贴了,下面的很多的文章都已经写明了。

参考文章:
1.java微服务项目多jar包使用Docker打包在一个容器运行 这里提供了一个启动脚本
2.单个docker容器内启动多个java应用
3.如何在一个Docker中同时运行多个程序进程? 我们都知道Docker容器的哲学是一个Docker容器只运行一个进程,但是有时候我们就是需要在一个Docker容器中运行多个进程,那么基本思路是在Dockerfile 的CMD 或者 ENTRYPOINT 运行一个”东西”,然后再让这个”东西”运行多个其他进程
简单说来是用Bash Shell脚本或者三方进程守护 (Monit,Skaware S6,Supervisor),其他没讲到的三方进程守护工具同理
4.为什么建议一个容器中只运行一个进程 这篇文章有几点理由:1、每个容器中只运行一个应用程序,则水平伸缩将变得十分容易。例如,当你需要一个Tomcate容器,可以从现有的容器再扩展出一个,但如果你的这个容器中不仅有Tomcate,还有MySQL等其他应用程序,事情就会变得复杂起来。2、每个容器中只运行一个应用程序,可以轻松地将其重新用于其他项目或目的,极大增加复用度。3、每个容器中只运行一个应用程序,出现故障时开发人员能方便地对该故障容器进行问题排查,而不必对整个系统的各个部分进行排查,这也使得其更具有可移植性和可预测性。4、每个容器中只运行一个应用程序,升级程序时能够将影响范围控制再更小的粒度,极大增加应用程序生命周期管理的灵活性,避免在升级某个服务时中断相同容器中的其他进程。5、每个容器中只运行一个应用程序,从安全性和隔离性角度来看,能够提供更安全的服务和应用程序间的隔离,以保持强大的安全状态或遵守PCI之类的规定。[5] 话说回来,容器本身的设计,就是希望容器和服务/应用能够具备相同的生命周期。即:一个容器对应一个进程。这样,才能够最好地应用容器编排来管理好容器和服务。
5.为什么一个容器推荐只运行一个应用 总有一些情况我们需要一个容器内运行多个应用的情况,如开发环境下将nginx和php-fpm打包到同一个镜像,减少复杂度或者将应用使用到的所有软件打包到一个镜像,方便部署(gitlab、nextcloud等)。
6.容器花絮:什么时候应该将应用程序切分为多个容器?
7.Docker容器的”单进程模型” 容器不像虚拟机那样拥有独立的操作系统,容器只是通过Linux的Namespaces、Cgroups实现了进程级别的隔离。虽然在容器里看不见宿主机上的其他进程,但归根结底它还只是一个运行在宿主机上的进程,所以就不具备操作系统的进程管理能力。所以更确切的说法是每个容器应该只有一个关注点,只有一个单一的功能。将应用程序解耦到多个容器中,可以更轻松地水平缩扩和重复使用容器。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。