Linux运维笔记
我们一直在努力

什么是Docker?

本文包含容器的安装与操作,作为视频学习后归纳与总结

Docker对我们大多数人来说并不是一个新词, 它无处不在。 但究竟Docker是什么?很简单,Docker是一个软件集装箱化平台,这意味着您可以构建应用程序,将它与其依赖关系一起打包到一个容器中,然后这些容器可以很容易地运送到其他机器上运行。

那么容器又是什么?

先来了解下容器

一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。

可能目前你对容器的概念依旧很模糊,在说容器之前看下虚拟机是怎么运行的

容器与虚拟机 (VM) 结构对比

例如:VMware运行虚拟机的时候,虚拟机本身也运行着一个完整操作系统,如果你的物理机的操作系统是win10,虚拟机却可以安装各种不一样的操作系统,如CentOS、Ubuntu、Windows等,完全和物理机分割开,互相不受影响,甚至时间日期时区也可以完全不一样。

容器与虚拟机 (VM) 总结

虽然和物理机有很好的隔离性,有自己的网络、内核、进程、用户空间等,但是因为本身也运行着一个完整的操作系统,带来的缺点也是显而易见的,额外的系统资源开销、无法完全利用物理机的性能、虚拟机的开启需要花费一定的时间等。

 

那么现在我们需要一种虚拟技术,可以和虚拟机一样,有者独立的用户空间、网络、内核,但是物理机,以及其他虚拟机有者很高的隔离性,互相不受影响,像个独立的个体,2个不同的虚拟机之间有者边界,我们的进程在我的虚拟机中运行,不会跑到边上的虚拟机中,边上的网络也不会影响到本机,同时自己虚拟机在运行时,不需要额外的虚拟机操作系统,减少系统资源的开销。

这个就是容器技术!

容器本身就是2个(或多个)有着边界的轻量级虚拟机,运行容器不需要单独安装一次操作系统,因为容器本身就是复用物理机的操作系统,也就说容器是运行在用户空间的,容器是有隔离性的,这样每个容器都有自己单独的主机名、进程、网络设备、用户等。

进入容器ps查看进程会发现进程1通常是sh,这个是因为容器启动完成会会自动卸载bootload,所以就不会有正常linux里的systemd或者init了

 

容器有6大隔离名称空间

名称空间 隔离内容
UTS 主机名和域名
IPS 信号量、消息队列和共享内存
PID 进程编号
NetWork 网络设备、网络栈、端口等
Mount 挂载点(文件系统)
User 用户和用户组

有了这6大隔离空间,隔离了相关的功能后,每个容器就相当于有者最基本功能的轻量级的系统了

 

Docker就是实现这样功能的一种容器

 

Docker容器的特点

  • 轻量,在一台机器上运行的多个Docker容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
  • 标准,Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。
  • 安全,Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

 

为什么要用Docker

  • Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现“这段代码在我机器上没问题啊”这类问题;——一致的运行环境
  • 可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。——更快速的启动时间
  • 避免公用的服务器,资源会容易受到其他用户的影响。——隔离性
  • 善于处理集中爆发的服务器使用压力;——弹性伸缩,快速扩展
  • 可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。——迁移方便
  • 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。——持续交付和部署

 

大家了解容器后,就可以学习Docker的概念了

Docker三个概念特点:

  1. 镜像(IMAGE)
  2. 容器(CONTAINER)
  3. 仓库(REPOSITORY)

 

先插一句话,未运行的镜像就叫镜像,镜像运行起来后才叫容器

 

镜像通常分为三层

 

镜像就是可运行的一个Docker虚拟机,实际就是一种文件系统

最下面一层叫Base Image,你也可以叫他父镜像,他通常有Docker开发者开发基础镜像

而后中间是应用层,有一层或者多层,这个就是我们在镜像中安装的东西了,如官方Nginx的Docker镜像,则会有一层包含Nginx应用的镜像层,拿回来则可以直接运行。为了保证镜像的唯一性和可管理性,通常一个镜像应只包含一个应用,比如你有2个Docker镜像,一个是Nginx应用,一个是Tomcat。

最上层为写入层,也就是说刚才下面的父镜像和中间的应用镜像都是只读的,你的修改都会体现在最上层的写入层,如果镜像关闭里面的东西也会消失,当然后面会说到。

镜像可以从DockerHub上pull下来

仓库就是居中存放镜像的地方

通常一个应用统一存放在一个仓库中,仓库中镜像是以TAG来命名的,所以真正的镜像获取方式是仓库名:镜像TAG

如果Nginx存放的仓库就叫Nginx,仓库中有个官方镜像叫latest,那么取镜像时候名称是 nginx:latest,当然如果你不加latest,拉取任何镜像时都默认以最新版本拉去

当然一个镜像其实有很多版本,我们这里看不到,如果打开DockerHub里会发现很多版本

这些都会NGINX下不同版本的TAG,每个TAG就是一个镜像

所以从这里了解到一个问题,仓库就是存放同一种应用的地方,里面有很多不同版本的应用

容器就是镜像运行时的实体

容器可以被创建、启动、停止、删除、暂停等 。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照Docker最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新run,数据却不会丢失。

 

从这里我们了解了什么是容器,什么是Docker,还有Docker相关的概念,如有不对请联系我

赞(0) 打赏

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址