docker基础知识

一.简介

1.概念
容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。

2.与虚拟机的区别
容器在 Host 操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。
传统的虚拟化技术,比如 VMWare, KVM, Xen,目标是创建完整的虚拟机。

3.优势
容器共享同一个 Host OS,这使得容器在体积上要比虚拟机小很多。另外,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快,开销更小,也更容易迁移。

容器使软件具备了超强的可移植能力:Build Once, Run Anywhere

二.组成

1.Docker 的核心组件

  • Docker 客户端 - Client
    最常用的 Docker 客户端是 docker 命令行工具,也可以通过 REST API 与服务器通信
  • Docker 服务器 - Docker daemon
    Docker daemon 运行在 Docker host 上,负责创建、运行、监控容器,构建、存储镜像。
    默认配置下,Docker daemon 只能响应来自本地 Host 的客户端请求。如果要允许远程客户端请求,需要在配置文件中打开 TCP 监听
  • Docker 镜像 - Image
    可将 Docker 镜像看着只读模板,通过它可以创建 Docker 容器。
  • 镜像仓库 - Registry
    存放 Docker 镜像的仓库,分私有和公有两种。
    Docker Hub(https://hub.docker.com/) 是默认的 Registry,由 Docker 公司维护
  • Docker 容器 - Container
    Docker 容器就是 Docker 镜像的运行实例。
    对于应用软件,镜像是软件生命周期的构建和打包阶段,而容器则是启动和运行阶段。

Docker 采用的是 Client/Server 架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。
客户端和服务器可以运行在同一个 Host 上,客户端也可以通过 socket 或 REST API 与远程的服务器通信。

三.base镜像

我们希望镜像能提供一个基本的操作系统环境,用户可以根据需要安装和配置软件。这样的镜像我们称作 base 镜像。

1.base 镜像有两层含义

  • 不依赖其他镜像,从 scratch 构建。
  • 其他镜像可 以之为基础进行扩展。

所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ubuntu, Debian, CentOS 等。

2.base镜像的组成
Linux 操作系统由内核空间和用户空间组成

内核空间是 kernel
用户空间的文件系统是 rootfs,包含我们熟悉的 /dev, /proc, /bin 等目录。
不同 Linux 发行版的区别主要就是 rootfs。

对于 base 镜像来说,底层直接用 Host 的 kernel,自己只需要提供 rootfs 就行了。
而对于一个精简的 OS,rootfs 可以很小,只需要包括最基本的命令、工具和程序库就可以了。

容器只能使用 Host 的 kernel,并且不能修改。
所有容器都共用 host 的 kernel,在容器中没办法对 kernel 升级。

四.分层结构

docker基础知识
1.分层结构
Docker 支持通过扩展现有镜像,创建新的镜像。
新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。

分层结构最大的一个好处就是 - 共享资源。
比如:有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享,

2.容器层
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。

在容器层中,用户看到的是一个叠加之后的文件系统:

  • 添加文件
    在容器中创建文件时,新文件被添加到容器层中。
  • 读取文件
    在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。
  • 修改文件
    在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
  • 删除文件
    在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。

只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。

容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

参考:《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html