一文掌握Docker基础知识

Posted Tuki_a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文掌握Docker基础知识相关的知识,希望对你有一定的参考价值。

持更中…

什么是Docker?

Docker 是一个开源的应用容器引擎,基于Go语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

容器不需要提前封装一个系统,它共享宿主机,理解为操作系统的一个进程。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)

官网:https://docs.docker.com/get-started/overview/

Docker前身LXC

LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。
与传统虚拟化技术相比,LXC的优势在于:
(1)与宿主机使用同一个内核,性能损耗小
(2)不需要指令级模拟;
(3)不需要即时(Just-in-time)编译;
(4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
(5)避免了准虚拟化和系统调用替换中的复杂性;
(6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享
总结:Linux Container是一种轻量级的虚拟化的手段。
Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟机,因为lxc是一种操作系统层次上的资源的虚拟化。

LXC与docker什么关系?
docker并不是LXC替代品,docker底层使用了LXC来实现,LXC将linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。
在LXC的基础之上,docker提供了一系列更强大的功能。

传统虚拟化与容器技术对比

VM和container对比:
虚拟机运行的是一个完整的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
容器在linux上本机运行,并与其他容器共享主机的内核,它运行一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
在这里插入图片描述
在这里插入图片描述

Docker容器的优势

对于开发人员:Build once、Run anywhere。
对于运维人员:Configure once、Run anything。

运维人员把容器做好,然后给开发人员,开发人员可以直接在上边写项目,然后可以直接上线。
Docker能够将应用程序与基础设施分开,以便可以快速交付软件。使用 Docker,可以像管理应用程序一样管理基础设施。通过利用 Docker 的快速交付、测试和部署代码的方法,可以显着减少编写代码和在生产中运行代码之间的延迟。

名词解释

镜像images
docker镜像就是一个只读模板,其中包括运行应用程序所需要的所有内容包含代码,运行时间,库、环境变量、和配置文件每个镜像有不同的标签(tag)。比如,一个镜像可以包含一个完整的centos,里面仅安装apache或用户的其他应用,镜像可以用来创建docker容器,用户可以直接从其他人那里下一个已经做好的镜像来直接使用。

容器containers
docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除、每个容器都是互相隔离的,保证安全的平台。可以将容器连接到一个或多个网络,为其附加存储,甚至可以根据其当前状态创建新映像。
可以控制容器的网络、存储或其他底层子系统与其他容器或主机之间的隔离程度。
容器由其映像以及在创建或启动它时提供给它的任何配置选项定义。
当容器被移除时,未存储在持久存储中的对其状态的任何更改都会消失。
当被运行时有镜像状态和用户进程,可以使用docker ps 查看。

守护进程Daemon / dockerd
Docker 守护进程侦听 Docker API 请求并管理 Docker 对象,例如图像、容器、网络和卷。守护进程还可以与其他守护进程通信以管理 Docker 服务。
Docker Client通过命令行与Docker Damon通信,完成Docker相关操作。

注册表registry
存储 Docker 镜像。Docker Hub 是一个任何人都可以使用的公共注册中心,Docker 默认配置为在 Docker Hub 上查找镜像。甚至可以运行自己的私有注册表。使用docker pull或docker run命令时,所需的映像将从配置的注册表中提取使用docker push命令时,映像会被推送到配置的注册表中

repostory仓库
仓库是集中存储镜像文件的地方,registry是仓库主从服务器。
仓库分为两种,公有参考,和私有仓库,最大的公开仓库是docker Hub,存放了数量庞大的镜像供用户下载,国内有docker pool。这里仓库的概念与Git类似,registry可以理解为github这样的托管服务。

Docker Compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
Compose 使用的三个步骤:
1、使用 Dockerfile 定义应用程序的环境。
2、使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
3、最后,执行 docker-compose up 命令来启动并运行整个应用程序。

Docker架构

Docker 使用客户端-服务器架构Docker客户端与 Docker守护进程对话, Docker守护进程负责构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一系统上运行,或者可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护进程使用 REST API、UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许使用由一组容器组成的应用程序。

通过上面名词解释我们掌握了一些基本概念,在此基础上,我们简单解读一下该图:
Docker Client通过命令行与Docker Damon(守护进程)通信。
客户端输入docker build命令后,守护进程收到后会执行去创建一个新的镜像。
客户端输入docker pull命令后,守护进程会从配置的注册表(即仓库)中提取用户所需的镜像并将其拉取到主机。
客户端输入docker run命令后,守护进程会根据要运行的容器,去找相应镜像然后在容器上运行。
在这里插入图片描述

镜像的分层结构

在这里插入图片描述
容器共享宿主机的Kernel,Base Image镜像提供的是最小的Linux发行版,同一docker主机支持运行多种Linux发行版(即base镜像之上的多层新的镜像)。
采用分层结构的最大好处是:共享资源!
新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。 比如:有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享
在这里插入图片描述
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。读取/修改/删除文件都会从镜像层依次从上至下查找,读到符合的就执行。
容器层记录对镜像的修改!!!所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。
一个镜像最多127层。

Docker仓库

Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器 (Register)来保存多个仓库,每个仓库又可以包含多个具备不同 tag的镜像。 Docker运行中使用的默认仓库是 Docker Hub 公共仓库。docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。

Registry 工作原理

一次docker pull 或 push背后发生的事情:
在这里插入图片描述
index服务主要提供镜像索引以及用户认证的功能。
当下载一个镜像的时候,首先会去index服务上做认证,然后查找镜像所在的registry的地址发回给 docker客户端,docker客户端再从registry下载镜像,在下载过程中registry会去index校验客户端token的合法性。index返回给registry客户端token,如果一样,将用户需要的返回给用户。
不同镜像可以保存在不同的registry服务上, 其索引信息都放在index服务上。

Docker Registry有三个角色,分别是index、registry和registry client。
index负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息
registry • 是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过 Index Auth service的Token的方式进行认证。
Registry Client • Docker充当registry客户端来维护推送和拉取,以及客户端的授权。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上是关于一文掌握Docker基础知识的主要内容,如果未能解决你的问题,请参考以下文章

程序员必备知识:一文掌握14种 UML 图

web前端面试高频考点——Vue的基本使用(一文掌握Vue最基础的知识点)

一文掌握 ZooKeeper 的核心知识

多图:一文带你入门掌握JVM所有知识点

多图:一文带你入门掌握JVM所有知识点

HashMap源码详解(一文掌握所有核心知识)