通俗易懂,十分钟让你了解并上手 Docker

通俗易懂,十分钟让你了解并上手 Docker

  • 一、Docker 能拿来解决什么问题
  • 二、Docker 的概念与模型
    • 1. 容器化技术
    • 2. 镜像的概念
    • 3. Docker与虚拟机
  • 三. Docker的使用
    • 1. 环境安装
    • 2. 制作镜像
    • 3. 镜像管理
      • (1) 图形界面
      • (2) 命令行
  • 四、Docker 常用命令及其作用


在这里插入图片描述

开了云原生专栏很久,但一直没怎么更新,今天就来更新一篇Docker的。主要面向新人,争取十分钟让完全新手了解Docker的作用、原理以及基本的操作

📕作者简介:战斧,从事金融IT行业,有着多年一线开发、架构经验;爱好广泛,乐于分享,致力于创作更多高质量内容
📗本文收录于 云原生专栏,有需要者,可直接订阅专栏实时获取更新
📘高质量专栏 MyBatis专栏 、RabbitMQ、Spring全家桶 等仍在更新,欢迎指导
📙Zookeeper Redis kafka docker netty等诸多框架,以及架构与分布式专题即将上线,敬请期待

一、Docker 能拿来解决什么问题

我们知道,每一个火爆的技术之所以流行,必然有其原因。而其中占大头的,莫过于能帮大伙解决痛点问题,那么Docker能为开发者解决什么问题呢?

其实在软件开发过程中,不知道大家是否遇到这样一些痛点,笔者简单举两个例子:

① 比如笔者之前一次任务要求生成并导出一个PDF文件,在开发环境没问题,但到了测试环境,发现所有的中文字符全部成了空白,检查后发现测试环境缺乏对应的字体,导致汉字无法显示
② 又比如一次临时的批量部署事件,由于原始机器太少性能吃紧,所以紧急征用了不少环境,本身每个环境一一部署就很麻烦了,而且这些环境很多底座及设置都不尽相同,比如有的是JDK8,有的是JDK11。这样的临时部署事件,环境配置也让大家非常疲惫

那么,Docker 就能帮我们解决以上那些问题。简而言之,Docker的主要作用有三个方面:

  • 快速部署:Docker通过将应用程序及其依赖打包到一个镜像中,实现了 一次构建、到处运行 的理念。开发者只需要创建一个Docker镜像,然后在任何支持Docker的环境中运行即可,无需担心环境不一致带来的问题。在开发环境、测试环境和生产环境之间的迁移非常简单,大大减少了部署时间和人力成本。

  • 环境一致性:借助Docker的容器化技术,可以实现应用程序在不同环境中的高度一致性。无论是开发者的本地机器还是云服务器,只需要保证Docker环境一致,就可以保证应用程序能够稳定运行。这为开发者提供了一个稳定的开发、测试和部署平台。

  • 资源利用率高:传统的虚拟化技术每个虚拟机都需要独立的操作系统,造成了资源的浪费。而Docker采用了轻量级的容器化技术,可以在宿主机上运行多个容器,共享宿主机的操作系统内核,大大提高了资源利用率。同时,容器化技术还能够快速启动和停止容器,进一步提高了资源的利用效率。

当然啦,如果此前你从未接触过Docker,那也许你还有点懵动,不清楚上面这几种作用是怎么实现的,别急,我们将在下面为你陈述。

二、Docker 的概念与模型

我们将从两个方面来诠释Docker,即Docker是什么,以及Docker如何用

1. 容器化技术

谈Docker,就必需先讲讲容器化技术。简单地说, 就是我们可以将应用程序及其所有的依赖关系打包成一个袋子,然后在任何地方都能够快速打开袋子,然后运行其中的内容,形成一个独立的容器环境,这样的技术就是容器化技术

就如同我们前面举的例子,传统的开发方式,我们需要安装各种软件、库和配置环境,才能保证应用程序能够正常运行。然而由于环境之间存在差异,部署和迁移应用程序非常麻烦。而Docker的出现解决了这个问题,它可以将应用程序和所有的依赖项打包到一个容器中,形成一个独立、可移植的环境。这意味着开发者只需要关注应用程序本身,而不用担心环境的配置和兼容性

2. 镜像的概念

我们刚刚在说容器化技术的时候,说到了将应用程序及其所有的依赖关系打包成一个袋子,这个袋子其实就是镜像(Image)镜像(Image)容器的关系就像程序进程的关系一样:镜像是一个包裹,包含了运行应用程序所需的所有组件、库、依赖、文件和配置等,容器则是从镜像创建出来的可运行实例,容器可以被启动、暂停、停止

在这里插入图片描述
当然,镜像不是杂乱无章的大杂烩。如上图所示,镜像拥有层级(layer)概念,每个Docker镜像由多个层级组成,每个层级都包含了一些文件系统的修改,这些层级按照顺序堆叠在一起,每个层级都是只读的,并且可以被多个镜像共享,最底层为bootfs(boot file system) 和 操作系统(如Debian),高层级则是用户程序。这种层级的设计有不少优点:

  1. 共享资源:当多个镜像共享相同的层级时,可以节省存储空间,因为这些共享层级只需要保存一份。
  2. 快速构建和部署:当修改镜像时,只需要添加或修改相应的层级,而不是重新创建整个镜像。这样可以大大加快镜像的构建和部署速度。
  3. 可定制性:每个层级都可以被看作是一个单独的修改记录,因此可以方便地定制镜像,只需基于已有的层级进行修改和添加。

3. Docker与虚拟机

不知道读者朋友们以前是否使用过虚拟机?有时候我们想在一台机器上多开应用的时候,就可能会用到虚拟机,这样我们就如同拥有了多个独立的机器。而Docker,则可以认为是一种更轻量且高效的虚拟机,为什么说轻量高效,我们可以在下图看一下:
在这里插入图片描述

不难看出,虚拟机(VM)在原本的操作系统上加了一层虚拟机监视器,然后又加了一层用户操作系统,我们的程序就是在用户操作系统上运行。而Docker则只有一层Dcoker守护进程,省略了虚拟机中的那一层“用户系统”,也就是说 Docker 的运行依赖于宿主机器的操作系统,这样会导致Docker比虚拟机更轻盈,执行效率也更高,但同样也限制了跨平台的能力,也即虽然Docker可以跨平台运行,但容器内的应用程序可能会因为不同的操作系统而产生差异或不兼容的问题,比如你为Window环境准备的内容,可能就无法通过Docker在Linux上运行

更具体的对比可以看这张表

区别Docker虚拟机
构建方式使用容器化技术,通过镜像构建容器。使用Hypervisor技术,将物理服务器划分为多个虚拟机。
启动速度秒级启动速度,可以快速部署和运行应用程序。分钟级启动速度,启动虚拟机需要时间。
性能接近原生性能,容器与宿主机共享操作系统内核和硬件资源。较慢,因为虚拟机需要模拟硬件并运行完整的操作系统。
系统资源使用占用的系统资源较少,容器可以共享宿主机的操作系统内核。耗费较多的系统资源,每个虚拟机都需要完整的操作系统。
部署与扩展容易部署和扩展,可以通过编排工具自动化管理容器。部署和扩展相对复杂,需要管理不同的虚拟机和操作系统实例。
网络容器可以直接访问宿主机的网络接口,网络更直接。虚拟机需要通过虚拟网络进行通信,网络相对间接。
隔离性容器间相互隔离,但容器与宿主机共享操作系统内核。虚拟机间相互隔离,每个虚拟机都有独立的操作系统内核。
应用程序数量可以在同一台宿主机上运行数十到数百个容器。受限于宿主机的物理资源,一般只能运行数个虚拟机。
部署环境适用于微服务架构和容器化的应用程序。适用于传统应用程序和需要完整操作系统的应用程序。
适用场景开发、测试、部署和分发应用程序的环境。测试、隔离和运行不同操作系统的应用程序的环境。

三. Docker的使用

现在我们基本上知道了Docker的意思,知道了镜像容器的概念,但是我们可能还有几个疑惑,比如

  • Docker有环境要求吗?
  • 镜像怎么传到其他机器的?
  • 镜像是怎么制作的?

让我们带着疑问,来看看Docker真正在使用中的一个模型,然后进行解释。

在这里插入图片描述

1. 环境安装

首先,想要在机器(Host)上运行起一个Docker容器,机器上必需先安装上Docker,可以参考另外C站的一篇博文进行安装【Linux部署Docker安装步骤详解及问题解决】,这样你才能获得daemon,来管理Docker对象(例如容器、镜像、网络等)

2. 制作镜像

当然,如果你想自己制作个镜像,当然也是可以的。简单来说,就是在你的项目目录下创建一个 Dockerfile 文件然后编写它,指定基础镜像、维护者信息和构建命令等。Dockerfile 使用一系列指令来描述构建过程,比如 FROMRUNCOPYEXPOSE 等。以笔者手头的一份java项目的Dockerfile文件为例,并逐行解释

# 指定基础镜像为openjdk:8
FROM openjdk:8
# 设置工作目录为/home
WORKDIR /home
# 切换用户为root
USER root
# 设置环境变量
ENV PROFILE="dev"
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
ENV PARAMS=""
# 将宿主机target目录下的以.jar结尾的文件复制到镜像的/home目录下,并重命名为app.jar
COPY /target/*.jar /home/app.jar
# 暴露容器的80端口
EXPOSE 80
# 创建软链接,设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
# 将一条命令(单引号中的内容)写入entrypoint.sh文件。不难看出,该命令用于创建目录并运行Java应用。
RUN echo -e 'mkdir -p ./logs/gc && java $JAVA_OPTS -jar ./app.jar --spring.profiles.active=$PROFILE $PARAMS' > entrypoint.sh
# 设置容器启动时执行的入口命令为sh entrypoint.sh,即运行entrypoint.sh脚本。
ENTRYPOINT ["sh", "entrypoint.sh"]

编写完· Dockerfile 后,在终端或命令行中使用 docker build 命令来构建镜像

3. 镜像管理

有了环境后,我们还要获取一个镜像。一般来说镜像可以从Docker hub下载,Docker Hub是Docker官方提供的一个在线的仓库服务,在Docker Hub上,用户可以找到各种官方镜像。当然,你也可以自己指定从一些三方、或私人仓库private resistry下载镜像,如果你使用过maven,应该能理解这种公共或私有仓库的关系。一般来说,可以通过命令或界面来完成。

(1) 图形界面

下载图形界面,比如笔者是windows,可以在官网下载 https://docs.docker.com/desktop/install/windows-install/
在这里插入图片描述

其详细安装及操作可参见另外一位C站大佬的文章 《Docker Desktop 安装使用教程》

(2) 命令行

  • 下载镜像:使用docker pull命令下载一个镜像。例如,要下载Ubuntu镜像,可以运行
    docker pull ubuntu

  • 上传镜像:首先,您需要将本地镜像标记为您的Docker Hub或其他镜像仓库的地址。使用docker tag命令来标记镜像。例如,如果您要上传名为"myimage"的镜像到Docker Hub上的"myusername"库中,可以运行
    docker tag myimage myusername/myimage
    然后,使用docker push命令上传镜像
    docker push myusername/myimage

四、Docker 常用命令及其作用

接下来我们来介绍一些Docker的常用命令及其作用:

  • docker run

运行一个容器。 示例:docker run -d -p 8080:80 nginx
会在后台运行一个Nginx容器,并将主机的8080端口映射到容器的80端口。

  • docker ps

列出正在运行的容器。 示例:docker ps 显示正在运行的容器的列表,包括容器ID、状态、端口映射等信息。

  • docker stop

停止一个正在运行的容器。 示例:docker stop <容器ID> 会停止指定的容器。

  • docker rm

删除一个容器。 示例:docker rm <容器ID> 会删除指定的容器。

  • docker images

列出本地的镜像。 示例:docker images 显示本地的镜像列表,包括镜像ID、标签、大小等信息。

  • docker pull

从Docker仓库中拉取镜像。 示例:docker pull nginx 会从Docker仓库拉取最新版本的Nginx镜像。

  • docker push

推送一个镜像到Docker仓库。 示例:docker push myusername/myimage
会将名为myimage的镜像推送到Docker仓库。

  • docker build

构建一个镜像。 示例:docker build -t myimage:tag .
会在当前目录下的Dockerfile文件中构建一个名为myimage的镜像。

  • docker exec

在运行的容器中执行命令。 示例:docker exec -it <容器ID> bash 可以在容器中打开一个交互式的bash终端。

更详尽的命令可以在官网的参考文档:https://docs.docker.com/reference/cli/docker/

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

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

相关文章

Coursera: An Introduction to American Law 学习笔记 Week 03: Property Law

An Introduction to American Law 本文是 https://www.coursera.org/programs/career-training-for-nevadans-k7yhc/learn/american-law 这门课的学习笔记。 文章目录 An Introduction to American LawInstructors Week 03: Property LawKey Property Law TermsSupplemental Re…

多功能气象传感器解析

TH-WQX5多功能气象传感器在监测要素上越来越丰富。除了传统的温度、湿度、风速、风向等基本气象要素外&#xff0c;现代的多功能气象传感器还能够监测降雨量、大气压力、光照强度、紫外线强度、土壤温湿度等多种参数。这些数据的获取&#xff0c;使得农业生产者能够更全面地了解…

4款值得推荐的AI辅助编程工具(支持C#语言)

前言 在这个AI迅速发展的阶段&#xff0c;涌现出了一大批好用的AI辅助编程工具。AI辅助编程工具能够提高开发效率、改善代码质量、降低bug率&#xff0c;是现代软件开发过程中的重要助手。今天大姚给大家分享4款AI辅助编程工具&#xff08;并且都支持C#语言&#xff09;&#x…

ChromaDB教程

使用 Chroma DB&#xff0c;管理文本文档、将文本嵌入以及进行相似度搜索。 随着大型语言模型 &#xff08;LLM&#xff09; 及其应用的兴起&#xff0c;我们看到向量数据库越来越受欢迎。这是因为使用 LLM 需要一种与传统机器学习模型不同的方法。 LLM 的核心支持技术之一是…

Linux 文件/目录管理(头歌实训)

目录 任务描述 相关知识 Linux 创建文件 Linux 删除文件 编程要求 测试说明 任务描述 相关知识 Linux 创建目录 Linux 删除目录 编程要求 测试说明 任务描述 相关知识 Linux 拷贝文件 Linux 重命名文件 编程要求 测试说明 任务描述 相关知识 Linux 拷贝目…

初入数据库

SQL&#xff1a;操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库的统一标准。 DDL&#xff08;Data Definition Language&#xff09;数据定义语言 数据库 show databases;create database db01;use db01;select database(); 显示当前使用的数据库drop d…

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

(八)小案例银行家应用程序-排序-数组排序

排序一直有很多的算法&#xff0c;今天我们仅仅来说JavaScript内置的排序方法 ● 字符串 const owners [Jonas, Zach, Adam, Martha]; console.log(owners.sort()); console.log(owners);但是注意&#xff0c;这个方法会改变原有的数组&#xff1b; ● 我们在试试数字 cons…

使用excel文件生成sql脚本

目录 1、excel文件脚本变量2、公式示例 前言&#xff1a;在系统使用初期有一些基础数据需要从excel中导入到数据库中&#xff0c;直接导入的话可能有些字段用不上&#xff0c;所以就弄一个excel生成sql的导入脚本&#xff0c;这样可以将需要的数据填到指定的列即可生成sql。 1、…

探索AI大模型在央国企的落地实践|爱分析活动

在这个人工智能技术迅猛发展的时代&#xff0c;AI大模型在央国企的落地实践正成为推动数字化转型和智能化升级的重要引擎。为了深入探讨AI大模型在央国企的应用场景、技术挑战与落地路径&#xff0c;爱分析邀请到一家头部互联网公司作为本次闭门研讨会的联合主办方&#xff0c;…

美国网站服务器解决方案

在当今互联网时代&#xff0c;网站是企业宣传、营销和销售的最好方式&#xff0c;因此&#xff0c;选择一个适合自己企业的网站服务器解决方案很重要。美国作为全球网络基础设施最发达的国家之一&#xff0c;其网站服务器解决方案具有以下特点&#xff1a; 一、安全性高 作为全…

IDEA使用中, 设置平展软件包。使用IDEA遇到的问题:src里为什么创建包为什么不在包里面

使用IDEA遇到的问题&#xff1a;src里为什么创建包为什么不在包里面 如下图所示 &#xff1a; 点击齿轮设置 如何搞回来&#xff1f; 看下面的Flatten Packages&#xff08;平展软件包&#xff09;取消掉。

【算法刷题 | 回溯思想 07】4.18(全排列、全排列 ||)

文章目录 11.全排列11.1题目11.2解法&#xff1a;回溯11.2.1回溯思路&#xff08;1&#xff09;函数返回值以及参数&#xff08;2&#xff09;函数返回值&#xff08;3&#xff09;遍历过程 11.2.2代码实现 12.全排列 ||12.1题目12.2解法&#xff1a;回溯12.2.1回溯思路12.2.3代…

【Redis 开发】缓存穿透解决

缓存穿透 缓存穿透缓存空对象布隆过滤缓存空对象实现其他缓解方式 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存就永远不会生效&#xff0c;这些请求都会打到数据库 常见的解决方案有两种&#xff1a; 缓存空对象&#xff0c;布隆过…

Postman - 设置变量

场景&#xff1a; 比如你接口都有权限&#xff0c;访问需要每调一个接口都手动放token的值&#xff0c;这个时候就可以搞个全局的变量&#xff0c;只设置一次就可以了 1、设置变量 Environments -> Globals - > 设置key 、value 2、使用变量 {{你得变量名-key}} 3…

redis中的缓存穿透问题

缓存穿透 缓存穿透问题&#xff1a; 一般请求来到后端&#xff0c;都是先从缓存中查找数据&#xff0c;如果缓存中找不到&#xff0c;才会去数据库中查询数据。 而缓存穿透就是基于这一点&#xff0c;不断发送请求查询不存在的数据&#xff0c;从而使数据库压力过大&#xff…

MySQL主从的应用

说明&#xff1a;本文介绍MySQL主从在实际中的应用。主从搭建和问题参考下面两篇文章&#xff1a; MySQL主从结构搭建 搭建MySQL主从结构时的问题 数据迁移 当我们搭建完MySQL主从&#xff0c;第一步当然是把历史数据导入到主从结构中。有以下两种方式&#xff1a; 开启主从…

CST Studio初级教程 一

本教程将详细介绍CST Studio Project创建。 新建Project 1. 点击New and Recent&#xff0c;然后点击New Template。 然后依据我们的仿真属类&#xff0c;在下图中做选择需要的模板。 如果做高频连接器信号完整性&#xff08;SI&#xff09;仿真&#xff0c;我们就选Microwaves…

数据结构之二叉搜索树底层实现洞若观火!

目录 题外话 正题 二叉搜索树 底层实现 二叉搜索树查找操作 查找操作思路 查找代码实现详解 二叉搜索树插入操作 插入操作思路 插入代码详解 二叉搜索树删除操作 删除操作思路 删除代码详解 小结 题外话 我的一切都是党给的,都是人民给的,都是家人们给的!! 十分感…

Docker的数据管理、网络通信和dockerfile

目录 一、Docker的数据管理 1. 数据卷 1.1 数据卷定义 1.2 数据卷配置 2. 数据卷容器 2.1 创建数据卷容器 2.2 使用--volume-from来挂载test1 二、端口映射 三、容器互联 1. 创建容器互联 ​编辑2. 进入test2测试&#xff08;ping 容器名/别名&#xff09; 四、Dock…