docker简介

docker

简介:

​ Docker是一个快速交付应用、运行应用的技术。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oOdPQRjm-1662271908464)(C:\Users\LUOJUN\AppData\Roaming\Typora\typora-user-images\image-20220828152734136.png)]

docker的图标非常生动的体现了它的思想,一条大鲸鱼载着一个个集装箱。下面讲讲我对它的理解:

为什么会出现docker?

​ 首先我们要先想一想为什么会出现docker?学docker技术之前,我相信你已经用spring技术写过几个中小型的项目了吧。如果你是大佬,你肯定遇到过这样的情况:在课程设计或者大作业的时候,你的好兄弟找你要你的项目代码渡劫,这个时候你发给他后,他肯定还会来找你,“哎这个项目怎么运行啊!”,这个时候你会在他的电脑上操作一波,会发现:他的jdk版本跟你的不一样,没装maven、没装mysql、没装redis…或者装了可能因为版本不同也导致运行不起来;如果你是小白,你肯定会去某个技术社区搜索项目源码,好不容易找到了心仪的项目下到电脑上准备运行,发现报一大堆错误,都是一些中间件没装或者版本问题。

​ 再来讲讲公司中程序员和运维人员在没出现docker之前的故事:程序员完成代码的编写后,提交到响应的仓库,这个时候轮到运维人员来部署,很可能会发现项目运行不起来的情况,这个时候运维人员肯定会找程序员,“你这个代码运行不了啊!?“ 程序员会说:”可以运行啊,在我电脑上运行好好的。“这个时候两个人就互相责骂起来了,”你写的什么代码,根本运行不了“,”什么水平啊,跑个代码都不会“…其实两个人都没错。

​ 问题真正出现在:双方的运行环境(jdk或者组件版本不一样),不同环境下的配置文件会有差异,在配置不同技术时资源会出现冲突等等问题(部署时需要依赖于node.js、Redis、RabbitMQ、MySQL等,这些服务部署时所需要的函数库、依赖项各不相同,甚至会有冲突),这个时候怎么办呢?就需要程序员写一个特殊引导,将各技术框架的版本和配置文件信息全部写下来,交给运维人员。这个时候可能会有人说,这没问题啊,照着引导做就好了,但是你想想,真正公司运维人员部署的时候是集群部署,成千上万的服务器,得需要一个个配置,多麻烦啊!

在这里插入图片描述

​ 这个时候docker就出现了!将源码+运行环境+配置文件+特殊引导第三方组件…全部打包装成一个镜像,这个镜像就相当于一个集装箱,装进去是什么样,打开来还是这样,而且都是在各自容器(相当于集装箱)内独自运行,感知不到其他容器的存在,是一个相对独立的环境,就减少了资源冲突问题。

在这里插入图片描述

那如何保证这个镜像在不同计算机上都能运行出一样的效果呢?这个时候就需要一条鲸鱼(docker),托起一个个的集装箱。可以类比以下VMware虚拟机,学过Linux的都用过,在它上面装centos系统,虚拟物理硬件达到Linux环境,但是不同品牌的计算机多多少少会用一些差异,如何保证运行centos系统的效果都是一样的呢,这个就得靠VMware。不同的系统应用,例如CentOS、Ubuntu、Fedora等,提供的函数库都不一样,但是它们的内核都是Linux(应用先调函数库,系统函数库是对内核指令集的封装会调用内核指令,内核根据应用的调用来操作计算机硬件),此时,如果将一个Ubuntu版本的MySQL应用安装到CentOS系统,MySQL在调用Ubuntu函数库时,会发现找不到或者不匹配,就会报错。

在这里插入图片描述

Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包,Docker运行到不同操作系统时,直接基于打包的函数库,借助于操作系统的Linux内核来运行。

在这里插入图片描述

(还可以通过docker技术实现一键部署,很好的解决集群部署的麻烦)

可见现在开发人员和运维人员界限越来越模糊,程序员大都是开发+运维。

小结:

(这里黑马总结的很好,我就直接拿来用了,上面的图也是黑马的)

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
  • Docker应用运行在容器中,使用沙箱机制,相互隔离

Docker如何解决开发、测试、生产环境有差异的问题?

  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷
Docker与虚拟机的对比:

在理解这部分前,你要清楚:我们是在虚拟机上装docker,因为我们大都用的windows,很容易产生一个误区,docker要依赖于虚拟机,实则不是,我刚开始就是带着这个误区,导致总是想不清楚。

虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 centos 系统,这样就可以运行任意的centos应用了。应用程序对此毫无感知,而对于底层系统来说,虚拟机就是一个普通的文件。

在这里插入图片描述

简单解释:

Size:虚拟机是虚拟硬件模拟一整套操作系统,而docker直接对接系统内核,仅仅包含了所需的函数库

startup:大家都运行过虚拟机,从开机到输入密码用了很长时间吧,用虚拟机运行的话安装的centos镜像虚拟的是整个系统环境,而docker仅仅是所需要的环境并且直接利用内核。

Intergration:复杂度虚拟机模拟一整套操作系统,明显复杂度高

比较了 Docker 和传统虚拟化方式的不同之处:

*传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;

*容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

* 每个容器之间互相隔离,每个容器有自己的文件系统 ,容器之间进程不会相互影响,能区分计算资源。

docker作用:

· 更快速的应用交付和部署:

​ 传统的应用开发完成后,需要提供一堆安装程序和配置说明文档,安装部署后需根据配置文档进行繁杂的配置才能正常运行。Docker化之后只需要交付少量容器镜像文件,在正式生产环境加载镜像并运行即可,应用安装配置在镜像里已经内置好,大大节省部署配置和测试验证时间。

· 更便捷的升级和扩缩容

​ 随着微服务架构和Docker的发展,大量的应用会通过微服务方式架构,应用的开发构建将变成搭乐高积木一样,每个Docker容器将变成一块“积木”,应用的升级将变得非常容易。当现有的容器不足以支撑业务处理时,可通过镜像运行新的容器进行快速扩容,使应用系统的扩容从原先的天级变成分钟级甚至秒级。

· 更简单的系统运维

​ 应用容器化运行后,生产环境运行的应用可与开发、测试环境的应用高度一致,容器会将应用程序相关的环境和状态完全封装起来,不会因为底层基础架构和操作系统的不一致性给应用带来影响,产生新的BUG。当出现程序异常时,也可以通过测试环境的相同容器进行快速定位和修复。

· 更高效的计算资源利用

​ Docker是内核级虚拟化,其不像传统的虚拟化技术一样需要额外的Hypervisor支持,所以在一台物理机上可以运行很多个容器实例,可大大提升物理服务器的CPU和内存的利用率。

docker三要素:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

仓库DockerHub Registry):存储镜像的仓库。例如DockerHub是一个官方的Docker镜像的托管平台。

简单解释:大家都学过java,都知道如何创建一个对象,类似于java,镜像相当于类模板,而容器相当于new出来的一个个对象。

docker平台架构:

简易版:

在这里插入图片描述

架构版:

在这里插入图片描述

常用命令:

启动docker:systemctl start docker

停止docker: systemctl stop docker

重启docker:systemctl restart docker

查看docker状态: systemctl status docker

开机启动:systemctl enable docker

查看docker概要信息: docker info

查看docker总体帮助文档: docker --help

查看docker命令帮助文档: docker 具体命令 --help

其他命令可以通过 上面最后两个命令查找

例如:docker images :查看所有镜像

· docker system df 查看镜像/容器/数据卷所占的空间

容器命令:

· docker run [OPTIONS] IMAGE [COMMAND] [ARG…]· 新建+启动容器

· exit退出,容器停止

· ctrl+p+q退出,容器不停止(重新进入用exec,例如:docker exec -it 容器ID bashShell,还可以用attach,区别是attach重新进入容器后再用exit退出,容器会停止运行,而exec用exit退出容器不会停止)

· docker start 容器ID或者容器名

· docker restart 容器ID或者容器名

· docker stop 容器ID或者容器名

· docker rm 容器ID(-f 强制删除)

· docker logs 容器ID

· docker top 容器ID:· 查看容器内运行的进程(一个容器相当于一个小小的简易版的linux环境)

· docker inspect 容器ID:· 查看容器内部细节

注意:

一些命令的[option]说明:

启动交互式容器:

-i:以交互模式运行容器,通常与 -t 同时使用;

-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用

示例:

以ubuntu为例(模拟出一个小型的Linux系统,防止弄混,下面给出图帮助理解)

在这里插入图片描述

在这里插入图片描述

一般使用系统都会用到shell命令终端,所以还要加上/bin/bash或者/bash

启动守护式容器:

-d: 后台运行容器并返回容器ID

(对于一些服务,如redis、mysql我们并不需要它的前台窗口,此时就需要用到-d,如果不加-d,容器会启动,但是启动会立即自动关闭,这是docker的一个机制,它认为你不需要此服务)

其他:

–name=“容器新名字” 为容器指定一个名称

-P: 随机端口映射,大写P

-p: 指定端口映射,小写p

(以前我们直接访问服务的端口号即可,但是现在用docker,服务是在容器中,要访问需要进行端口映射)

如何将数据cp到主机上?

· docker cp 容器ID:容器内路径 目的主机路径

再谈镜像:

是什么:

镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等),这个打包好的运行环境就是image镜像文件。

分层的镜像

在这里插入图片描述

从pull拉取镜像来看,它是一层一层拉取的,可见镜像是分层的。专业名词叫UnionFS(联合文件系统),Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

镜像加载原理:

docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。

bootfs(boot file system)主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。rootfs (root file system) ,在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

这也解释了ubuntu镜像为什么这么小,而ubuntu虚拟机几个G,ubuntu镜像仅仅加载内核必需的,例如进入到ubuntu容器内输入vim命令它识别不了;

分层的作用:

最大的作用就是提高复用率!举个例子,利用官方不带vim的ubuntu镜像,生成一个带vim的ubuntu镜像。

进入ubuntu容器,执行命令更新包管理工具(类似centos的yum),如下图:

在这里插入图片描述

再安装vim:

在这里插入图片描述

结果:

在这里插入图片描述

使用docker commit生成一个带vim的ubuntu镜像,

在这里插入图片描述

在这里插入图片描述

可见myubuntu比官方的大的多

数据卷:

卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性;卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

为什么会出现数据卷?

有时候我们要进入容器内部添加修改其文件,这个时候容器内是没有vim的,修改很不方便,有了数据卷,我们只要在宿主机内增加修改文件,并且会自动与容器内同步,双方都可以操作,实现互通流(docker服务停止后,在宿主机的数据卷挂载地方操作,依然生效)

如何用?

统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性;卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

为什么会出现数据卷?

有时候我们要进入容器内部添加修改其文件,这个时候容器内是没有vim的,修改很不方便,有了数据卷,我们只要在宿主机内增加修改文件,并且会自动与容器内同步,双方都可以操作,实现互通流(docker服务停止后,在宿主机的数据卷挂载地方操作,依然生效)

如何用?

· docker run -it --privileged=true -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值