docker——基础知识与理论架构(1)

本文详细介绍了Docker的基本概念,包括镜像、容器和仓库,并探讨了使用Docker的原因,如提高资源利用率、加快应用启动速度、确保环境一致性。同时,对比了Docker与虚拟机的区别,强调了Docker在资源隔离和效率上的优势。文章最后提到了Docker的安装和基础命令,展示了Docker在简化应用部署和管理方面的便捷性。
摘要由CSDN通过智能技术生成

1.什么是docker?

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中
然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化
容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。
一个完整的Docker有以下几个部分组成

DockerClient客户端
Docker Daemon守护进程
Docker Image镜像
DockerContainer容器 

2.Docker的三个基本概念

Image(镜像)
Container(容器)
Repository(仓库)

(1)Image Definition(镜像):
镜像(Image)就是一堆只读层(read-only layer)的统一视角:
在这里插入图片描述
从左边我们看到了多个只读层,它们重叠在一起。除了最下面一层,其它层都会有一个指针指向下一层。
这些层是Docker内部的实现细节,并且能够在主机(译者注:运行Docker的机器)的文件系统上访问到。
统一文件系统(union file system)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,
这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的右边看到这个视角的形式。
你可以在你的主机文件系统上找到有关这些层的文件。需要注意的是,在一个运行中的容器内部,这些层是不可见的。
在我的主机上,我发现它们存在于/var/lib/docker/aufs目录下。
(2)Container Definition(容器):
容器(container)的定义和镜像(image)几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
在这里插入图片描述
容器 = 镜像(只读) + 读写层。并且容器的定义并没有提及是否要运行容器。

(3)Running Container Definition(运行态容器):
一个运行态容器(running container)被定义为一个可读写的统一文件系统加上隔离的进程空间和包含其中的进程。
下面这张图片展示了一个运行中的容器。
在这里插入图片描述
正是文件系统隔离技术使得Docker成为了一个前途无量的技术。
一个容器中的进程可能会对文件进行修改、删除、创建,这些改变都将作用于可读写层(read-write layer)。
在这里插入图片描述
(4)Repository (仓库):
Docker 仓库是集中存放镜像文件的场所。镜像构建完成后,可以很容易的在当前宿主上运行,
但是, 如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,
Docker Registry (仓库注册服务器)就是这样的服务。有时候会把仓库 (Repository) 和仓库注册服务器 (Registry) 混为一谈,并不严格区分。Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
实际上,一个 Docker Registry 中可以包含多个仓库 (Repository) ,每个仓库可以包含多个标签 (Tag),每个标签对应着一个镜像。
所以说,镜像仓库是 Docker 用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。
我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
仓库又可以分为两种形式

public(公有仓库)
private(私有仓库)
Docker Registry 公有仓库是开放给用户使用、允许用户管理镜像的 Registry 服务。
一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。
Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。
当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,
这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。

3.为什么要使用docker?

(1)更高效的利用系统资源
由于容器不需要进行硬件虚拟及运行完整操作系统等额外开销,Docker对系统资源的利用率更高。
无论是应用执行速度、内存损耗或者文件存储速度,都要比传统的虚拟机技术更高效。
因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

(2)更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行与宿主内核,无需启动完整的操作系统,
因此可以做到秒级、甚至毫秒级别的启动时间。大大的节约了开发、测试、部署的时间。

(3)一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些BUG并未在开发过程中被发现。
而Docker的镜像提供了除了内核外完整的运行时环境,确保了应用运行环境得一致性,
从而不会再出现“这段代码在我机器上没问题”这类问题。

(4)持续交付和部署
对开发和运维人员来说,最希望的就是一次性创建或配置,可以在任意地方正常运行。
使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过DockerFile来进行镜像构建,
并结合 持续集成系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署系统进行自动部署。
而使用DockerFile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,
帮助更好的生产环境中部署该镜像。

(5)更轻松的迁移
由于Docker确保了执行环境得一致性,使得应用的迁移更加容易。
Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。
因此用户可以很轻易的将在一个平台上运行的应用迁移到另一个平台,而不用担心运行环境得变化导致应用无法正常运行的情况。

(6)更轻松的维护和扩展
Docker使应用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,
也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变的非常简单。
此外,Docker团队同各个开源项目团队一起维护了一大批高质量的官方镜像,
既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

4.容器和虚拟机的区别

我们在理解 docker 之前,首先我们得先区分清楚两个概念,容器和虚拟机

我们用的传统虚拟机如 VMware , VisualBox 之类的需要模拟整台机器包括硬件,每台虚拟机都需要有自己的操作系统,
虚拟机一旦被开启,预分配给它的资源将全部被占用。 每一台虚拟机包括应用,必要的二进制和库,以及一个完整的用户操作系统。
而容器技术是和我们的宿主机共享硬件资源及操作系统,可以实现资源的动态分配。
容器包含应用和其所有的依赖包,但是与其他容器共享内核。容器在宿主机操作系统中,在用户空间以分离的进程运行。

容器技术是实现操作系统虚拟化的一种途径,可以让您在资源受到隔离的进程中运行应用程序及其依赖关系。
通过使用容器,我们可以轻松打包应用程序的代码、配置和依赖关系,将其变成容易使用的构建块,
从而实现环境一致性、运营效率、开发人员生产力和版本控制等诸多目标。
容器可以帮助保证应用程序快速、可靠、一致地部署,其间不受部署环境的影响。
容器还赋予我们对资源更多的精细化控制能力,让我们的基础设施效率更高。
通过下面这幅图我们可以很直观的反映出这两者的区别所在。
在这里插入图片描述
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案
而 Linux 容器是 Linux 发展出了另一种虚拟化技术,简单来讲, Linux 容器不是模拟一个完整的操作系统
而是对进程进行隔离,相当于是在正常进程的外面套了一个保护层
对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离
Docker 将应用程序与该程序的依赖,打包在一个文件里面
运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。
有了 Docker ,就不用担心环境问题。
总体来说, Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。
容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

5.Docker的优势

Docker相比于传统虚拟化方式具有更多的优势:
在这里插入图片描述
在这里插入图片描述

6.下载docker安装包

在这里插入图片描述

7. 常用的Docker基础命令

在这里插入图片描述
补充:docker rmi
docker rmi 命令会移除构成镜像的一个只读层。
你只能够使用docker rmi来移除最顶层(top level layer)(也可以说是镜像),也可以使用-f参数来强制删除中间的只读层。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值