Docker基础学习(一)

204 阅读5分钟

docker的学习路径

  • 单体Docker
    • Docker概述
    • Docker安装
    • Docker命令
      • 镜像命令
      • 容器命令
      • 操作命令
      • ……
    • Docker镜像!!
    • 容器数据卷
    • Dockerfile
    • Docker的网络原理
    • IDEA整合Docker
  • Docker集群
    • Docker Compose
    • Docker Swarm 简化版的k8s
  • CI\CD Jenkins

docker概述

docker为什么会出现?

  • 窘境
    • 一款产品:开放和上线 两套环境!测试环境和 线上环境,辛辛苦苦在测试环境中搭建的各项配置在应用环境中还要在进行一次配置,配置第一麻烦,第二容易出现问题,不够稳定
    • 开发 -- 运维 问题:我在我的电脑上可以运行!
      • 版本更新,导致服务不可用!(现实的例子就是多人开发的项目在服务器上,最开始的时候A,B用的包都是2.1的版本,包最新版本是2.4,这时候A想开发的功能,需要将包进行升级,但是兼容性不好,原来的2.1中好多功能被更改,这时候上线,运维将包更新到2.4,导致了B的服务不可用了,回退版本的话,A的新开发的功能也不能用了,这样运维和开发的压力都巨大)
    • 环境配置是十分的麻烦,对多个机器进行管理,每个机器上都要部署环境(集群Redis,ES,Hadoop……)!费时费力,还容易出现问题
    • 发布一个项目,能不能(程序代码+环境)放在一起进行打包,安装上线
    • 之前在服务器配置一个应用的环境Redis,Mysql,jdk,ES,Hadoop,配置超级麻烦,而且还不能跨平台,在window上开发,最后发布到linux上
  • 解决
    • 传统:开发功能代码,运维部署环境
    • 现在:开发打包部署,一套流程做完。开发兼运维
    • Java ---apk--发布(应用商店)---张三使用apk--安装即可使用
    • Java -- jar(环境) -- 打包项目带上环境(镜像)---(Docker仓库:商店)----下载我们发布的镜像----直接运行即可
  • Docker的解决方案
    • image.png
    • 思想:集装箱(隔离)的思想,向上面的实例中的困扰(A,B因为包升级问题),我们将A的项目和A的开发环境打个包,放在服务器上运行,A的项目运行良好,同样B的项目和B的开发环境也打包,放在服务器上,B的项目也运行良好,就像船上的集装箱一样,A,B彼此隔离互不影响,A的安装包更新,B的不受影响,这样解决了包升级引发服务不可用的问题。
    • 利用隔离机制,可以将服务器利用到极致。

Docker的历史

  • 2010年。几个搞IT年轻人,就在美国成立了一家公司“dotcloud”一做一些pass的云计算
  • LXC有关的虚拟机技术!
  • 他们将自己的技术(虚拟化技术)命名Docker!
  • Docker刚出生的时候,没有引起行业的重视!dotCloud,活不下去了!
  • 2013年,"开源"
  • 2014年4月9日。Docker 1.0 版本发布!
  • Dockerk为什么这么火?十分的轻巧
  • 在容器技术出现之前。我们都是用虚以机技术!
  • 重点
    • 虚拟机属于虚拟化技术,Docker是容器技术,也是一种虚拟化技术
    • 虚拟机:在windows中安装一个Vmware,通过这个软件可以虚拟出来一台或者多台的电脑,一个虚拟机模拟真实电脑非常的大,多达10几个G,非常的笨重,开机需要几分钟
    • 容器:隔离技术,镜像(最核心的环境 4M(兆)+jdk+mysql)<一个mysql的docker镜像>,十分的小巧,运行镜像就可以了,几兆/几十兆的很常见,秒级的启动非常快。

Docker简介

Docker VS 虚拟机

  • 虚拟机技术
    • image.png
    • 虚拟机技术是真实的虚拟出来一个操作系统:其中包含 Kernel + Lib ,让后上层的应用都是基于这个环境进行安装和运行的,这个Lib就像我们的真实系统中的库一样,要为所有的上层软件服务,这样的话,lib的东西就要非常的全,就非常的大,这也是传统的虚拟机庞大而笨重的原因
    • 技术缺点
      • 占用的资源十分的多
      • 冗余的步骤比较多
      • 启动很慢
  • Docker
    • image.png
    • 在docker中只是借助了kernel,完成操作系统的基本功能,这样的话,我们在安装上层的应用的时候,只需要安装相对应软件的依赖就行了,并不需要将用到的、用不到的lib全部安装,所以在每个部分,安装好应用和应用的依赖就是一个集装箱,所以非常的轻便
    • 容器化技术不是模拟的一个完整的操作系统
  • 举例理解:
    • 假设我们想要安装python
      • 虚拟机
        • Kernel
        • Lib(python的依赖环境+C语言的依赖环境+java的依赖环境+……等等许多软件的依赖环境)
        • 人:安装python即可
      • Docker
        • Kernel
        • 人:安装python + python的依赖环境
  • 比较docker和虚拟机技术的不同
    • 传统的虚拟机,虚拟出来一套硬件,运行一个完整的操作系统,然后在这个操作系统中中安装和运行软件
    • 容器内的应用直接运行宿主机的内容,容器是没有自己的内核的,也没有虚拟我们的硬件,所以就轻便了
    • 每个容器之间相互隔离,每个容器内都有一个属于自己的文件系统,互不影响。
  • DevOps(开发,运维)
    • 应用更快速的交付和部署
      • 传统:一堆的帮助文档,安装程序
      • Docker:打包成镜像发布测试,一件运行
    • 更便捷的升级和扩缩容
      • 使用了Docker之后,我们部署应用就像是在搭积木一样
      • 项目打包成一个文件,扩展 服务器A 服务器B
    • 更简单的系统运维
      • 在容器化之后,我们的开发,测试环境都是高度一致的
    • 更高效的计算资源利用
      • Docker是内核级别的虚拟化,可以在一个物理机上运行很多的容器实例!服务器的性能可以被开发到极致