Docker笔记

Docker

  1. 基于Linux内核的Cgroup,Namespace,以及Union FS等技术,对进程进行封装和隔离,属于操作系统层面的虚拟化技术,由于隔离的进程独立于宿主和其他的隔离的进程,因此也成为容器。

  2. 最初实现时基于LXC,从0.7以后开始去除LXC,转而使用自行开发的Libcontainer,从1.11开始。则进一步演进为使用runCContainerd

  3. Docker在容器的基础上,进行了进一步的封装,从文件系统、网路互联到进程隔离等等,极大的简化了容器的创建和维护,使得Docker技术比虚拟技术更为轻便、快捷

应用的增量相比于项目是非常小的,应用容器出现之前文件是怎么分发的?
进行源代码编译,

  • 要有一个FileSever
  • 每个机器上要用一个agent,agent接受远程的指令
  • 重启

没有一个标准,统一做个事情,有了docker以后,分发的是一个运行环境,运行环境里有分层的机制,保证只要这个镜像你之前拉过,很多层会被不同的层reuse的,最大程度达到一个复用的目的,拉取镜像的时候只拉取动态的部分

容器的标准

Open Container Initiative(OCI) : 轻量级开放式管理组织(项目)

OCI主要定义两个规范

  • Runtime Specification
    • 文件系统包括如何解压到硬盘,共运行时运行。
  • Image Specification
    • 如何通过构建系统打包,生成镜像清单(Manifest)、文件系统序列化文件、镜像配置。

容器的主要特征

  • 安全性
  • 隔离性(Namespace)
  • 便携性
  • 可配额 (cgroup)

这四个之间的特性是什么?

Namespace
Namespace 的类型

[Namespace类型]{https://man7.org/linux/man-pages/man7/namespaces.7.html}

NamespaceFlagPageIsolates
CgroupCLONE_NEWCGROUPcgroup_namespaces(7)Cgroup root directory
IPCCLONE_NEWIPCipc_namespaces(7)System V IPC,POSIX message queues
CgroupCLONE_NEWCGROUPcgroup_namespaces(7)Cgroup root directory

Linux Namespace是一种Linux Kenel提供资源隔离的方案

  • 系统可以为进程分配不同的Namespace
  • 并保证不同的Namespace资源独立分配、进程彼此隔离,即不同Namespace下的进程互不干扰

Linux内核代码中Namespace的实现

  • 进程数据结构
  • Namespace数据结构
// 进程数据结构
struct task_struct {
    ...
    /* namespaces*/
    struct nsproxy *nsproxy;
}

// Namespace数据结构
struct nsproxy {
    atomic_t count;
    struct uts_namespace *uts_s;
    struct ipc_namespace *ipc_ns;
    struct mnt_namespace *mnt_ns;
    struct pid_namespace *pid_ns_for_children;
    struct net *net_ns;
    
}
Linux对Namespace 操作方法
  • clone

在创建新进程的系统调用时,可以通过flags参数指定需要新建的Namespace类型

Systemd会有一个Namespace,不同的Namespace彼此之间是隔离的,

所谓容器它没有虚拟化层,它没有从操作系统做的隔离,任何的进程都是主机上开辟的进程

Docker在做出让步,不得不去接OCI的标准,本身是内嵌Containerd

容器是一个通用称呼,Docker是容器的一种,基于容器技术实现的方案,但是Docker本身把容器带火了
,提起Docker就会认为是容器

  • Pid namespace
  • net namespace
  • ipc namespace

A服务去调用B,B是需要有一个网路地址的,

  • 当前系统的namespace

lsns

lsns -t <type>

  • 当前某些进程的namespace:

    ls -la /proc/<pid>/ns/

  • 进入某namespace运行命令:

    nsenter -t <pid> -n ip addr

nsenter 
    -n : 指定网络

namespace的练习

namespace只是struct中一个属性

namespace是不可以嵌套的,namespace是一个隔离环境

Cgroups

当需要搭建一个虚拟机的时候,需要进行资源管控,多少cpu。多少memory
一个进程要启动,需要指定多少cpu,多少memory,这些都是要进行限制死的,这个技术就是Cgroups

  • Cgroups(Control Groups)是Linux下用于对一个或一组进程进行资源管控和监控的机制;
  • 可以对诸如CPU使用时间、内存、磁盘I/O等进程所需的资源进行限制;
  • 不同资源的具体管理工作由相应的Ggroup子系统(Subsystem)来实现;
  • 针对不同类型的资源控制,只要将限制策略在不同的子系统上进行关联即可;
  • Cgroups在不同的系统资源管理子系统中以层级树(Hierarchy)的方式来组织管理:每个Cgroup都可以包含其他的子Group,因此子Cgroup能使用的资源除了受本Cgroup配置的参数限制,还受到父Cgroup设置的资源限制。

对于一个进程要想实现资源的可配额,最重要的是CPU、Memory、IO等等,所以Cgroups会有不同的子系统

cgroups实现了对资源的配额和度量

  • blkio:
  • cpu:
  • cpuacct:
  • cpuset:
  • devices:

上下游的依和网络都在一个隔离的环境


docker核心技术

Docker的文件系统

典型的Linux文件系统组成

  • Bootfs (boot file system)

    • Bootloader - 引导加载kernel
    • Kernel - 当kernel被加载到内存中后umount bootfs
  • rootfs (root file system)

    • /dev, /proc, /bin, /etc等标准目录和文件
    • 对于不同的Linux发行版,bootfs基本是一致的,但rootfs会有差别

Docker启动

Linux

  • 在启动后,首先将rootfs设置为readonly,进行一系列检查,然后将其切换为"readwrite"供用户使用。

Docker启动

  • 初始化时也是将rootfs以readonly方式加载并检查,然而接下来利用union mount的方式将一个readwrite文件系统挂载在readonly的rootfs之上
  • 并且允许再次将下层的FS(file system)设定为readonly并且向上叠加
  • 这样一组readonly和一个writeable的结构构成一个container的运行时态,每一个FS被称作一个FS层

对于Docker进程它是没有bootfs的,但每一个进程需要看到自己的文件系统,所以它有自己rootfs系统,复用主机的kernel,rootfs以容器驱动加载出来,被它的进程所拥有,这个进程看到的就是这个docker的rootfs

容器存储驱动

以OverlayFS为例

OverlayFS也是一种与AUFS类似的联合文件系统,同样属于文件级的存储驱动,包含了最初的Overlay和更新更稳定的overlay2

Overlay只有两层:uppper层和lower层,Lower层代表镜像层,upper层代表容器可写层

upper层和lower层会合并成一个合并层,用mount指定两个层级

每一个容器进程都会有一个自己的mntnamespace, 这个mntnamespacemountnamespace,这个容器文件系统看到的是和主机的系统文件是不一样的,是隔离的一个空间

容器本身是在主机上启动的一个进程,这个进程与其他的进程没有其他的差异,有了一个mntnamespace就不会对主机的文件系统有依赖 ,当有同名文件的时候以上层文件为主

containerd替换docker,目前docker也基于containerd实现了进程的管理

containerd--> shim --> runc

docker shim的父进程就是systemd

在独立pidnamespace里边

OverlayFS文件系统是怎么隔离的?

docker inspect是如何mount文件的

网络

网络有独立的netnamespace,

  • Null
  • Host
  • Container
  • Bridge(–net=bridge)

Null

  • 把容器放入独立的网络空间但不做任何网络配置;
  • 用户需要通过运行docker network命令来完成网配置

Host

  • 使用主机网络名空间,复用主机网络

Container

  • 重用其他容器的网络

Bridge(–net=bridge)

  • 使用Linux网桥和iptables提供容器互联,Docker在每台主机上创建一个名叫docker0的网桥,通过veth pair来连接该主机的每一个EndPoint.
### 回答1: 要下载Docker笔记,首先需要了解Docker是什么以及其使用场景。 Docker是一种开源的容器化平台,可以帮助用户打包、部署和运行应用程序。通过使用容器化技术,用户无需担心运行环境的差异,可以将应用程序和其依赖项打包到一个可移植的容器中,随时在不同的环境中运行。 要下载Docker笔记,可以按照以下几个步骤进行操作: 1. 首先,需要在计算机上安装Docker。可以从Docker官方网站(https://www.docker.com/)上下载适合自己操作系统的Docker安装包,并按照安装指南进行安装。 2. 安装完成后,需要启动Docker服务。根据操作系统的不同,可以在启动菜单或终端中找到Docker应用程序,并点击打开。在Docker控制台中,可以查看、管理容器以及进行其他操作。 3. 接下来,需要搜索并下载Docker笔记的镜像。可以使用Docker Hub(https://hub.docker.com/)这个官方的镜像仓库,搜索关键词以找到合适的笔记镜像。在搜索结果中,会显示镜像的名称、描述、标签等信息,选择一个合适的镜像。 4. 找到想要下载的笔记镜像后,可以使用Docker命令行工具或Docker控制台中的图形界面来下载镜像。通过输入命令`docker pull 镜像名称:标签`,即可下载对应的笔记镜像到本地。 5. 下载完成后,可以使用`docker images`命令在本地查看已下载的镜像列表。根据下载的笔记镜像的名称和标签,可以使用`docker run`命令来创建并启动一个容器,从而运行笔记。 通过以上步骤,就可以成功下载Docker笔记并在本地运行。希望这些信息对您有帮助! ### 回答2: 要下载Docker笔记,首先需要知道从哪里获取这些笔记Docker有一个官方文档网站,其中包含了大量关于Docker的技术文档、教程和示例以及各种使用场景的说明。用户可以访问Docker官方网站,在文档部分进行浏览和搜索,找到所需的笔记。 在Docker官方文档网站上,用户可以按照主题、标签或关键字进行检索,以找到相关的笔记。网站还提供了各种文件格式的下载选项,包括PDF、EPUB和HTML版本,用户可以根据自己的使用习惯选择适合的格式进行下载。 此外,还有一些第三方资源库和网站提供了Docker相关的笔记下载。例如GitHub上有很多开源项目,其中包含了Docker的使用笔记和示例代码。用户可以通过在GitHub上搜索关键字"Docker笔记"或"Docker notes"来找到相关的项目,然后根据项目的说明进行下载。 总之,下载Docker笔记可以通过Docker官方文档网站或第三方资源库进行。用户可以根据自己的需求和偏好选择下载适合自己的格式和来源。 ### 回答3: 要下载 Docker 笔记,首先需要确保已经安装了 Docker 客户端工具。然后按照以下步骤进行下载: 1. 打开终端或命令提示符,输入以下命令来下载 Docker 笔记Docker 镜像: ``` docker pull [镜像名称] ``` 这里的 `[镜像名称]` 是 Docker Hub 上提供的 Docker 镜像名称,可以根据需要搜索并选择合适的镜像。 2. 等待镜像下载完成后,使用以下命令来创建和运行一个 Docker 容器,并将笔记下载到本地: ``` docker run -it --name [容器名称] [镜像名称] [下载命令] ``` 这里的 `[容器名称]` 是用于标识容器的名称,`[下载命令]` 是具体的下载命令,可以根据下载方式的不同进行相应的设置。 3. 等待下载完成后,可以使用以下命令来停止并删除容器: ``` docker stop [容器名称] docker rm [容器名称] ``` 这里的 `[容器名称]` 是之前创建容器时指定的名称。 通过以上步骤,你就可以成功下载 Docker 笔记到本地了。记得根据实际需求选择适合的 Docker 镜像和下载命令,同时也可以通过 Docker Hub 上的文档和社区提供的资源,了解更多有关 Docker 的使用方法和技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值