Docker相关知识点
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进程。
1.结合Linux系统知识谈谈Docker运行机制
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实现了进程级别的隔离。虽然在容器里看不见宿主机上的其他进程,但归根结底它还只是一个运行在宿主机上的进程,所以就不具备操作系统的进程管理能力。所以更确切的说法是每个容器应该只有一个关注点,只有一个单一的功能。将应用程序解耦到多个容器中,可以更轻松地水平缩扩和重复使用容器。