我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Docker虚拟化怎么部署

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Docker虚拟化怎么部署

这篇文章主要介绍了Docker虚拟化怎么部署的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker虚拟化怎么部署文章都会有所收获,下面我们一起来看看吧。

Docker 虚拟化

关于Docker

本小节将介绍 Docker 虚拟化的一些特点。

Docker 是一个开放源代码软件项目,自动化进行应用程序容器化部署,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。 -From wiki

Docker虚拟化怎么部署

在接触 Docker 的过程中,或多或少会了解到 Docker 的虚拟化,最常见的介绍方式是对比 Docker 和虚拟机之间的差别,笔者这里也给出两者的对比表格,以便后面详细地展开来讲。

 虚拟机Docker 容器
隔离程度硬件级进程隔离操作系统级进程隔离
系统每个虚拟机都有一个单独的操作系统每个容器可以共享操作系统(共享操作系统内核)
启动时间需要几分钟几秒
体积大小虚拟机镜像GB级别容器是轻量级的(KB/MB)
启动镜像虚拟机镜像比较难找到预建的 docker 容器很容易获得
迁移虚拟机可以轻松迁移到新主机容器被销毁并重新创建而不是移动
创建速度创建 VM 需要相对较长的时间可以在几秒钟内创建容器
资源使用GB级别MB级别

Docker 中的虚拟化是依赖于 Windows 和 Linux 内核的,在 Windows 上会要求开启 Hyper-V,在 Linux 上需要依赖 namespace 和 cgroups 等,因此这里就不过多介绍 Docker 了,后面主要介绍 Linux 上的虚拟化技术。

传统虚拟化部署方式

传统虚拟化方式是在硬件抽象级别虚拟化,其特点是 虚拟化程度高。

传统虚拟化方式的优点是:

  • 1,虚拟机之间通过虚拟化技术隔离互不影响

  • 2,物理机上可部署多台虚拟机,提升资源利用率

  • 3,应用资源分配、扩容通过虚拟管理器直接可配置

  • 4,支持快照、虚拟机克隆多种技术,快速部署、容灾减灾

传统虚拟化部署方式的缺点:

  • 1,资源占用高,需要额外的操作系统镜像,需要占用GB级别的内存以及数十GB存储空间。

  • 2,启动速度慢,虚拟机启动需要先启动虚拟机内操作系统,然后才能启动应用。

  • 3,性能影响大,应用 => 虚拟机操作系统=> 物理机操作系统=> 硬件资源

Linux 虚拟化

本节简单地讲解 Docker 的实现原理,读者可以从中了解 Linux 是如何隔离资源的、Docker 又是如何隔离的。

我们知道,操作系统是以一个进程为单位进行资源调度的,现代操作系统为进程设置了资源边界,每个进程使用自己的内存区域等,进程之间不会出现内存混用。Linux 内核中,有 cgroups 和 namespaces 可以为进程定义边界,使得进程彼此隔离。

Linux-Namespace

在容器中,当我们使用 top 命令或 ps 命令查看机器的进程时,可以看到进程的 Pid,每个进程都有一个 Pid,而机器的所有容器都具有一个 Pid = 1 的基础,但是为什么不会发生冲突?容器中的进程可以任意使用所有端口,而不同容器可以使用相同的端口,为什么不会发生冲突?这些都是资源可以设定边界的表现。

在 Linux 中,namespace 是 Linux 内核提供的一种资源隔离技术,可以将系统中的网络、进程环境等进行隔离,使得每个 namespace 中的系统资源不再是全局性的。目前有以下 6 种资源隔离,Docker 也基本在这 6 种资源上对容器环境进行隔离。

读者可以稍微记忆一下这个表格,后面会使用到。

namespace系统调用参数隔离内容
UTSCLONE_NEWUTS主机名和域名
IPCCLONE_NEWIPC信号量、消息队列、共享内存
PIDCLONE_NEWPID进程编号
NetworkCLONE_NEWNET网络设备、网络栈、端口
MountCLONE_NEWNS文件系统挂载
UserCLONE_NEWUSER用户和用户组

[info] 关于 Mount

namespace 的 Mount 可以实现将子目录挂载为根目录。

unshare

Linux 中,unshare 命令行程序可以创建一个 namespace,并且根据参数创建在 namespace 中隔离各种资源,在这里我们可以用使用这个工具简单地创建一个 namespace。

为了深刻理解 Linux 中的 namespace,我们可以在 Linux 中执行:

unshare --pid /bin/sh

--pid仅隔离进程。

这命令类似于docker run -it {image}:{tag} /bin/sh。当我们执行命令后,终端会进入一个 namespace 中,执行 top 命令查看进程列表。

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND    1 root      20   0  160188   8276   5488 S   0.0  0.4   9:35.58 systemd    2 root      20   0       0      0      0 S   0.0  0.0   0:00.08 kthreadd    3 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 rcu_gp    4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 rcu_par_gp

可以看到,进程 PID 是从 1 开始的,说明在这个 namespace 中,与主机的进程是隔离开来的。

这个命令中,只隔离了进程,因为并没有隔离网络,因此当我们执行netstat --tlap命令时,这个命名空间的网络跟其它命名空间的网络是相通的。

在执行 unshare 命令前,使用 pstree 命令查看进程树:

init─┬─2*[init───init───bash]     ├─init───init───bash───pstree     ├─init───init───fsnotifier-wsl     ├─init───init───server───14*[{server}]     └─2*[{init}]

为了方便比较,我们使用unshare --pid top创建一个 namespace,对比执行了 unshare 命令后:

$>  pstree -lhainit  ├─init  │   └─init  │       └─bash  │           └─sudo unshare --pid top  │               └─top  ├─init  │   └─init  │       └─bash  │           └─pstree -lha  ├─init  │   └─init  │       └─fsnotifier-wsl  ├─init  │   └─init  │       └─bash  ├─init  │   └─init  │       └─server --port 29687 --instance WSL-Ubuntu  │           └─14*[{server}]  └─2*[{init}]

而在 namespace 中,查看 top 显示的内容,发现:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  1 root      20   0    1904   1136   1020 S   0.0   0.0     0:08.38 init

通过进程树可以看到,不同 namespace 内的进程处于不同的树支,他们的进程 PID 也是相互独立的。其功能类似于 Docker 中的 runc。

在 unshare 命令中,--pid 参数创建 隔离进程的命名空间,此外,还可以隔离多种系统资源:

  • mount :命名空间具有独立的挂载文件系统;

  • ipc:Inter-Process Communication (进程间通讯)命名空间,具有独立的信号量、共享内存等;

  • uts:命名空间具有独立的 hostname 、domainname;

  • net:独立的网络,例如每个 docker 容器都有一个虚拟网卡;

  • pid:独立的进程空间,空间中的进程 Pid 都从 1 开始;

  • user:命名空间中有独立的用户体系,例如 Docker 中的 root 跟主机的用户不一样;

  • cgroup:独立的用户分组;

Go 简单实现 进程隔离

在前面我们使用了 unshare 创建命名空间,在这里我们可以尝试使用 Go 调用 Linux 内核的 namespace,通过编程代码创建隔离的资源空间。

Go 代码示例如下:

package mainimport ("log""os""os/exec""syscall")func main() {cmd := exec.Command("sh")cmd.SysProcAttr = &syscall.SysProcAttr{Cloneflags: syscall.CLONE_NEWUTS |syscall.CLONE_NEWIPC |syscall.CLONE_NEWNS |syscall.CLONE_NEWNET |syscall.CLONE_NEWPID |syscall.CLONE_NEWUSER,}cmd.Stdin = os.Stdincmd.Stdout = os.Stdoutcmd.Stderr = os.Stderrif err := cmd.Run(); err != nil {log.Fatalln(err)}}

[info] 提示

前面已经提到过 UTS 等资源隔离,读者可以参考表格中的说明,对照代码理解 Cloneflags 的作用。

在这个代码中,我们启动了 Linux 中的 sh 命令,开启一个新的进程,这个进程将会使用新的 IPC、PID 等隔离。

读者可以在 Linux 中,执行 go run main.go ,即可进入新的命名空间。

Docker虚拟化怎么部署

关于 namespace 的介绍就到这里。

cgroups 硬件资源隔离

前面提到的 namepace 是逻辑形式使得进程之间相互不可见,形成环境隔离,这跟 Docker 容器的日常使用是一样的,隔离根目录,隔离网络,隔离进程 PID 等。

当然,Docker 处理环境隔离外,还能限制每个容器使用的物理资源,如 CPU 、内存等,这种硬件资源的限制是基于 Linux 内核的 cgroups 的。

在 Docker 中限制容器能够使用的资源量参数示例:

-m 4G --memory-swap 0 --cpu-period=1000000 --cpu-quota=8000000

cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以进程所使用的物理资源的机制。

cgroups 可以控制多种资源,在 cgroups 中每种资源限制功能对应一个子系统,可以使用命令查看:

mount | grep cgroup

Docker虚拟化怎么部署

[info] 提示

每种子系统的功能概要如下:

  • blkio — 该子系统对进出块设备的输入/输出访问设置限制,如 USB 等。

  • cpu — 该子系统使用调度程序来提供对 CPU 的 cgroup 任务访问。

  • cpuacct — 该子系统生成有关 cgroup 中任务使用的 CPU 资源的自动报告。

  • cpuset — 该子系统将单个 CPU和内存节点分配给 cgroup 中的任务。

  • devices — 该子系统允许或拒绝 cgroup 中的任务访问设备。

  • freezer — 该子系统在 cgroup 中挂起或恢复任务。

  • memory — 该子系统对 cgroup 中的任务使用的内存设置限制,并生成有关自动报告。

  • net_cls— 允许 Linux 流量控制器 ( tc) 识别源自特定 cgroup 任务的数据包。

  • net_prio — 该子系统提供了一种动态设置每个网络接口的网络流量优先级的方法。

  • ns—命名空间子系统。

  • perf_event — 该子系统识别任务的 cgroup 成员资格,可用于性能分析。

详细内容请参考:redhat 文档

我们也可以使用 lssubsys 命令,查看内核支持的子系统。

$> lssubsys -acpusetcpucpuacctblkiomemorydevicesfreezernet_clsperf_eventnet_priohugetlbpidsrdma

[info] 提示

Ubuntu 可以使用 apt install cgroup-tools 安装工具。

为了避免篇幅过大,读者只需要知道 Docker 限制容器资源使用量、CPU 核数等操作,其原理是 Linux 内核中的 cgroups 即可,笔者这里不再赘述。

聊聊虚拟化

本节内容将从底层角度,聊聊虚拟化。

理论基础

计算机层次结构

从语言角度,一台由软硬件组成的通用计算机系统可以看作是按功能划分的多层机器级组成的层次结构。

如果从语言角度来看,计算机系统的层次结构可用下图所示。

Docker虚拟化怎么部署

我们平时使用的笔记本、安卓手机、平板电脑、Linux 服务器等,虽然不同机器的系统和部分硬件差异很大,但是其系统结构是一致的。从 CPU 中晶体管、寄存器 到 CPU 指令集,再到操作系统、汇编,现在使用的通用计算机基本上这种结构。

下面讲解一下不同层次的主要特点。

计算机的最底层是硬联逻辑级,由门电路,触发器等逻辑电路组成,特征是使用极小的元件构成,表示了计算机中的 0、1。

Docker虚拟化怎么部署

微程序是使用微指令编写的,一个微程序即一个机器指令,一般直接由硬件执行,它可以表示一个最简单的操作。例如一个加法指令,由多个逻辑元件构成一个加法器,其元件组成如下图所示(图中为一个 8 位全加器)。

Docker虚拟化怎么部署

传统机器语言机器级是处理器的指令集所在,我们熟知的 X86、ARM、MIPS、RISC-V 等指令集,便是在这个层次。程序员使用指令集中的指令编写的程序,由低一层微程序解释。

操作系统机器层是从操作系统基本功能来看的,操作系统需要负责管理计算机中的软硬件资源,如内存、设备、文件等,它是软硬件的交互界面。常用的操作系统有 Windows、Linux、Unix 等。这个层次使用的语言是机器语言,即 0、1 组成的二进制代码,能够由计算机直接识别和执行。

汇编语言机器层顾名思义是汇编语言所在的位置,汇编语言与处理器有关,相同类型的处理器使用的汇编语言集是一致的。汇编语言需要被汇编语言程序变换为等效的二进制代码目标程序。由于计算机中的资源被操作系统所管理,因此汇编语言需要在操作系统的控制下进行。

到了高级语言机器层,便是我们使用的 C、C++ 等编程语言,高级语言是与人类思维相接近的语言。

软硬件实现等效

计算机的某些功能即可以由硬件实现,也可以由软件来实现。即软件和硬件在功能意义上是等效的。

一个功能使用硬件来实现还是使用软件来实现?

硬件实现:速度快、成本高;灵活性差、占用内存少。

软件实现:速度低、复制费用低;灵活性好、占用内存多。

虚拟化技术是将原本 硬件实现的功能,使用软件来实现,它们在性能、价格、实现的难易程度是不同的。一个功能既可以使用硬件实现,也可以使用软件实现,也可以两者结合实现,可能要根据各种人力成本、研发难度、研发周期等考虑。

虚拟化

虚拟化(技术)或虚拟技术是一种资源管理技术,将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个计算机配置环境。

不同层次的虚拟化

我们应该在很多书籍、文章中,了解到虚拟机跟 Docker 的比较,了解到 Docker 的优点,通过 Docker 打包镜像后可以随时在别的地方运行而不需要担心机器的兼容问题。但是 Docker 的虚拟化并不能让 Linux 跑 Windows 容器,也不能让 Windows 跑 Linux 容器,更不可能让 x86 机器跑 arm 指令集的二进制程序。但是 VMware 可以在 Windows 运行 Linux 、Mac 的镜像,但 WMWare 也不能由 MIPS 指令构建的 Linux 系统。

Docker 和 VMware 都可以实现不同程度的虚拟化,但也不是随心所欲的,它们虚拟化的程度相差很大,因为它们是在不同层次进行虚拟化的。

Docker虚拟化怎么部署

[Info] 提示

许多虚拟化软件不单单是在一个层面上,可能具有多种层次的虚拟化能力。

在指令集级别虚拟化中,从指令系统上看,就是要在一种机器上实现另一种机器的指令系统。例如,QEMU 可以实现在 X64 机器上模拟 ARM32/64、龙芯、MIPS 等处理器。

虚拟化程度在于使用硬件实现与软件实现的比例,硬件部分比例越多一般来说性能就会越强,软件部分比例越多灵活性会更强,但是性能会下降,不同层次的实现也会影响性能、兼容性等。随着现在计算机性能越来越猛,很大程度上产生了性能过剩;加之硬件研发的难度越来越高,越来越难突破,非硬件程度的虚拟化将会越来越广泛。

关于“Docker虚拟化怎么部署”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Docker虚拟化怎么部署”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Docker虚拟化怎么部署

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Docker虚拟化怎么部署

这篇文章主要介绍了Docker虚拟化怎么部署的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Docker虚拟化怎么部署文章都会有所收获,下面我们一起来看看吧。Docker 虚拟化关于Docker本小节将介绍 Do
2023-06-29

Linux下怎么部署kvm虚拟化技术

这篇文章主要介绍“Linux下怎么部署kvm虚拟化技术”,在日常操作中,相信很多人在Linux下怎么部署kvm虚拟化技术问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下怎么部署kvm虚拟化技术”的疑
2023-06-28

docker容器化怎么部署

要将应用程序容器化并部署到Docker中,可以按照以下步骤进行操作:编写Dockerfile:创建一个Dockerfile文件来定义容器的构建步骤。Dockerfile包含了基础镜像、安装依赖、复制应用程序代码等指令。构建镜像:使用Dock
2023-10-27

怎么安装部署及管理KVM虚拟化

本篇内容介绍了“怎么安装部署及管理KVM虚拟化”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.kvm部署1.1 kvm安装//关闭防火墙和
2023-06-25

怎么在Centos6.5上部署kvm虚拟化技术

本篇内容介绍了“怎么在Centos6.5上部署kvm虚拟化技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!KVM是什么?KVM 全称是 基
2023-06-05

jsp虚拟主机怎么部署

部署JSP虚拟主机的步骤如下:1. 配置服务器环境:首先,需要在服务器上安装Java运行环境(JRE)和Java服务器(如Tomcat)。2. 创建虚拟主机目录:在服务器上创建一个用于存放虚拟主机文件的目录。3. 配置虚拟主机:在服务器配置
2023-08-29

云虚拟主机怎么部署java

在云虚拟主机上部署Java应用程序的全面指南,包括部署前准备、部署步骤、高级部署选项、故障排除技巧和最佳实践。通过使用Java开发套件(JDK)、ApacheTomcat、WAR文件和适当的配置,您可以轻松地在云虚拟主机上部署JavaWeb应用程序,并享受可扩展、可靠和优化的性能。
云虚拟主机怎么部署java
2024-04-09

云虚拟主机怎么部署PHP

要部署PHP,您可以按照以下步骤操作:1. 登录云虚拟主机控制面板,进入管理界面。2. 在控制面板中找到"网站"或"域名"选项,点击进入。3. 在网站管理页面,找到您要部署PHP的域名,点击进入该域名的管理界面。4. 在域名管理界面的"网站
2023-09-13

虚拟主机怎么部署站点

要部署一个站点,首先需要购买一个虚拟主机服务。然后按照以下步骤进行部署:1. 获取虚拟主机的登录信息,包括FTP账号和密码。2. 使用FTP客户端(如FileZilla)连接到虚拟主机。输入主机地址、FTP账号和密码,然后点击连接。3. 在
2023-08-30

虚拟云主机怎么部署java

部署Java应用程序到虚拟云主机本指南提供了逐步说明,指导您在虚拟云主机上部署Java应用程序,包括上传文件、设置环境变量、配置Web服务器、部署WAR文件(可选)、运行应用程序以及监视和管理。常见的故障排除问题也一并给出。
虚拟云主机怎么部署java
2024-04-13

asp虚拟服务器怎么部署

1.选择 ASP 虚拟服务器:选择一家 ASP 虚拟服务器提供商,如亿 速y等。2.选择服务器配置:根据自己的需求选择适合的服务器配置,包括 CPU、内存、存储容量、带宽等。3.选择操作系统:选择适合的操作系统,如 Windows Serv
2023-05-13

云虚拟主机怎么部署java

要在云虚拟主机上部署Java,您可以按照以下步骤进行操作:1. 登录到您的云虚拟主机。2. 安装Java Development Kit (JDK)。您可以从Oracle官方网站下载适用于您操作系统的JDK版本,并按照安装指南进行安装。3.
2023-08-31

虚拟云主机怎么部署java

要在虚拟云主机上部署Java应用程序,可以按照以下步骤进行操作:1. 登录到云主机的控制台或使用SSH工具连接到云主机。2. 确保云主机已安装Java开发工具包(JDK)。如果没有安装JDK,可以使用包管理器(如apt、yum等)进行安装。
2023-09-16

云虚拟主机怎么部署PHP

部署PHP云虚拟主机部署PHP应用程序的云虚拟主机分步指南:选择云主机提供商创建虚拟服务器安装操作系统安装和配置Web服务器安装PHP创建数据库配置PHP上传代码测试应用程序安全应用程序
云虚拟主机怎么部署PHP
2024-04-10

docker自动化部署怎么实现

要实现Docker的自动化部署,可以采用以下步骤:1. 编写Dockerfile:根据项目需求编写Dockerfile文件,定义Docker镜像的构建流程、依赖关系和环境配置等。2. 使用CI/CD工具:选择一个适合的CI/CD工具(如Je
2023-08-12

虚拟主机怎么部署java项目

虚拟主机部署Java项目本指南介绍如何选择虚拟主机提供商、打包Java项目、上传WAR文件、配置Tomcat、配置数据库、进行测试和监控。涵盖安全设置、定期更新、备份、性能优化和负载均衡,以确保应用程序的稳定性和高性能。
虚拟主机怎么部署java项目
2024-04-12

java虚拟主机环境怎么部署

部署Java虚拟主机环境的步骤如下:1. 安装JDK:首先需要安装Java Development Kit(JDK),可以从官网下载并安装。2. 安装Tomcat:Tomcat是一个流行的Java Web服务器,可以从官网下载并安装。3.
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录