Docker|简单入门

文章目录

    • Docker简介
    • Docker和虚拟机的联系和区别
    • 基本原理和概念
      • 镜像
      • 容器
      • 仓库
    • Docker安装配置
    • 容器化和Dockerfile
    • 实践环节
    • Docker Compose

在这里插入图片描述

Docker简介

  • Docker是一个用于构建build、运行run、传送share应用程序的平台,可以把应用程序打包成一个个的集装箱,然后小鲸鱼就可以把它们运送到任何所需要的地方。
  • Docker 是利用 Linux 内核的 Namespace + Cgroups 实现进程级隔离和资源限制,提供轻量级、快速可移植的容器技术,是现代云原生架构的基石之一。
  • Docker 是一个开源的容器化平台,可以把应用程序和它的依赖打包在一个轻量级、可移植、自包含的容器中,保证跨环境一致运行。
  • 一句话:“一次构建,到处运行”。
  • Docker 解决了什么问题?
  • 在传统部署中,常常遇到:
    • 依赖冲突:不同应用需要不同版本的库,部署在同一机器容易打架。
    • 环境不一致:开发、测试、生产环境配置不一致,导致“在我机器上能跑”。
    • 复杂部署流程:要手动配置各种环境,效率低、容易出错。
  • Docker 通过容器机制解决这些问题:
    • 应用 + 环境打包成镜像 → 一次构建,任意运行
    • 镜像不可变,版本可控,回滚方便
    • 容器轻量、秒级启动、资源隔离

在这里插入图片描述
在这里插入图片描述

  • 以一个前后端分离的网站,如果没有docker,那么我们要在本地先安装以下内容,才可以运行:

    • 安装前端Node.js环境
    • 安装各种npm依赖
    • 安装Java运行时环境
    • 安装SpringBoot微服务的各种第三方依赖包
    • 安装MySQL数据库
    • 安装配置Redis缓存
    • 安装配置Nginx负载均衡
    • 配置各种环境变量并启动脚本
  • 而且这还只是开发环境,如果是要在测试环境也配一边就要再来一次,耗时耗力而且容易出错。

在这里插入图片描述

  • 但是有了Docker我们就可以把他们打包成一个一个的集装箱,只要在开发环境中运行成功了,那么在测试环境中运行也是没有问题的。

在这里插入图片描述

  • 核心概念

在这里插入图片描述

# Docker常用命令# 查看本地镜像
docker images# 拉取镜像
docker pull nginx# 启动容器
docker run -d -p 8080:80 nginx# 查看运行中的容器
docker ps# 停止容器
docker stop <container_id># 进入容器
docker exec -it <container_id> /bin/bash

Docker和虚拟机的联系和区别

  • 联系
    • 目的相同:容器和虚拟机都是用来实现隔离,让应用运行在相互隔离的环境中:
      • 避免依赖冲突
      • 保证环境一致性
      • 提高资源利用率
    • 都支持跨平台部署:容器镜像、虚拟机镜像都能实现 “一次打包,到处运行”。
    • 都能通过编排工具管理(如 K8s 支持容器,VM 支持 OpenStack、vSphere 等)

在这里插入图片描述

  • Docker 容器 ≠ 虚拟机,不需要 Hypervisor(虚拟化技术:将物理资源虚拟为多个逻辑资源的技术),不是完全模拟一个硬件环境
  • Docker 容器 = 基于宿主机 Linux 内核的隔离进程,启动快,资源开销小
  • 虚拟机一定程度上实现了资源的整合,可以将一台服务器的计算能力、存储能力、网络资源分配给多个逻辑服务器,实现多台服务器的功能

在这里插入图片描述
在这里插入图片描述

  • 但是每台虚拟机都需要占用大量的资源,如CPU、内存、硬盘、网络等,而且启动速度很慢
  • 最主要的是,大部份情况下,我们一台服务器上只需要运行一个主要对外提供服务的应用程序就行了,并不需要用到一个完整的操作系统所提供的所有功能,如下图所示

在这里插入图片描述

  • 上面的例子来说其实我们所需要的只是一个web服务器,但是虚拟机却要启动一个完整的操作系统,包括操作系统内核,各种系统服务,各种工具,甚至图形界面等等,这些我们并不需要的服务会占用大量的资源,导致了资源的浪费和启动速度慢的问题
  • 于是容器技术应运而生,但是要注意,Docker并不是容器!
  • Docker只是容器的一种实现,是一个容器化的解决方案和平台;而容器是一种虚拟化技术,和虚拟机类似,也是一个独立的环境,可以在这个环境中运行应用程序,但是和虚拟机不同的是它并不需要运行一个完整的操作系统,而是使用宿主机的操作系统,所以启动速度非常快,通常只需要几秒钟,同时因为所需要的资源更少,所以可以在一台物理服务器上运行更多的容器,这样就可以更加充分地利用服务器的资源,减少资源的闲置和浪费。

在这里插入图片描述
在这里插入图片描述

# 虚拟机架构硬件
│
└── Hypervisor (KVM / VMware / Hyper-V)│├── Guest OS (Linux / Windows)│    └── App A├── Guest OS (Linux / Windows)│    └── App B
# 容器架构硬件
│
└── 宿主机 OS (Linux内核)│└── Docker Engine / containerd├── Container A (App + libs)├── Container B (App + libs)
  • 容器不需要 Guest OS,进程直接运行在宿主机内核之上。
  • 虚拟机需要完整 Guest OS,有更高隔离,但更重。
  • 容器和虚拟机的主要联系是都实现了应用隔离,方便跨平台部署。区别在于虚拟机是通过 Hypervisor 提供系统级虚拟化,每个VM都有完整的操作系统,启动慢、资源占用大,隔离性强;而容器是基于宿主机内核,通过 Linux 的 Namespace 和 Cgroups 技术提供进程级隔离,启动快、资源占用小,非常适合微服务和大规模部署。容器与虚拟机是互补关系,通常混合使用,比如在公有云上用VM作为物理隔离基础,容器作为上层弹性计算单位。
  • 虚拟机提供系统级隔离,容器提供进程级隔离;VM 启动慢资源重隔离强,容器启动快资源轻灵活高效,两者可以结合使用,满足不同场景需求。

基本原理和概念

  • Docker 镜像是应用程序和依赖的静态打包模板,容器是镜像运行时的隔离进程,仓库用于存储和分发镜像。三者配合实现了应用的一键打包、快速部署和跨环境一致运行,是现代 DevOps 流水线的核心组件。
Dockerfile → docker build → 镜像 (Image)docker push → 仓库 (Registry)docker run↓容器 (Container)

镜像

  • 镜像是一个只读的模版,可以用来创建容器。
  • 镜像和容器的关系,就好比Java中类和实例的关系一样,我们可以定义一个类中有哪些属性和方法,这个定义好的类就是模版,然后我们可以根据这个模版来创建多个实例,这些实例就是这个类的对象,对应到Docker中,镜像就是一个模版,容器就是这个模版的一个实例,可以有一个也可以有多个。
  • 镜像是一个静态的模板,包含了应用程序和所有依赖、库、工具、配置等。
  • 容器运行时会在镜像上加一个可写层(Writable Layer)
  • 可以理解成容器的快照,容器运行时是基于镜像启动出来的。
  • 特点:
    • 分层结构,每一层是只读的
    • 可复用,相同基础层不会重复存储
    • 版本可控,便于回滚和管理
docker images              # 查看本地镜像
docker pull nginx          # 拉取远程镜像
docker build -t myapp:v1 . # 构建镜像
docker rmi <image_id>      # 删除镜像

容器

  • 容器是Docker的运行实例,提供了一个独立的可移植的环境。
  • 镜像和容器的关系,就好比Java中类和实例的关系一样,我们可以定义一个类中有哪些属性和方法,这个定义好的类就是模版,然后我们可以根据这个模版来创建多个实例,这些实例就是这个类的对象,对应到Docker中,镜像就是一个模版,容器就是这个模版的一个实例,可以有一个也可以有多个。
  • 容器是镜像的运行时实例,本质上是一个受限隔离的进程,它运行在宿主机内核之上。
  • 容器 = 运行中受限隔离的进程 + 分层文件系统。
  • 特点:
    • 容器之间互相隔离,与宿主机隔离
    • 轻量,共享宿主机内核(不像 VM 需要 Guest OS)
    • 可以随时创建 / 启动 / 停止 / 删除
    • 容器是临时的,可以随时销毁,也可以通过数据卷持久化数据
docker run -d -p 8080:80 nginx   # 启动容器
docker ps                        # 查看运行中的容器
docker stop <container_id>       # 停止容器
docker rm <container_id>         # 删除容器
docker exec -it <container_id> /bin/bash  # 进入容器

仓库

  • 镜像如何分享给别人呢?这就涉及到Docker仓库的概念了。
  • Docker仓库是用来存储Docker镜像的地方,最流行和最常用的仓库就是DockerHub,这是一个公共的Docker仓库,用来集中存储和管理Docker镜像,可以在这里下载各种镜像,也可以将镜像上传到仓库实现镜像的共享和复用。
  • 仓库(Registry)是用来存放和分发镜像的服务器。1、公共仓库(Public):如 Docker Hub。2、私有仓库(Private):企业内部自建 Registry,保障镜像安全、加快拉取速度。
  • 仓库(Registry)里可以有很多 仓库名(Repository),一个 Repository 中可以有多个 标签(Tag),每个标签对应一个镜像版本。
nginx:1.25.2
nginx:latest
mycompany/myapp:v1.0.0docker.io/nginx:latest    # Docker Hub
registry.example.com/myapp:v1.0  # 私有仓库
docker login registry.example.com   # 登录私有仓库
docker push myapp:v1                # 推送镜像
docker pull myapp:v1                # 拉取镜像

在这里插入图片描述

Docker安装配置

  • 官网:https://www.docker.com/
  • 安装完成之后记得启动Docker,Windows系统记得开启Hyper-V功能
  • Docker使用Client-Server架构模式,Docker Client和Docker Daemon之间使用socket或者RESTful API进行通信,Docker Daemon就是服务端的守护进程,负责管理Docker的各种资源,Docker Client负责向Docker Daemon发送请求,Docker Daemon接收到请求之后进行处理,然后将结果返回给Docker Client,Docker Daemon是一个后台进程,用来接收并处理来自Docker客户端度请求,然后将结果返回给Docker客户端,所以我们在终端中输入各种Docker命令,实际上都是通过Docker客户端发送给Docker Daemon的,然后Docker Daemon进行处理再将结果返回给客户端,就可以在终端中看到执行结果了。

容器化和Dockerfile

  • 容器化Containerization,顾名思义就是将应用程序打包成容器,然后在容器中执行应用程序的过程,主要有三步
    • 创建一个Dockerfile,告诉Docker创建应用程序镜像所需要的步骤和配置
    • 使用Dockerfile构建镜像
    • 使用镜像创建和运行容器

在这里插入图片描述

  • Dockerfile是一个文本文件,里面包含了一条一条的指令,用来告诉Docker如何来构建镜像,这个镜像包括了我们应用程序执行的所有命令,也就是刚刚提到的各种依赖,配置环境和运行应用程序所需要的所有内容:
    • 精简版操作系统
    • 应用程序的运行时环境
    • 应用程序
    • 第三方依赖库或者包
    • 应用程序的配置文件和环境变量等

在这里插入图片描述

实践环节

  • 写一个js脚本文件,输出"Hello World!"

  • 没有Docker之前,我们在其他机器要运行代码,只能通过以下步骤:

    • Step1: 安装操作系统
    • Step2: 安装JavaScript运行环境(NodeJS)
    • Step3: 复制应用程序、依赖包、配置文件
    • Step4: 执行启动命令运行程序
  • 有了Docker后我们可以把下面的步骤给写入Dockerfile里面,剩下的工作就交给Docker来自动完成

在这里插入图片描述

  • 需要先指定一个基础镜像,镜像是按层次结构来构建的,每一层都是基于上一层的,所以要先指定一个基础镜像然后在这个镜像的基础上再添加我们的应用程序
  • 比如可以在一个基础的linux镜像开始然后安装nodejs,也可以直接使用nodejs的镜像,FROM node:14-alpine
  • 然后需要把我们的应用程序复制到镜像中,可以使用copy命令来复制文件,COPY source dest,比如COPY index.js /index.js
  • 接下来需要在镜像中运行应用程序,可以使用 CMD 命令来运行应用程序,CMD是个方括号,里面第一个参数表示可执行程序的名字,第二个参数表示可执行程序接收到的参数 CMD [ "node", "/index,js" ],也可以不用方括号,如 CMD node /index.js
  • 回到终端使用 docker build -t 镜像名字 . 来构建镜像,后面加的一个点表示的是当前目录,也就是Dockerfile所在的目录
  • docker image ls 或者是 docker images,查看所有的镜像,latest表示最新版本
  • docker run 镜像名字,即可执行当前镜像文件

Docker Compose

  • 用于定义和运行多容器Docker应用程序的工具
  • 使用YAML文件来配置应用程序的服务
  • 一条命令即可创建并启动所有服务

在这里插入图片描述

  • 实际开发环境中这些服务是需要相互关联着才能工作的,Docker Compose解决的就是这个问题,通过一个单独的docker-compose.yaml的配置文件来将这一组互相关联的容器组合在一起,形成一个项目,然后使用一条命令就可以启动、停止或者重建这些服务,docker compose up

在这里插入图片描述

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

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

相关文章

阿里云云原生数据库PolarDB和普通云数据库的区别?

文章目录 前言一、云数据库的演进&#xff1a;从“托管”到“原生”的跨越二、PolarDB的核心创新&#xff1a;重新定义云数据库的能力边界1. 存算分离架构&#xff1a;打破资源绑定的“枷锁”2. 多模引擎与兼容生态&#xff1a;降低应用迁移成本3. 智能化运维&#xff1a;让数据…

SNN学习(4):真实的生物神经学中神经元和人脑结构学习

目录 一、基础知识 1 简单神经元回路中的信号运作 2 高级功能相关的复杂神经元回路 3 细胞体、树突和轴突 3.1 神经元细胞 3.2 非神经元细胞 3.3 神经胶质细胞 3.4 神经细胞的信号传递 3.4.1 动作电位的特性 3.4.2 兴奋和抑制 3.4.3 电传递 二、大脑皮层及视觉系统…

第六天 界面操作及美化(6.1 建立菜单及异步调用)

6.1 建立菜单及异步调用 在程序中&#xff0c;菜单&#xff08;Menu&#xff09;是一种常见的用户界面元素&#xff0c;在程序中起到了组织功能、提高用户体验、提供快捷方式和帮助文档等重要作用。通过合理使用菜单&#xff0c;可以使程序的功能更加清晰、操作更加便捷&#…

论文解析:一文弄懂ResNet(图像识别分类、目标检测)

目录 一、相关资源 二、Motivation 三、技术细节 1.残差学习过程 2.快捷连接类型 (1)Identity Shortcuts&#xff08;恒等捷径&#xff09; (2)Projection Shortcuts&#xff08;投影捷径&#xff09; (3)两种捷径对比 3.深层瓶颈结构Deeper Bottleneck Architectures…

动态规划算法的欢乐密码(二):路径问题

专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 一、例题讲解 1.1. 不同路径 题目要求是计算从网格的左上角&#xff08;起点&#xff09;到右下角&#xff08;终点&#xff09;的所有不同路径的数量。机器人每次只能向下或向右移动一步。如下图所示&#xff0…

嵌入式相关开源项目、库、资料------持续更新中

嵌入式相关开源项目、库、资料------持续更新中 学习初期最难找的就是找学习资料了&#xff0c;本贴精心汇总了一些嵌入式相关资源&#xff0c;包括但不限于编程语言、单片机、开源项目、物联网、操作系统、Linux、计算机等资源&#xff0c;并且在不断地更新中&#xff0c;致力…

图像处理与机器学习项目:特征提取、PCA与分类器评估

图像处理与机器学习项目:特征提取、PCA与分类器评估 项目概述 本项目将完成一个完整的图像处理与机器学习流程,包括数据探索、特征提取、主成分分析(PCA)、分类器实现和评估五个关键步骤。我们将使用Python的OpenCV、scikit-learn和scikit-image库来处理图像数据并实现机器…

MATLAB | 如何使用MATLAB获取《Nature》全部绘图 (附23-25年图像)

文末有全部图片资源 我在两年前更过如何用 MATLAB 爬取 《Nature》全部插图&#xff0c;最近又有人问我有没有下载好的24&#xff0c;25年插图的压缩包&#xff0c;于是又去拿代码运行了一下&#xff0c;发现两年前写的代码今天居然还能用&#xff0c;代码如下&#xff1a; f…

中国老年健康调查(CLHLS)数据挖掘教程(1)--CLHLS简介和数据下载

北京大学“中国老年健康影响因素跟踪调查&#xff08;简称‘中国老年健康调查’&#xff1b;英文名称为Chinese Longitudinal Healthy Longevity Survey (CLHLS)&#xff09;”及交叉学科研究由国家自然科学基金委主任基金应急项目、重大项目、重点项目及国际合作项目。1998-20…

基本多线程编译make命令

背景&#xff1a; 在ffmpeg源码编译的时候要等很久&#xff0c;快下班了&#xff0c;等不及。 解决方法&#xff1a; 使用多线程编译。 make -j{n} 如&#xff1a; make -j8详解&#xff1a;&#xff08;没时间看的可以返回了&#xff01;&#xff09; 在编译 FFmpeg 时使用…

MNIST数据集上朴素贝叶斯分类器(MATLAB例)

MNIST数据集上朴素贝叶斯分类器 Naive Bayes Classification fitcnb Train multiclass naive Bayes model Syntax Mdl fitcnb(Tbl,ResponseVarName) Mdl fitcnb(Tbl,formula) Mdl fitcnb(Tbl,Y) Mdl fitcnb(X,Y) Mdl fitcnb(___,Name,Value) [Mdl,AggregateOptimization…

网站设计小技巧:利用交互设计提升用户体验

现在很多企业朋友都会感觉到&#xff0c;做网站设计掌握不好设计网页的魂&#xff0c;换了很多设计方式可能效果都不理想。蒙特网站专注高端网站建设20多年&#xff0c;基于为华为、字节跳动、海康威视等头部企业打造网站的经验&#xff0c;今天将近期用户比较喜欢的网页设计方…

Github指南-Add .gitignore和Choose a license

Add .gitignore&#xff08;添加忽略文件列表&#xff09; &#x1f4cc; 作用&#xff1a; .gitignore 文件用于告诉 Git 哪些文件或文件夹**不要被上传&#xff08;版本控制&#xff09;**&#xff0c;例如&#xff1a; 编译生成的临时文件&#xff08;如 .exe, .o&#x…

如何打造沉浸式文件操作体验

在操作系统长期运行后&#xff0c;本地文件系统往往会面临一个常见却棘手的问题&#xff1a;元数据管理效率下降&#xff0c;导致用户在海量文件中检索目标内容时出现显著的延迟与操作成本。这种现象在未使用标签化或语义化管理系统的情况下尤为明显。 而 Oversis 的出现&…

企业AI深水区突围:从星辰大海到脚下泥泞的进化论

一、业务价值旅程&#xff1a;从降本增效到价值跃迁 1.1 技术落地的"甜蜜陷阱" 企业在AI应用初期往往陷入"高配用不起&#xff0c;低配用不了"的困境。一台8卡A100服务器每月电费超3万元的成本&#xff0c;对制造业利润形成巨大挤压。即便跨过算力门槛&a…

PostgreSQL的扩展moddatetime

PostgreSQL的扩展moddatetime moddatetime 是 PostgreSQL 的一个内置扩展&#xff0c;用于自动维护表的最后修改时间字段。这个扩展可以自动更新指定字段为当前时间戳&#xff0c;非常适合需要跟踪记录最后修改时间的应用场景。 一、moddatetime 基本功能 核心特性 自动更新…

自己的电脑搭建外网访问网站服务器的步骤

文章目录 PC电脑做网站服务器的步骤1.前言2. 网站服务器系统的安装2.1个人电脑安装IIS&#xff08;Windows7系统安装IIS7.0&#xff09;2.1.1&#xff1a;打开控制面板&#xff0c;给Windows安装插件 2.2网站配置&#xff1a;2.2.1打开网站配置项&#xff1a;2.2.2开始配置&…

基于深度学习的智能语音合成系统:技术与实践

前言 随着人工智能技术的飞速发展&#xff0c;智能语音合成&#xff08;Text-to-Speech, TTS&#xff09;技术已经成为人机交互领域的重要组成部分。从智能助手到有声读物&#xff0c;语音合成技术正在改变我们与数字内容的交互方式。近年来&#xff0c;深度学习技术为语音合成…

铸铁平台的制造工艺复杂而精细

铸铁平台的制造工艺确实复杂而精细。首先&#xff0c;需要选择合适的铸铁材料&#xff0c;通常是灰铸铁或球墨铸铁&#xff0c;以满足平台的强度和耐磨性要求。然后&#xff0c;根据设计要求&#xff0c;制作模具&#xff0c;并在高温下将铁液倒入模具中进行铸造。在铸造过程中…

ArcPy 与 ArcGIS .NET SDK 读取 GDB 要素类坐标系失败?GDAL 外挂方案详解

ArcPy 与 ArcGIS .NET SDK 读取 GDB 要素类坐标系失败&#xff1f;GDAL 外挂方案详解 在ArcGIS Pro中正常显示的坐标系&#xff0c;为何通过ArcPy或.NET SDK却无法正确读取&#xff1f;本文将分享我在处理CGCS2000坐标系时的踩坑经历&#xff0c;以及最终通过GDAL外挂方案解决问…