Docker (1) 基础概念

Docker是一个开源应用容器引擎,允许开发者打包应用及其依赖到镜像中,实现轻量级的虚拟化。容器是进程级别的隔离,拥有自己的运行环境,但共享宿主机资源。镜像是容器的基础,由分层的UnionFS构建,实现资源复用。与传统虚拟机不同,Docker不创建完整的操作系统环境,而是隔离程序运行的环境,更轻量、启动更快。
摘要由CSDN通过智能技术生成

Docker 是什么

docker是一个软件,是一个运行与linux和windows上的软件,用于创建、管理和编排容器;

docker平台就是一个软件集装箱化平台,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,也可以实现虚拟化,并且容器之间不会有任何接口。

关系示意图

容器

容器是什么

容器是一个轻量级的沙箱,运行起来本身是一个进程。每个容器都有一套自己的运行环境,可以理解为每个容器都有一个自己的简化版的操作系统环境。

用来运行软件包中的特定程序,并且程序的运行环境配置,依赖等都封装在其中,使得不需要把过多的精力放在环境问题上。与镜像的关系,就如类与实例之间的关系、源代码与运行程序之间的关系。

容器与宿主机之间的关系

所有的容器都会共享宿主机的资源。并可以对容器实例进行可用宿主机资源的临界配置,比如 CPU 可调度率、可用内存、磁盘空间等。

容器与宿主机之间的关系

容器隔离依赖的内核功能

  1. namespace:Linux 内核中提供的一种功能。用来对内核资源进行分区,不同命名空间中的进程无法看到其他命名空间中的资源。隔离的资源种类有很多,具体可以详细学习。

  2. cgroup:全称 control group,Linux 内核中提供的一种可以限制不同进程组可以使用的物理硬件资源的机制。

  3. rootfs:docker 容器内部的文件目录。当我们进入一个容器实例后,可以查看到的文件系统就是 rootfs,而 rootfs 基于 bootfs 层的。

    • bootfs(boot file system) 引导文件系统:bootfs 由 bootloader 与 kernal 组成,计算机启动时会加载 bootfs,通过 bootloader 将 kernal 加载到内存。这时内存的使用权从 bootfs 转移给了 kernal,并卸载 bootfs。
    • rootfs (root file system) 在 bootfs 之上,就是各种不同的操作系统发行版,比如Ubuntu,Centos等。实际上就是不同操作系统的所有文件与目录,通常包含一个操作系统运行时所需的必要文件,如 /dev、/proc、/bin、/etc、/lib、/usr、/tmp 。(docker 镜像的最底层就是 bootfs)
    • 一个精简的 OS 的 rootfs 是非常小的,只要有最基本的命令、依赖程序库就可以了。因为底层依赖宿主机的 kernal,只需要提供自己的 rootfs。不同精简的 OS 可以公用宿主机的 bootfs。

bootfs与rootfs

镜像

镜像是什么

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

镜像的分层

当我们通过 pull 命令拉取镜像时,可以发现有多次的 pull complete。这是因为一个镜像是分为多层(layer)的,会依次下载镜像的多个层。为什么要这么做呢?这要说到 docker 的基础:联合文件系统(Union FS)
联合文件系统(Union FS):一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。
Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像,可以制作各种具体的应用镜像。从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

为什么要分层

使得资源可以被共享,每个镜像的不同层都可以被其他镜像复用的。例如,A、B 镜像都是 Base 镜像的某一层的改版,那么在磁盘中只保留一份 Base 镜像就可以为 A、B镜像使用。

镜像层与容器层

容器实例启动时,一个可读写的层被追加到顶层:容器层。而容器层之下都是仅可读的镜像层。所以对于容器的改动,比如增删改文件都会发生在容器层。

若想要修改镜像层的文件,那么会采用 Copy-On-Write 的策略,Copy 文件到容器层修改后保存。读取则正常直接读取即可。

镜像层与容器层

Dockfile 中的每条指令都会新建一层,每次只会记录本层的修改。但对于容器的改动,比如增删改文件都会发生在容器层。

例如:

FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py

Dockerfile分层

传统虚拟机 与 docker 的区别

docker 只是隔离运行程序之间的环境,运行时依赖的仍是宿主机的操作系统、系统资源。而不是像传统虚拟机会实实在在的构建一套完整、重量的 OS 环境。所以 docker 中容器更轻量,启动速度更快,更好的能利用宿主机系统资源。

虚拟机与docker的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值