Docker是什么?Docker可以做什么?

article/2025/9/21 11:44:59

背景

随着云原生、容器化、微服务、k8s 等技术的发展,容器 Docker 也火了一把,同时也逐渐被软件开发者在实践中进行运用。个人在目前接手的项目、参与的项目或技术交流中,发现 Docker 已经非常普及。

对于大多数开发者来说,Docker 之所以被广泛使用,最主要的原因可能就是方便,它提供了一套标准化的解决方案,极大地提升了部署、发布、运维的效率。因此,如果你的项目中目前还没有使用 Docker,或者想深入了解一下 Docker,这篇文章值得你一读。

Docker 是什么?

在聊 Docker 是什么之前,我们先来回顾一下传统的产品开发上线涉及到的难点。一款产品从开发到上线,经历了开发环境、测试环境、生产环境等不同的操作系统、运行环境和应用配置等环境。在项目管理中,还涉及到不同版本以及不同版本之间兼容性等问题。

这些问题对开发人员和运维人员都是极大的考验,同时对各方的协作也有一定的要求。不然就会出现”代码在我这里运行的好好的啊“,这种尴尬的局面。而 Docker 的出现就是提供了一套用来解决此类问题的标准解决方案。

Docker

Docker 的口号是”一次创建或配置,可以在任意地方正常运行“。如口号所说,Docker 的出现对于开发和运维人员是一大福音,基于 Docker 可以方便地搞定标准化的发布流程,再也不用纠结不同环境导致的问题了。

其实,Docker 的使用可以理解为:软件是带环境安装的,也就是说,安装的时候把原始环境一模一样的复制过来一份。这样也就消除了不同机器运行结果不同的问题。

那么,Docker 是什么呢?Docker 是一个开源的应用容器引擎,基于 Go 语言,并遵从 Apache2.0 协议开源。它可以让开发者打包应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker 可用于开发应用、交付应用、运行应用等场景。

容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。Docker 允许用户将基础设施中的应用单独分割出来,形成更小的部分容器,从而提高软件交付速度。

Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版)和 EE(Enterprise Edition: 企业版),通常使用社区版就可以满足大多数业务场景。

Docker 容器与虚拟机的区别

Docker 容器与虚拟机很相似,但它们之间又有着很大的区别。

虚拟机是通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。创建虚拟机时,会将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存,每个虚拟机都有独立的硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。

虚拟机会消耗大量系统资源和开销,尤其是当多个虚拟机在同一物理服务器上运行时,每个虚拟机都有自己的子操作系统,大量精力以及资源被用于虚拟化的部署和运行上。

容器类似于虚拟机,只是容器不是完整的操作系统,容器通常只包含必要的操作系统包和应用程序,这就是它们轻量级的原因。

Docker 与虚拟机

可以出,传统的虚拟机是在宿主机之上,又添加了一个新的操作系统,这就导致了虚拟机的臃肿,不适合迁移。而 Docker 是直接寄存在宿主机上,完全就会避免大部分虚拟机带来的困扰。

Docker 是一个黑盒的进程,区别于传统的进程,Docker 可以独立出一个自己的空间,不会使得在 Docker 中的行为以及变量溢出到宿主机上。

容器与虚拟机的各项区别:

容器与虚拟机的区别

Docker 能做什么?

那么,当在开发中使用了 Docker 能为我们带来哪些便利呢?先来看一张图。

Docker 使用前后对比

在没有使用 Docker 时,我们开发完毕一个项目,需要打成 war 包或 jar 包。然后,在服务器上进行各种环境的安装、配置以及应用程序维护,比如:JDK、Tomcat、数据库等。

而且,上述的配置在开发环境、测试服务器、生产服务器(通常会有很多个),都需要进行一遍同样的操作,工作量相当繁重。在使用了 Docker 之后,我们可以自己创建一个空的镜像从头构建,也可以使用公共仓库中已经构建好的镜像,直接使用。当需要在不同环境中进行部署时,直接使用构建好的镜像即可,一次构建,多环境多次使用,方便快捷。

Docker 的 6 大优势

对比传统的运维发布方式,Docker 有以下 6 大优势:

1、更高效地利用系统资源

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

2、更快的启动时间

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

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

4、持续交付和部署对开发和运维(DevOps)来说,最希望的就是一次创建或配置,可以在任意地方正常运行,使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。

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

6、更轻松的维护和拓展

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

Docker 的基础概念

在使用 Docker 时,我们要掌握 Docker 中的一些核心组件及概念。

来看一张 Docker 的架构图:

Docker 架构图

Docker 的基本组成是由镜像(image)、容器(container)、仓库(repository)构成。

镜像(image)

Docker 镜像就是一个只读的模板,是文件与 meta data 的集合。镜像是基于分层的实现的,每一层都可以添加删除文件,从而形成新的镜像。

镜像可以理解为是一个树状结构,每一个镜像都会依赖于另一个镜像,这个依赖关系体现在 Docker 镜像制作的 Dockerfile 中的 FROM 指令上的。关于 Dockerfile 及其中的 FROM 指令,需要注意的是:如果是树的根,那么就需要"FROM scratch"。

镜像可以用来创建 Docker 容器,一个镜像可以创建多个容器。

容器(container)

Docker 利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例,是在 image 的最后一层上面再添加一层。容器的定义和镜像几乎一模一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。

容器与镜像相对比:镜像负责存储和分发,容器负责运行,它们之间的关系可以类比 Java 中类和实例的关系。

容器可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。可以把容器看做是一个简易版的 Linux 环境和运行在其中的应用程序。

仓库(repository)

仓库是集中存放镜像文件的场所,它有点类似于 Maven/Git 的仓库,当我们需要镜像文件时,可以从远程仓库中拉取。

仓库和仓库注册服务器(Registry)是有区别的。仓库注册服务器上存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。

仓库分为公开仓库(Public)和私有仓库(Private)两种形式。目前最大的公开仓库是 Docker Hub。

小结

通过本篇给大家讲解了 Docker 的基本使用场景、相关概念、Docker 能为我们带来什么、Docker 的优势等,想必大家通过本篇文章已经能够从整体上了解了 Docker 的概况。


转载:https://blog.csdn.net/weixin_70730532/article/details/126226843

http://chatgpt.dhexx.cn/article/YbCl0QMV.shtml

相关文章

Lucas定理理解与应用

【定义】 Lucas定理是用来求 C(n,m) mod p的值。条件:n和m是非负整数,p是素数 一般用于:n和m但p很小,或者n,m不大但大于p,这样用阶乘解决不了。 【公式】 表达式:C(n,m)%pC(n/p,m/p)*C(n%p,m…

ACM_算法_Lucas定理

Lucas定理是用于求解C(n,m)%p的问题 这里小编用一张图&#xff1a; 这张图就很完整的说明了Lucas定理的内容&#xff0c;比较简单&#xff0c;也比较好理解&#xff0c;小编也就不多说了。 #include <cstdio> #include <cstring> #include <iostream> #incl…

Lucas卢卡斯定理模板

题目算法要素&#xff1a;组合数学&线性求逆元&线性求阶乘的逆元&Lucas定理 题面&#xff1a; Lucas定理内容&#xff1a;不会的走传送门去oiwiki 分析&#xff1a; 由于这题n、m较大&#xff0c;因此直接硬算肯定会炸&#xff08;阶乘都算不完&#xff09;。 故…

Vue脚手架global安装出错

1.安装npm sudo apt-get install npm npm -v 查看npm版本 node -v 查看node版本 2.sudo npm install --global vue-cli发现报错出现 TypeError:this is not a typed array 原因是node版本过低导致的&#xff0c;解决办法&#xff1a; 1&#xff09;sudo npm install -g n 2)…

MySQL高级篇1

第01章 Linux下MySQL的安装与使用 1. 安装前说明 1.1 查看是否安装过MySQL 如果你是用rpm安装, 检查一下RPM PACKAGE&#xff1a; rpm -qa | grep -i mysql # -i 忽略大小写检查mysql service&#xff1a; systemctl status mysqld.service1.2 MySQL的卸载 1. 关闭 mysql…

VScode 环境配置

1.把你的 VS Code 打造成 C 开发利器 https://cloud.tencent.com/developer/article/1555413 2.解决C代码在VSCode中无法快速跳转的问题。 在做C项目的时候&#xff0c; 发现在VSCODE里面的&#xff0c; 跳转很慢&#xff0c; 有时候还跳转失败。并且代码提示也不够友好。让…

在Global Mapper中导入点的文本格式

文章目录 有时候想在Global Mapper快速显示一个点的具体位置&#xff0c;来不及去创建一个具体的矢量文件。一个最快速的方式就是将这个点写在文本文件中导入&#xff1a; 13149831.629692005 2817252.5824931804 0 P1 导入后会询问你该文本文件的描述形式&#xff1a; 接着选择…

最强Microsoft Edge插件安装

一、Global Speed: 视频速度控制 Global Speed与几乎所有视频和音频流媒体站点兼容&#xff0c;包括Youtube&#xff0c;Netflix&#xff0c;哔哩哔哩&#xff0c;腾讯视频&#xff0c;百度网盘&#xff0c; 爱奇艺等。 当我们打开某个视频网站时&#xff0c;点击Global Spee…

关于node、vue、vue/cli安装的问题

新人一枚&#xff0c;说错勿喷。 今天在学习搭建安装vue脚手架&#xff08;vue/cli&#xff09;时碰到的问题。 在运行npm install vue/cli -g 报错&#xff0c;翻译过来大概的意思就是依赖包不对&#xff0c;在网上找了许多的资料。最后在别人博客中找到答案。 来源https://ww…

【GoWeb项目-个人Blog】初始化数据库和日志

2 初始化数据库和日志 项目地址&#xff1a;https://gitee.com/illlloooovvvvcode/daily-blog 2.1各种配置的目录结构 2.2 待初始的全局对象 global.go 存储全局对象 var (GVA_CONFIG conf.ConfGVA_DB *gorm.DBGVA_LOG *zap.Logger //只能输出结构化日志&…

PyTorch: visdom可视化

一、visdom可视化配置 1、安装visdom库 pip install visdom 2、配置环境 python -m visdom server 3、浏览器打开网址&#xff1a; visdomhttp://localhost:8097/ 二、显示的结果 三、代码 import torch import torch.nn as nn import torch.nn.functional as F impo…

关于小白安装nodejs遇到的问题(npm WARN config global `--global`, `--local` are deprecated. Use `--location=glob)

今天是7.8 问题已经解决啦&#xff01;连滚带爬的来更新了&#xff01; 总结&#xff1a;遇到这个问题有可能是因为自带的node版本过低&#xff01;并且升级win11的好像都会遇到 对我而言的错误方法一&#xff1a; 虽然现在有一个很火的帖子改文档-global成为–locationglob…

46.在ROS中实现global planner(2)- A*规划算法预研

前文45.在ROS中实现global planner&#xff08;1&#xff09;- 实现一个可以用的模板实现了一个global planner的模板&#xff0c;并且可以工作&#xff0c;本文将实现astar算法&#xff0c;为后续完成一个astar global planner做准备 1. AStar简介 1.1 AStar Astar算法是一…

【GlobalMapper精品教程】002:GlobalMapper中文版安装后的基本设置

本文讲述安装globalmapper后的一些简单基本设置&#xff08;持续更新&#xff09;&#xff0c;为后续深入学习软件打下基础。订阅专栏后私信作者&#xff0c;获取中文安装包及配套实验数据包。 文章目录 1. 工具条的显示与关闭2. 面积单位设置3. 选择所选面要素的边框4. 二三维…

nvm + nodejs + vue项目 环境搭建备忘

内容介绍&#xff1a; 传统 JavaScript 传统 JavaScript 运行在浏览器上&#xff0c;浏览器内核分为两个部分&#xff1a; 渲染引擎渲染HTML和CSSJavaScript 引擎 负责运行 JavaScrip…

python3_函数_形参调用方式 / 不定长参数 / 函数返回值 / 变量作用域 / 匿名函数 / 递归调用 / 函数式编程 / 高阶函数 / gobal和nonlocal关键字 / 内置函数

1.形参的调用方式 1. 位置参数调用 2. 关键词参数调用 原则&#xff1a; 关键词参数调用不能写在位置参数调用的前边 def test1(name, age):print("name:", name)print("age:", age)if "__main__" __name__:test1("admin_maxin", age…

关于Vivado综合选项——Out of context per IP和Gobal

Vivado生成IP输出文件注意的地方&#xff0c;是选择Global还是Out of context per IP: vivado默认是第二种&#xff0c;Out of context per IP是指让vivado在综合的时候对IP进行单独综合&#xff0c;生成.dcp文件&#xff0c;然后再工程要用到IP的时候&#xff0c;只需从.dcp文…

Oracle 临时表 (Gobal Temporary Table)

提问&#xff0c;插入数据之后&#xff0c;COMMIT&#xff0c;数据是否一定会在表里呢&#xff1f; 回答 一定会在。我认为没有错 回答 可能会在。也没有错 → 没在就一定是被删了&#xff0c;那么有一种表&#xff0c;会在Commit时&#xff0c;清空所有数据。 刚才说的那种…

转载:关于Vivado综合选项——Out of context per IP和Gobal

转载&#xff1a;关于Vivado综合选项——Out of context per IP和Gobal 原文地址&#xff1a;https://www.cnblogs.com/yhsy1002/p/7441309.html 关于Vivado综合选项——Out of context per IP和Gobal Vivado生成IP输出文件注意的地方&#xff0c;是选择Global还是Out of cont…

An Implemention of Realtime Gobal Illumination

前言&#xff1a;CG画面的“效果”最重要&#xff0c;至于达到这一效果所使用的技术倒是其次&#xff0c;一切的一切对于观众来说都是透明的。即使是Pixar都认为仅仅One Bounce Indirect Illumination对构建一个足够真实可信的光照效果足矣。看过这里的SII&#xff0c;我想你对…