【Docker】Docker学习01 | 什么是docker?

本文首发于 ❄️慕雪的寒舍

因为本人没有学习过docker,虽然部署过很多镜像,但是对于docker底层的实现一概不知。趁学习一个新项目的契机,将docker的相关概念了解清楚。

安装docker的教程请查看 Linux主机安装docker。

如果你想和我一起学习docker,请关注本站的编程学习/Docker学习专栏。后续和docker概念相关的内容都会放到这个分类里面,而折腾docker镜像和开源软件的内容则保留在编程学习/Docker真好玩中。

1.docker和虚拟机的区别

1.1 简述

虚拟机和Docker都是在原有主机的基础上添加了抽象层,通过这些抽象层来实现特定的功能。

这就好比C语言中的文件操作实际上封装了Linux和Windows的文件系统调用接口。这一层封装就是一层抽象层,通过封装,C语言实现了跨平台的统一文件函数接口。

image.png

虚拟机:虚拟机是通过Hypervisor(虚拟机管理系统)来虚拟出网卡、CPU、内存等虚拟硬件,再在其上方建立一个虚拟机。每个虚拟机都有独立的操作系统,都有自己独立的系统内核。

docker容器:容器是利用linux下的namespace,将文件系统、进程、网络、设备等资源进行一定隔离,再使用cgroup对容器权限、资源进行限制(比如限制某个容器只能占用最多512MB的内存),最终让容器之间互不影响,容器无法影响宿主机。这些操作都是由宿主机的Docker Engine来实现和管理的。

image.png

上图源自 微软官方文档

1.2 什么是GuestOS

GuestOS(Guest Operating System)是指在虚拟化环境中运行的操作系统。

在虚拟化技术中,物理服务器上的虚拟化软件(如VMware、KVM、VirtualBox等)可以创建一个或多个虚拟的计算环境,每个环境都可以独立运行一个操作系统,这个操作系统就是 GuestOS。

1.3 什么是namespace

好比C++中的namespace,Linux内核中的namespace可以限制某个进程能“看到”的资源。

它是一种将全局系统资源划分为独立单元的资源隔离方法,对文件系统、进程、网络、设备等资源进行隔离,使得在不同命名空间中运行的进程看到的资源是不同的,彼此之间相互隔离,容器内的进程认为它们运行在独立的环境中,而不会看到主机上其他容器的影响。

1.4 什么是cgroup

cgroup是一种用于限制和隔离一个或一组进程对系统资源使用的机制,将一组进程组织在一个控制组中,为这个控制组分配特定的资源限制与优先级,包括 CPU资源、内存、网络等。确保容器在共享主机上合理利用系统资源,避免资源竞争和过度使用。

2.docker的优势

docker因自身的特性,相比虚拟机有很多优势:

  1. 运行在容器上的Docker的程序,直接使用的都是宿主机的硬件资源,而且Docker比虚拟机有更少的抽象层,因此在cpu、内存、利用率上,Docker将会在效率上具有更大的优势。(效率高)
  2. Docker直接利用宿主机的系统内核,避免了虚拟机启动时所需要的系统引导时间和操作系统运行的资源消耗,利用Docker能够在几秒钟之内启动大量的容器,是虚拟机无法办到的。快速启动低资源消耗的优点,使Docker在弹性云平台自动运维系统方面具有很好的应用场景。(速度快)
  3. 容器的启动时间是秒级的,大量节约开发、测试、部署的时间。而且因为Docker以统一的方式进行操作和部署,更方便自动化持续集成/持续部署。
  4. 还有一个非常关键的点,就是Docker能够高效地部署和扩容,Docker容器几乎可以在任意平台上运行,包括虚拟机、物理机、公有云、私有云、个人电脑、服务器等,这种兼容性,可以让用户把一个应用程序从一个平台直接迁移到另外一个平台。(部署简单)

但是,虚拟机的安全性比容器好一些,docker与宿主机共享内核、文件系统等资源,更有可能对其他容器、宿主机造成影响。

3.docker的基本组成

3.1 简述

docker包括客户端docker client、服务端docker host,以及远程镜像仓库docker registry。

平时我们使用的docker命令(包括docker-compose工具),其实操作的都是 docker cli 客户端,它的作用是把这些命令发送给本地的 docker.sock 服务端,让服务端来执行docker容器的创建、运行、维护等操作。

  • 镜像 Images:可以认为是一个docker构建环境的系统模板,镜像中包括相关的依赖项、项目文件、如何开始运行等信息。镜像是由一层一层的文件系统构建而成的,每一层文件系统是下一层的增量变化。每个镜像都是静态的,被创建后就无法改变;
  • 容器 Container:容器是某个正在运行的镜像,是镜像的实体。同一个镜像可以创建出多个不同的容器,且不同容器之间通过Linux内核的namespace和cgroup等技术实现相互隔离,拥有自己独立的文件系统、进程地址空间、网络空间等。

有了镜像,我们可以在不同的Linux主机上,创建容器来统一项目运行的环境,避免在不同系统上安装项目依赖项的繁琐。这可以降低项目部署的难度,提高效率。同时,让项目在容器中运行,也能减少对宿主机的影响,可以避免出现两个不同的项目依赖项冲突而无法运行的情况。

本项目使用docker,就是为了实现不同机器上运行环境的统一,毕竟整个项目涉及到了很多依赖项,如果一个一个安装的话,较为麻烦且容易出错。

image.png

3.2 docker镜像是什么?

Docker 镜像 是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像 不包含 任何动态数据,其内容在构建之后也不会被改变。

我们都知道,操作系统分为 内核用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。

Docker镜像是由多层的文件系统构建而成的,每一层文件系统是下一层的增量变化。对于Ubuntu/CentOS这种基础镜像而言,它们一般都只有一层。但对于基于这两个镜像构建的其他Docker镜像,则会出现多层,具体取决于镜像构建使用的DockerFile。

3.3 docker容器是什么?

容器是镜像的实体。

容器在运行的时候,会在镜像文件的只读层上方创建一个读写层,并在这个读写层中进行文件的读写和运行。同时容器也可以暴露出端口,或与宿主机的某个文件/文件路径绑定,来对外提供网络服务,和数据的持久化。

4.docker run的运行过程

当我们执行 docker run 命令创建一个容器的时候,会执行如下操作。

image.png

当本机找不到指定的镜像时,会自动去docker hub或者预先配置好的docker镜像源仓库中,查询这个镜像并进行下载(查询不到则提示“镜像不存在”)。找到指定的镜像后,会自动执行docker pull操作将镜像下载至本地,随后以该镜像,按docker run命令给定参数创建容器并运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408035.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP的连接建立及报文段首部格式

粘包问题: 原因:TCP流式套接字;数据与数据之间没有边界;导致可能多次的数据粘到一起。 解决办法: 规定一些数据与数据之间的间隔符,如:"\aa\", "\r\n"。指定要发送的数据…

exec函数簇

一、main 函数的参数定义 在C语言中,main 函数是程序执行的入口点。main 函数可以接受参数,这些参数通常用于从命令行接收输入。main 函数的参数定义通常遵循以下形式: int main(int argc, char *argv[]) 或者等价地: int mai…

91. UE5 RPG 实现拖拽装配技能以及解除委托的绑定

在上一篇文章里,实现了通过选中技能,然后点击下方的装备技能插槽实现了技能的装配。为了丰富技能装配功能,在这一篇里,我们实现一下通过拖拽技能,实现拖拽功能,我们需要修改两个用户控件,一个就…

杰发科技AC7840——CAN通信简介(8)_通过波特率和时钟计算SEG_1/SEG_2/SJW/PRESC

通过公式计算 * 波特率和采样点计算公式:* tSeg1 (S_SEG_1 2); tSeg2 (S_SEG_2 1).* BandRate (SCR_CLK / (S_PRESC 1) / ((S_SEG_1 2) (S_SEG_2 1))), SCR_CLK 为CAN 模块源时钟* SamplePoint (tSeg1 / (tSeg1 tSeg2)). {0x0D, 0x04, 0x04, 0x3B},…

文件IO和多路复用IO

目录 前言 一、文件 I/O 1.基本文件 I/O 操作 1.1打开文件 1.2读取文件内容 (read) 1.3写入文件 (write) 1.4关闭文件 (close) 2.文件指针 二、多路复用 I/O 1.常用的多路复用 I/O 模型 1.1select 1.2poll 1.3epoll 2.使用 select、poll 和 epoll 进行简单的 I/O…

软件测试最全面试题,了解一下

一、前言 近期有不少同学,朋友问我什么是软件测试,它是干什么的,我适不适合做、这行发展前景、工资怎么样等等等…在这里我把问题总结一下,整理一篇文章出来。 我也看过很多贴吧、论坛,在入行之前对这块都是迷茫的&a…

数据结构----栈

一丶概念 只能在一端进行插入和删除操作的线性表(又称为堆栈),进行插入和删除操作的一端称为栈顶,另一端称为栈底 二丶特点 先进后出 FILO first in last out 后进先出 LIFO last in first out 三丶顺序栈 逻辑结构&…

Nginx: 配置项之http模块connection和request的用法以及limit_conn和limit_req模块

connection和request connection 就是一个连接, TCP连接 客户端和服务器想要进行通信的话,有很多种方式比如说, TCP的形式或者是UDP形式的通常很多应用都是建立在这个TCP之上的所以, 客户端和服务器通信,使用了TCP协议的话,必然涉及建立TCP连…

Java JNA调用C函数常见问题及解决方法

目录 1 undefined symbol:xxx2 Java映射C数组乱码3 Java使用String接收不到C函数返回的char*4 Unable to load DLL xxx.dll5 java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序6 无效的ELF头7 Structure array elements must use contiguous memory8 j…

msvcp120.dll丢失是怎么回事?几种靠谱修复msvcp120.dll的方法

在使用基于Windows的计算机进行日常工作或娱乐时,您可能会遇到一个错误消息:“无法启动此程序,因为计算机中丢失msvcp120.dll。”这样的提示通常在尝试启动某些程序或游戏时弹出,导致应用无法正常运行。这个问题通常与系统中的某个…

CSS3页面布局-三栏-固定宽度布局

布局的基本概念 多栏布局三种基本实现方案:固定宽度,流动,弹性。 固定宽度布局:大小不会随用户调整浏览器窗口大小。 一版960-1100,960常见,可以被3,4,5,6,8,10,12,16整除。 流动布局:大小会随用户调整…

数据结构——链式二叉树的实现与分治编程思维(c语言实现)

目录 前言: 1.前置说明 2.链式二叉树的遍历 2.1 前序,中序及后续遍历 2.2 前序遍历实现 2.3 中序遍历实现 2.4 后续遍历实现 3.结点个数以及高度等 3.1 结点个数 3.2 结点高度 3.3 叶子结点的个数 前言: 在之前的学习中&…

【图解秒杀系列】秒杀技术点——多级缓存、分层过滤

【图解秒杀系列】秒杀技术点——多级缓存、分层过滤 多级缓存本地缓存分布式缓存 分层过滤 多级缓存 多级缓存在秒杀系统中是非常重要的一个技术点,是应对秒杀场景瞬时高并发读请求的一种有效手段。通过在数据库前面加入多个缓存层,达到过滤掉大多数读请…

优惠券秒杀项目

一、添加优惠券的同时,将优惠券信息,以及用户列表放到redis中 Override Transactional public void addSeckillVoucher(Voucher voucher) {// 保存优惠券save(voucher);// 保存秒杀信息SeckillVoucher seckillVoucher new SeckillVoucher();seckillVou…

easyexcel--多sheet页导入导出

多sheet页导出 核心代码就是下图里面的,使用EasyExcel.writeSheet创建一个sheet,然后用excelWriter写入就行了,很简单 GetMapping("downloadMultiSheet")public void downloadMultiSheet(HttpServletResponse response) throws IOException {…

【Qt】输入类控件QDateTimeEdit

目录 输入类控件QDateTimeEdit 例子:实现日期计算器 输入类控件QDateTimeEdit QDate Edit作为日期的微调框 QTime Edit作为时间的微调框 QDateTimeEdit作为时间日期的微调框 下面主要讲解QDateTimeEdit: 核心属性 属性说明 dateTime 时间⽇期的值.…

【Hot100】LeetCode—101. 对称二叉树

目录 1- 思路借助队列 2- 实现⭐101. 对称二叉树——题解思路 3- ACM 实现 原题连接&#xff1a;101. 对称二叉树 1- 思路 借助队列 1- 创建队列&#xff1a;Queue<TreeNode> queue&#xff0c;初始化加入 root.left 和 root.right2- 判断逻辑&#xff1a;while(!queu…

软件开发者的首选:最佳Bug测试工具Top 10

本篇文章介绍了以下软件bug测试管理工具&#xff1a;PingCode、Worktile、Test360、禅道、码云Gitee、优云测试、Jira、GitHub、Axosoft、Bugzilla。 在开发过程中&#xff0c;Bug的管理往往是最让人头疼的问题之一。小问题积累起来不仅会拖延项目进度&#xff0c;还可能影响到…

如何优雅处理异步组件加载:Vue 3 的 Suspense 特性

在日常开发中&#xff0c;我们可能会遇到网络不佳或内容加载时间较长的情况。如果当前页面没有任何内容提示&#xff0c;用户的体验非常糟糕&#xff0c;可能会反复刷新以便加载成功。因此&#xff0c;我们需要给用户提供一个加载中的效果&#xff0c;告知用户“我在努力加载中…

基于单片机的人体健康监测系统的设计

本设计以STM32F103C8T6单片机作为主控&#xff0c;通过MAX30102采集心率、血氧值&#xff0c;通过MSP20血压采集模块检测血压值&#xff0c;通过MLX90614红外体温采集模块检测体温值。OLED屏可以显示以上检测的信息&#xff0c;并可以通过蓝牙模块将信息发送给手机APP。当检测值…