操作系统是如何管理进程的
进程的特点:
- 可以相互通信:具有高级权限的进程可以攻击其他进程
- 共享同一份文件系统:(1)进程可以对已有的进程进行增删改查,也就意味着高级进程可以将其他应用所需要的进程删掉,破坏其他进程的运行
(2)进程和进程之间所需要的的依赖会存在冲突,会给运维带来很大的压力 - 使用的是同样的一个宿主机资源:会存在资源的抢占问题,当一个应用消耗大量的内存或者CPU时,其他应用就无法正常提供服务
在这样的问题下,我们如何给这些应用提供独立的运行环境?
- 可以采用namespace对资源进行隔离,进程可以运行在一个独立的环境
- 可以通过cgroup控制资源使用率
- 可以使用chroot实现独立的文件系统,针对不同进程使用同一个文件系统所造成的问题而言,Linux 和 Unix 操作系统可以通过 chroot 系统调用将子目录变成根目录,达到视图级别的隔离;进程在 chroot 的帮助下可以具有独立的文件系统,对于这样的文件系统进行增删改查不会影响到其他进程。
什么是容器
容器,是一个视图隔离,资源可限制,独立文件系统的进程集合,它将系统的其他资源(包括进程,文件系统,网络资源)隔离开来,具有自己独立的资源视图。
- 视图隔离–能看见部分进程,独立的主机名等
- 控制资源使用率—如2G内存大小,CPU的使用个数等等
优点:使用的是系统上的资源,所以在独立的文件系统内不需要具备内核相关的代码或者工具,只需要提供容器所需的二进制文件,配置文件以及依赖即可。只要容器运行时所需的文件集合都能够具备,那么这个容器就能够运行起来
什么是镜像
容器镜像—容器运行时所需要的所有文件集合
采用dockerfile----描述镜像构建步骤 这是因为 Dockerfile 提供了非常便利的语法糖,能够帮助我们很好地描述构建的每个步骤。当然,每个构建步骤都会对已有的文件系统进行操作,这样就会带来文件系统内容的变化,我们将这些变化称之为 changeset。当我们把构建步骤所产生的变化依次作用到一个空文件夹上,就能够得到一个完整的镜像。
镜像之间能够相互复用
镜像之间是分层的
构建步骤所产生出文件系统的变化—changset
每个带有颜色的方框表示每一次构建步骤所带来的影响,及构建的步骤描述
当我们把这些构建的步骤所产生的变化依次作用到一个空的文件夹上,就能得到一个完整的镜像
镜像分层可以提高分发效率,
镜像之间复用可以减少磁盘压力
如何构建镜像
通过dockerfile来构建一个镜像
eg:通过dockerf来构建一个golang应用
from :表示以下的构建步骤基于golang镜像进行构建,镜像是可以复用的
workdir:表示接下来的构建是在哪个路径下进行的,相当于shell中的cd命令
copy:表示将宿主机上的文件拷贝到镜像内
run:在具体的系统内执行相应的动作,比如go get 表示下载golang程序的依赖。go install表示go build,然后再把产生出来的二进制放到一个可检索的路径下,比如 /usr/bin
运行完毕之后,就可以得到golang的应用
cmd:表示这个镜像的名字是APP
之后可以使用docker bulid -app:V1来构建APP这个应用 --------这个构建出来的结果是存储在本地的
镜像如何运行在生产环境或者测试环境呢?
需要将镜像通过一个中转站。docker registry ----镜像数据的存储和分发
docker push app:v1 将本地的镜像推送到镜像仓库中,然后就可以在生产环境上进行下载使用了
如何运行一个容器
- 从docker registry 下载镜像 ----docker push busybox:1.25
- 查看本地镜像列表 —docker images
- 选择相应的镜像并运行 —docker run [-d] --name demo busybox:1.25 top
top 指定容器对应的进程是一个top命令。 可以通过多次运行得到多个容器,一个镜像就相当于是一个模板,一个容器就像是一个具体的运行实例,因此镜像就有了一次构建,到处运行的特点。
容器的生命周期
容器运行时会有一个init进程,这个init进程启动的时候,容器也会随之启动,当init进程退出的时候,容器也会随之退出。
但是这样的做法会存在一些问题,首先应用里面的程序往往都是由状态的,可能会产生一些重要的数据,如mysql,当一个容器退出被删除后,数据也会随之丢失了。所以就需要将容器所产生出来的重要数据持久化存下来,容器能够直接将数据持久化到指定的目录上,这个目录就称之为数据卷。
数据卷特点:数据卷的生命周期是独立于容器的生命周期的,也就是说容器的创建,运行,停止,删除等操作都和数据卷没有任何关系,因为它是一个特殊的目录,是用于帮助容器进行持久化的,简单而言,我们会将数据卷挂载到容器内,这样一来容器就能够将数据写入到相应的目录里面了,而且容器的退出并不会导致数据的丢失。
通常情况下,数据卷管理主要有两种方式:
- 通过bind的方式,直接将宿主机的目录直接挂载到容器内,这种方式比较简单,但是会带来运维成本,因为其依赖于宿主机的目录,需要对所有的宿主机进行统一管理。
- 将目录管理交给运行引擎
可以用docker create volume name 来创建一个数据卷
容器和VM之间的差异
- VM
每一个Guest OS(虚拟机)都有一个独立的内核,如centos,每个虚拟机都需要占用大量的空间,所以启动慢,运行慢。
这样就催生出了容器技术。 - 容器