1.docker为什么会出现

在docker出来之前:
我们知道一款产品上从开发到上线部署两套环境,应用环境,应用配置
开发到运维,有时候就会出现一些问题,如

  1. 我在我的电脑上可以运行!
  2. 版本更新,导致服务不可用,对于运维来说,是个考验
  3. 环境配置十分麻烦,每个机器都要部署环境(集群Redis、ES、Kibana等)十分费时费力。
  4. 发布web项目(jar + (Redis Mysql jdk) ),如果发布项目能够带上环境配置安装打包该多好!
  5. 之前在服务器配置一个应用的环境Redis MySQL jdk ES Hadoop 配置非常麻烦,有些还不能跨平台
  6. 如果开始在Windows部署好,最好发布到Linux,又得在Linux重新部署搭建环境
  7. 传统,开发开发jar后,需要运维来做,现在的话,开发打包部署上线,一套流程做完!

Docker的出现就是解决上述问题的。

Docker的思想来自于集装箱,将应用打包装箱,每个箱子互相隔离。

Docker主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用Docker可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用部署到其它机器上,从而实现一次打包,多次部署的目的。

2.Docker和虚拟机技术的区别

虚拟机技术缺点

  1. 资源占用十分多
  2. 冗余步骤多
  3. 启动十分慢

容器与虚拟机不同

  • 传统虚拟机,虚拟机出一条硬件,运行一个完整的操作系统,然后再这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内容,容器没有自己的内核,也没有虚拟机硬件,所以很轻便
  • 每个容器间相互隔离,每个容器内部都有自己的文件系统互不影响
docker优点
  1. 应用更快速的交付和部署。传统,都是一堆帮助文档,安装程序,有了docker后,直接打包成镜像发布测试,一键运行
  2. 更便捷的升级和扩缩容。使用Docker之后,部署应用和搭积木是一样的,项目打包成一个镜像,扩缩容也极其方便简单
  3. 更简单的系统运维。在容器化后,我们的开发、测试环境都是高度一致的,这样的话,能够保证环境统一,如果运维能够通过容器技术来进行环境的统一部署,不仅在部署的时间上节省不少,也能把很多人工配置环境过程中产生的失误降到最低。
  4. 更高效的计算资源利用。Docker是内核级别的虚拟化,可以在一个物理机上运行多个容器实例,服务器的性能可以被压榨到极致
    - 隔离性好。不管是开发还是生产,往往我们一台机器上可能要跑多个服务,而服务各自依赖的配置又不尽相同,假如说两个应用需要使用同一依赖,或者两个应用需要的依赖之间有一些冲突,这个
    时候就很容易出现问题,所以同一台服务器上不同应用提供的不同服务,最好还是将其隔离起来,而容器在这一方面就有其天然的优势,每一个容器就是一个隔离的环境,容器内部所提供的服务对环境依赖的要求,容器可以自内部全部提供,这种高内聚的表现可以快速分离有问题的服务,在一些复杂应用系统中能够实现快速拍错和即时处理。
  5. .快速回滚。容器之前的回滚机制,一般要基于上个版本的应用重新部署,且替换掉目前有问题的版本,在最初的时代,可能是一套完成的从开发到部署的流程,而执行这一套流程往往需要花费很长时间,在基于Git的环境中,可能是回退某个历史提交,然后重新部署,这些跟容器相比,都不够快,而且可能会产生新的问题。而容器技术天生带有回滚特性,因为每个历史容器或者镜像都会保存,而替换某个容器或者镜像是非常快速和简单的。
  6. 成本低。这可能是一个最明显和有用的优点了,在容器出现之前,我们往往会因为构筑一个服务,就要提供一台服务器或者一台虚拟机,服务器的购置成本和运维成本都比较高,而虚拟机所占用
    的资源又相对较高,相比之下,容器就小巧轻便的多,只需要给一个容器内部构建应用所需的依赖就可以了,这也是容器技术发展如此迅速的最主要原因。
  7. 管理成本低。随着容器技术的不断普及和发展,随之而来的容器管理和编排技术也同样得到发展,诸如Docker Swarm,K8S,Mesos等容器编排工具也在不停的迭代更新,这让容器技术在生产环境中拥有了更大的可能性和更多的发挥空间,随着大环境的发展,docker等容器的使用和学习成本也越来越低,成为更多开发者和企业的选择。
docker缺点

1. 隔离性
基于hypervisor的虚拟技术,在隔离性上比容器技术要好,它们的系统硬件资源完全上虚拟化的,当一台虚拟机出现系统级别的问题,往往不会蔓延到同一宿主机上的其它虚拟机上,但是容器就不一样了,容器之间共享同一个操作系统内核及其它组件,所以在受到诸如黑客攻击这种情况的时候,很容易通过底层操作系统影响的其它容器,甚至逐个击破,产生连锁反应,当然,这个问题可以通过部署容器来解决,但随之又会产生新的问题,比如成本增加以及性能问题。

2. 性能
不管是虚拟机还是容器,都是运用不同的技术对应用本身进行了一定程度的封装与隔离,在降低应用和应用之间以及应用和环境之间的耦合性上做了很多努力,但是随之而来的,就会产生更过的网络连接转发和数据交互,这在低并发系统上虽然不会很明显,但是当同一虚拟机或者服务器下面的容器需要更高并发量支撑的时候,也就是并发问题成为系统瓶颈的时候,容器会将这个问题放大,所以,并不是所有的场景都适合容器技术。

3. 存储方案
容器的诞生并不是为OS抽象服务的,这是它和虚拟机最大的区别,这样的基因意味着容器天生是为应用环境做更多的努力,容器的伸缩也是基于容器的这一特性,而与之相对的,需要持久化存储方案恰恰相反,在数据存储这一点上Docker容器提供的解决方案是利用volume接口(存储卷)形成数据的映射和转移,以实现数据持久化的目的。但是这样同样也会造成一部分资源的浪费和更多的交互,不管是映射到宿主机上还是网络磁盘,都是退而求其次的解决方案。

3.docker基本组成

1. 镜像 (inage)
docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,如redis镜像==>pull==>run==redis01 容器(提供服务),通过镜像就可以创建多个容器,提供服务
2.容器(container)
Docker 利用容器技术,独立运行一个或一组应用,通过镜像来创建。可以简单把容器理解为简易的linux系统
3.仓库(repository)

  • 仓库是存放镜像的地方
  • 仓库分为共有仓库和私有仓库
  • Docker Hub(默认是国外的)
  • 阿里云 也有容器服务器(配置镜像加速)
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐