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

news/2024/9/18 12:39:01/ 标签: docker, 学习, 容器

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

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

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

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

docker_9">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资源、内存、网络等。确保容器在共享主机上合理利用系统资源,避免资源竞争和过度使用。

docker_45">2.docker的优势

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

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

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

docker_56">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

docker_75">3.2 docker镜像是什么?

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

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

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

docker_83">3.3 docker容器是什么?

容器是镜像的实体。

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

docker_run_90">4.docker run的运行过程

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

image.png

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


http://www.ppmy.cn/news/1515440.html

相关文章

【计算机网络】网络版本计算器

此前我们关于TCP协议一直写的都是直接recv或者read,有了字节流的概念后,我们知道这样直接读可能会出错,所以我们如何进行分割完整报文?这就需要报头来解决了! 但当前我们先不谈这个话题,先从头开始。 将会…

[Algorithm][综合训练][mari和shiny][重排字符串]详细讲解

目录 1.mari和shiny1.题目链接2.算法原理详解 && 代码实现 2.重排字符串1.题目链接2.算法原理详解 && 代码实现 1.mari和shiny 1.题目链接 mari和shiny 2.算法原理详解 && 代码实现 自己的版本:三层循环暴力枚举 --> 超时 --> 40% …

Android如何高效的加载大型位图

图片有各种形状和大小。在很多情况下,它们的大小超过了典型应用界面的要求。例如,系统“图库”应用会显示使用 Android 设备的相机拍摄的照片,这些照片的分辨率通常远高于设备的屏幕密度。 鉴于使用的内存有限,理想情况下您只希望在内存中加载较低分辨率的版本。分辨率较低…

【记录】基于Windows系统安装rust环境的过程

到官网下载安装包【入门 - Rust 程序设计语言 (rust-lang.org)】 ![[Pasted image 20240703142911.png]] 选择1,快速安装 选择编译配置,1为标准 安装完成 验证是否安装完毕 rustc --versioncargo --version验证成功!

从0到1使用webpack搭建react脚手架

背景 好多前端童鞋工作多年依然不会使用webpack搭建react脚手架,本文就介绍下如何从零开始搭建一个属于你自己的前端脚手架,提高自己的工程化实力,同时也提高团队的开发效率。 一、基础配置 目标:可以启动最简单的react项目 初…

el-table 表格自定义添加表格数据后自动滚动到最底部

动态表格,可以新增行列数,为了用户体验,新增后超出表格流体高度后,自动滚动到最下方 需要element-plus如下api 代码如下: const addCapacity () > {inputList.value.push({name: "",desc: "&quo…

Macos M1 IDEA本地调试 HBase 2.2.2

# 1. 前提 执行 mvn clean package assembly:single -DskipTests没问题,并在hbase-assembly/target目录下生成hbase-2.2.2-bin.tar.gz 文件夹 证明Maven 下载依赖没问题 1.1 报错 1 这里应该是报错找不到 com.google.protobuf:protoc:exe:osx-aarch_64:3.5.1 …

Django 框架中 select_related 和 prefetch_related的区别

在Django框架中,select_related 和 prefetch_related 是两个优化数据库查询性能的非常重要的方法,特别是在处理外键关联查询时。尽管它们的目的相似,但在处理方式和适用场景上有所不同。 select_related select_related 主要是用于解决“一…

Java SpringBoot+Vue实战教程:如何搭建高中素质评价档案系统?

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

基于51单片机的电动式百叶窗proteus仿真

地址: https://pan.baidu.com/s/1ptXdnVxytPadcE7kOT9MwA 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…

iOS Native与JS通信:JSBridge

文章目录 一、简介二、JS 调用 Native1.使用 URL Schemea.UIWebViewb.WKWebView 2.使用 JavaScriptCore (iOS 7)3.使用 WKWebView 和 WKScriptMessageHandler (iOS 8) 三、Native 调用 JS1.使用 UIWebView2.使用 WKWebView3.使用 JavaScriptCore (iOS 7) 一、简介 对于移动应用…

mysql在k8s环境里安装及搭建主从架构

1、环境准备 k8s集群,版本1.27.0 2、搭建nfs服务器 本次用的k8smaster节点作为nfs服务器,因为需要在两个工作节点上连接nfs,所以工作节点上也要安装nfs yum install -y nfs-utils 我们直接在nfs服务器(k8s-master)当中创建这三个目录并写入…

Linux--数据链路层(macarp)

目录 1.认识以太网 2.以太网帧格式 3.模拟一次局域网通信(交换机) 4.认识 MAC 地址 对比理解 MAC 地址和 IP 地址 5.认识MTU MTU 对 IP 协议的影响 MTU 对 UDP 协议的影响 MTU 对于 TCP 协议的影响 6.ARP协议 ARP 协议的作用及原理 ARP 数据报的…

前端面试宝典【设计模式】【4】

在前端开发的世界里,每一次面试都是一次机遇,也是一次挑战。 你是否曾因技术深度不够而错失良机? 或是面对最新的技术趋势感到迷茫? 我们的【前端面试宝典】正是为此而来。 由拥有多年一线实战经验的资深工程师亲自授课,结合最新的行业动态与实战案例,旨在全面提升你的技…

BurpSuite2024.7.3专业版

前言 Burp Suite是一个无需安装软件,下载完成后,直接从命令行启用即可。开箱即可使用支持LInux/Windows/Mac 01更新介绍 2024.7.13版本界面大改动此版本引入了重大的性能升级、对拦截功能的重大增强,以及在审计项目表中新增了扫描插入点列。…

电路笔记(PCB):数字滤波电路的拉普拉斯变换与零极点分析

拉普拉斯变换基础 拉普拉斯变换 拉普拉斯变换是一种积分变换,用于将一个时间域的函数(通常是信号或系统的响应)转换为一个复频域的函数。这种变换可以简化许多微分方程和线性系统分析的过程。其定义为: L { f ( t ) } F ( s )…

PyCharm汉化:简单一步到胃!PyCharm怎么设置中文简体

最近在弄python的项目 一起加油哦 步骤: PyCharm的汉化可以通过两种主要方法完成: 方法一:通过PyCharm内置的插件市场安装中文语言包 1. 打开PyCharm,点击File -> Settings(在Mac上是PyCharm -> Preferences…

[数据集][目标检测]绳子检测数据集VOC+YOLO格式322张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):322 标注数量(xml文件个数):322 标注数量(txt文件个数):322 标注类别…

计算机网络基础 - 应用层(1)

计算机网络基础 应用层网络应用的体系结构C/S 体系结构P2P 体系结构C/S 和 P2P 体系结构的混合体 进程通信概述套接字(Socket)TCP socketUDP socket 应用层协议应用层需要传输层提供的服务Web 与 HTTP概念非持续连接和持续连接HTTP报文格式请求报文响应报…

仿Muduo库实现高并发服务器——任务定时器模块

任务定时器模块TimerWheel在本项目中的简单使用: 下面这张图 是channel模块,poller模块,TimerWheel模块,EventLoop模块,LoopThreadPool模块进行组合。便于大家对这个项目的理解,因为代码看起来挺复杂的。 上…