打包应用程序代码和依赖项的机制-Docker容器 (qt如何打包应用程序)
概述
容器通过将应用程序的代码和所有依赖项打包到一个独立的软件包中,实现了应用程序的快速部署和移植。Docker容器是此类容器的一种流行实现,它使应用程序能够在不同的计算环境中一致、高效地运行。
Docker 容器的工作原理
Docker 容器实现快速部署和移植的目标,其工作原理如下:
- 打包应用程序:使用 Docker 工具将应用程序的代码、运行时环境、系统工具、系统库和配置文件等打包成一个容器镜像。容器镜像是一个轻量级、独立的可执行软件包,包含了运行应用程序所需的一切。
- 部署容器:将容器镜像部署到 Docker 引擎上。Docker 引擎是一个容器运行时环境,可以在和操作系统上运行容器。容器镜像在运行时变成容器,可以在不同的计算环境中快速、可靠地运行应用程序。
- 跨平台移植:Docker 容器可以在不同的计算环境中运行,无论是 Linux 还是 Windows 操作系统。这意味着无论基础设施如何变化,容器化的软件始终可以以相同的方式运行。这种跨平台的移植性使得应用程序可以在开发、测试和生产环境之间无缝切换。
Docker 容器的优势
通过使用 Docker 容器,应用程序可以更快地部署和移植,同时保持一致的运行环境。容器化的应用程序具有以下优势:
- 快速部署:容器镜像可以在几秒钟内启动,比传统的虚拟机更快。这使得应用程序可以快速响应变化的需求,提高开发和部署的效率。
- 环境一致性:容器化的应用程序在不同的计算环境中运行时,保持一致的运行环境。这消除了开发和生产环境之间的差异,减少了由于环境问题引起的错误。
- 资源利用率:容器共享主机操作系统的内核,因此不需要为每个应用程序提供独立的操作系统。这提高了服务器的利用率,减少了资源浪费。
- 可移植性:容器化的应用程序可以轻松地在不同的计算环境中移植,无需修改代码。这使得应用程序可以在不同的云平台、数据中心或本地环境中运行。
结论
Docker 容器通过将应用程序及其依赖项打包成一个独立的软件包,实现了应用程序的快速部署和移植。容器化的应用程序具有快速部署、环境一致性、资源利用率高和可移植性强等优势,成为现代应用程序开发和部署的重要工具。
DOCKER 总结
Docker 是一个开源的 应用容器引擎 ,让 开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化 。容器是完全使用沙箱机制,相互之间不会有任何接口。
由于本地开发好的程序往往都需要部署到服务器上进行运行,这就导致了程序需要运行在不同的环境上,这通常是一个令人头痛的事情。在过去,开发团队需要清楚的告诉运维部署团队,其所使用的全部配置文件+所有软件环境。不过,即便如此,仍然常常发生部署失败的状况。
于是乎, 虚拟化 技术应运而生。开发团队将开发好的程序在虚拟机上运行,这样就能解决运维的问题。但是由于虚拟机技术过重的特性导致了其 资源占用多、冗余步骤多以及启动慢的缺陷 。而这个时候 一种新的虚拟化技术搭配上容器化的思想 的产品便出现了,而它就是Docker。
下图是虚拟机技术和容器化技术架构的对比。我们可以得出以下总结:
[图片上传失败...(image-efadd2-01)] ]()
于是乎相比于虚拟机技术,容器化技术具有以下 优势:
相关网站
如下图所示,Docker使用客户端-服务器(C/S)架构模式,使用远程API来管理和创建Docker容器。服务器端分为Docker daemon, Image和Container三个部分。此外还有Docker Registry。
下面首先来介绍一下Docker中的主要概念
Docker的运行原理如下:客户端可以将docker命令发送到服务器端的Docker daemon上,再由Docker damon根据指令创建、选择或者从Docker仓库中拉取(pull)镜像。接着客户端可以通过镜像创建容器。当我们需要使用程序时,运行相应的容器即可。
小结
需要正确的理解仓储/镜像/容器这几个概念 :
在外面使用容器的时候,我们不希望容器中的数据在容器被删除后也一并删除了,这时候我们就可以 通过使用容器数据卷,将数据储存在本地并用Docker将其挂载到容器中,这样我们即使删除了容器,数据也依旧存在服务器中,也就实现了数据持久化。
特点
容器数据卷挂载命令(-v)
Dockerfile 挂载容器数据卷
我们除了可以从仓库中拉取镜像以外,我们也可以 自己创建镜像 ,这就要用到Docerfile。
dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本 。
构建步骤:
基础知识:
流程:
说明:
在实际场景中,我们会遇到 多个Container之间通讯 的问题。而Docker网络就是用于解决此问题的技术。docker会给每个容器都分配一个ip,且容器和容器之间是可以互相访问的。
Docker网络原理
每一个安装了Docker的linux主机都有一个docker0的虚拟网卡。这是个桥接网卡,使用了 veth-pair 技术 。Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据 Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网 关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker容器网络就很好的利用了Linux虚拟网络技术,在本地主机和容器内分别创建一个虚拟接口,并 让他们彼此联通(这样一对接口叫veth pair);
Docker中的网络接口默认都是虚拟的接口。虚拟接口的优势就是转发效率极高(因为Linux是在内核中 进行数据的复制来实现虚拟接口之间的数据转发,无需通过外部的网络设备交换),对于本地系统和容 器系统来说,虚拟接口跟一个正常的以太网卡相比并没有区别,只是他的速度快很多。
[图片上传中...(image-41d42a-52-2)]
Docker Compose是一个用于定义并运行多容器应用的工具 。
Docker Compose的 步骤如下 :
NOTE: Compose :重要的概念。
编写
Note: docker-compose会自动为多容器之间创建网络,保证通讯。
Docker Swarm 是Docker的集群管理工具。 它将 Docker主机池转变为单个虚拟 Docker主机。 Docker Swarm提供了标准的 DockerAPI,所有任何已经与 Docker守护程序通信的工具都可以使用 Swarm轻松地扩展到多个主机。
Docker 是一个开源的 应用容器引擎 ,它的出现大大简化了运维的难度,提高了运维效率。过去我们需要在服务器上安装程序所需要的所有依赖,而如今我们只需要编写好docker-compose和Dockefile的脚本,就可以使程序一键跑通。在企业级的应用中,我们必然会惊颤使用到Docker和容器化技术。
狂神说
微服务架构之「 容器技术 」
现在一聊到容器技术,大家就默认是指 Docker 了。 但事实上,在 Docker 出现之前,PaaS社区早就有容器技术了,以 Cloud Foundry、OpenShift 为代表的就是当时的主流。 那为啥最终还是 Docker 火起来了呢? 因为传统的PaaS技术虽然也可以一键将本地应用部署到云上,并且也是采用隔离环境(容器)的形式去部署,但是其兼容性非常的不好。 因为其主要原理就是将本地应用程序和启停脚本一同打包,然后上传到云服务器上,然后再在云服务器里通过脚本启动这个应用程序。 这样的做法,看起来很理想。 但是在实际情况下,由于本地与云端的环境差异,导致上传到云端的应用经常各种报错、运行不起来,需要各种修改配置和参数来做兼容。 甚至在项目迭代过程中不同的版本代码都需要重新去做适配,非常耗费精力。 然而 Docker 却通过一个小创新完美的解决了这个问题。 在 Docker 的方案中,它不仅打包了本地应用程序,而且还将本地环境(操作系统的一部分)也打包了,组成一个叫做「 Docker镜像 」的文件包。 所以这个「 Docker镜像 」就包含了应用运行所需的全部依赖,我们可以直接基于这个「 Docker镜像 」在本地进行开发与测试,完成之后,再直接将这个「 Docker镜像 」一键上传到云端运行即可。 Docker 实现了本地与云端的环境完全一致,做到了真正的一次开发随处运行。 一、容器到底是什么? 容器到底是什么呢?也许对于容器不太了解,但我们对虚拟机熟悉啊,那么我们就先来看一下容器与虚拟机的对比区别:上图的左侧是虚拟机的原理,右侧是Docker容器的原理。 虚拟机是在宿主机上基于 Hypervisor 软件虚拟出一套操作系统所需的硬件设备,再在这些虚拟硬件上安装操作系统 Guest OS,然后不同的应用程序就可以运行在不同的 Guest OS 上,应用之间也就相互独立、资源隔离了,但是由于需要 Hypervisor 来创建虚拟机,且每个虚拟机里需要完整的运行一套操作系统 Guest OS,因此这个方式会带来很多额外资源的开销。 而 Docker容器 中却没有 Hypervisor 这一层,虽然它需要在宿主机中运行 Docker Engine,但它的原理却完全不同于 Hypervisor,它并没有虚拟出硬件设备,更没有独立部署全套的操作系统 Guest OS。 Docker容器没有那么复杂的实现原理,它其实就是一个普通进程而已,只不过它是一种经过特殊处理过的普通进程。 我们启动容器的时候(docker run …),Docker Engine 只不过是启动了一个进程,这个进程就运行着我们容器里的应用。 但 Docker Engine 对这个进程做了一些特殊处理,通过这些特殊处理之后,这个进程所看到的外部环境就不再是宿主机的那个环境了(它看不到宿主机中的其它进程了,以为自己是当前操作系统唯一一个进程),并且 Docker Engine 还对这个进程所使用得资源进行了限制,防止它对宿主机资源的无限使用。 那 Docker Engine 具体是做了哪些特殊处理才有这么神奇的效果呢? 二、容器是如何做到资源隔离和限制的? Docker容器对这个进程的隔离主要采用2个技术点: 弄清楚了这两个技术点对理解容器的原理非常重要,它们是容器技术的核心。 下面来详细解释一下: 三、容器的镜像是什么? 一个基础的容器镜像其实就是一个 rootfs,它包含操作系统的文件系统(文件和目录),但并不包含操作系统的内核。 rootfs 是在容器里根目录上挂载的一个全新的文件系统,此文件系统与宿主机的文件系统无关,是一个完全独立的,用于给容器进行提供环境的文件系统。 对于一个Docker容器而言,需要基于 pivot_root 指令,将容器内的系统根目录切换到rootfs上,这样,有了这个 rootfs,容器就能够为进程构建出一个完整的文件系统,且实现了与宿主机的环境隔离,也正是有了rootfs,才能实现基于容器的本地应用与云端应用运行环境的一致。 另外,为了方便镜像的复用,Docker 在镜像中引入了层(Layer)的概念,可以将不同的镜像一层一层的迭在一起。 这样,如果我们要做一个新的镜像,就可以基于之前已经做好的某个镜像的基础上继续做。 如上图,这个例子中最底层是操作系统引导,往上一层就是基础镜像层(Linux的文件系统),再往上就是我们需要的各种应用镜像,Docker 会把这些镜像联合挂载在一个挂载点上,这些镜像层都是只读的。 只有最上面的容器层是可读可写的。 这种分层的方案其实是基于 联合文件系统UnionFS(Union File System)的技术实现的。 它可以将不同的目录全部挂载在同一个目录下。 举个例子,假如有文件夹 test1 和 test2 ,这两个文件夹里面的文件 有相同的,也有不同的。 然后我们可以采用联合挂载的方式,将这两个文件夹挂载到 test3 上,那么 test3 目录里就有了 test1 和 test2 的所有文件(相同的文件有去重,不同的文件都保留)。 这个原理应用在Docker镜像中,比如有2个同学,同学A已经做好了一个基于Linux的Java环境的镜像,同学S想搭建一个Java Web环境,那么他就不必再去做Java环境的镜像了,可以直接基于同学A的镜像在上面增加Tomcat后生成新镜像即可。 以上,就是对微服务架构之「 容器技术 」的一些思考。 码字不易啊,喜欢的话不妨转发朋友,或点击文章右下角的“在看”吧。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。