找项目网找项目网  2023-05-14 18:06 找项目网 隐藏边栏
导语: 开发人员创建一个应用程序或服务,并将它及其依赖关系打包到一个容器镜像中。在启动Docker镜像时,Docker允许我们通过使用-v参数挂载宿主机的文件到容器的指定目录下。但反过来,容器中对共享目录的更改,不会反应到宿主机上,不然就打破了容器具有的隔离特性。以上自己的镜像仓库做好了,是不是很方便,如果结合业务,会发现需要的镜像会比较多,分布式部署容器还要一个个启动容器?

一、Docker介绍

Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的依赖。相较于虚拟机而言,Docker共享的是宿主机的硬件资源,使用容器来提供独立的运行环境来运行应用。虚拟机则是基于Supervisor(虚拟机管理程序)使用虚拟化技术来提供隔离的虚拟机,在虚拟机的操作系统上提供运行环境!虽然两者都提供了很好的资源隔离,但很明显Docker的虚拟化开销更低!

Docker涉及了三个核心概念:Register、Image、Container。

1. Registry:仓库。用来存储Docker镜像,比如Docker官方的Docker Hub就是一个公开的仓库,在上面我们可以下载我们需要的镜像

2. Image:镜像。开发人员创建一个应用程序或服务,并将它及其依赖关系打包到一个容器镜像中。镜像是应用程序的配置及其依赖关系的静态形式。

3. Container:容器。Container是镜像的运行实例,它是一个隔离的、资源受控的可移植的运行时环境,其中包含操作系统、需要运行的程序、运行程序的相关依赖、环境变量等。

它们三者的相互作用关系是:

当我们执行Docker pull或Docker run命令时,若本地无所需的镜像,那么将会从仓库(一般为DockerHub)下载(pull)一个镜像。Docker执行run方法得到一个容器,用户在容器里执行各种操作。Docker执行commit方法将一个容器转化为镜像。Docker利用login、push等命令将本地镜像推送(push)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序。

docker查看最后删除的容器_docker查看容器挂载信息_docker 查看容器命令

二、安装Docker安装

1、使用yum源安装, 由于国内访问官方源慢,此处添加阿里的源

2、启动Docker

3、以测试镜像为例hello-world,执行命令:

a、当执行 docker run hello-world 时,docker首先会从本地找 hello-world 的镜像,如果本地没有,它将会从默认的镜像仓库Docker Hub上拉取镜像。镜像拉取到本地后,就实例化镜像得到容器,输出Hello from Docker!。

b、Docker Engine提供了Docker的核心技术: 图像(images)和容器(containers). 在安装教程的最后一步, 你运行了Engine命令docker run hello-world. 这一个命令,使Engine完成了Docker的核心任务, 该命令包含了三部分.

docker查看容器挂载信息_docker查看最后删除的容器_docker 查看容器命令

c、一个容器是一个精简版的Linux操作系统, 一个镜像是加载到这个容器的软件, 当你运行这个命令后, Engine会做下面的事情:

三、.Netcore项目在Docker中运行

1、拉取microsoft/dotnet镜像,等几分钟后即可安装完毕,执行docker images可以看到本地已经包含microsoft/dotnet镜像

2、运行microsoft/dotnet镜像, 使用docker run 可以启动镜像,通过指定参数-it以交互模式(进入容器内部)启动。依次执行以下命令:

运行结果如下图所示:

键盘按住Ctrl+C即可关闭应用,输入exit即可退出当前容器

以上简单的几步就完成了一个.NET Core MVC项目的创建和运行,这个时候你可能会好奇,Linux宿主机上并没有安装.NET Core SDK啊,MVC项目是如何创建的呢?这就是Docker神奇的地方,我们从镜像仓库中拉取的dotnet镜像,包含了创建、构建、运行.NET Core项目所需的一切依赖和运行时环境。

退出容器之后,执行find -name mvctest(查找mvctest文件),我们发现并没有找到。这说明我们刚才创建的.NET Core MVC项目是在容器内部创建的,是与宿主机完全隔离的。这个时候你可能会想,每次都要在容器中安装源代码太不方便了,我们能不能让容器运行我们宿主机的源代码项目?嗯,这是个好问题。当然是可以实现的,下面我们就来解答这个问题。

四、 宿主机上创建.NET Core 项目

为了在宿主机上创建.NET Core 项目,这个时候我们就需要在Linux宿主机上安装.NET Core SDK

1、宿主机安装.NET Core SDK

检测安装版本,如下图表示安装正确

docker查看容器挂载信息_docker 查看容器命令_docker查看最后删除的容器

2、创建.NET Core项目

注:在Program.cs文件中加入代码.UseUrls("http://*:5000"),在浏览器中访问如下图:

docker 查看容器命令_docker查看最后删除的容器_docker查看容器挂载信息

下一步我们就将该目录下的源码项目通过挂载的方式共享到容器中去

3、挂载宿主机项目到容器中

在启动Docker镜像时,Docker允许我们通过使用-v参数挂载宿主机的文件到容器的指定目录下。换句话说,就相当于宿主机共享指定文件供容器去访问。废话不多说,实践出真知

// 命令中的``结合`Enter`键构成换行符,允许我们换行输入一个长命令。

上面的命令就是把/data/mvctest/文件夹下的文件挂载到容器的app目录下

docker查看最后删除的容器_docker 查看容器命令_docker查看容器挂载信息

从上面的执行结果来看,容器内部中的app目录下包含了宿主机上的源码项目。

上面说到是以共享的形式,而不是容器拥有一份宿主机目录的拷贝,意味着,在宿主机上对目录的更改,会即时反应到容器中。但反过来,容器中对共享目录的更改,不会反应到宿主机上,不然就打破了容器具有的隔离特性。

通过这样一个简单场景,聪明的你是否会联想到这一场景在我们日常编码的应用之处呢?是的,我们可以用来持续构建(CI)。基本思路是,通过git clone源码到宿主机上,然后将源码目录挂载到容器中去进行构建

4、借助Dockerfile文件

Dockerfile用来定义你将要在容器中执行的系列操作。我们来创建第一个Dockerfile

进入VI编辑界面后,复制以下代码,使用shift + Ins命令即可粘贴。然后按ESE退出编辑模式,按shift + :,输入wq即可保存并退出编辑界面

上面的命令我依次解释一下:

Dockerfile就绪,我们就可以将我们当前项目打包成镜像以分发部署。

使用docker build -t

指令打包镜像:

docker查看最后删除的容器_docker查看容器挂载信息_docker 查看容器命令

以上命令就是告诉docker将当前目录打包成镜像,并命名为hellodocker.web。命令执行完毕,输入docker images即可看到我们新打包的镜像

docker查看最后删除的容器_docker查看容器挂载信息_docker 查看容器命令

镜像创建完毕我们就可以直接运行了:

上面的指令就是运行我们新打包的镜像,并通过-p参数映射容器的5000到宿主机的80端口,其中-d参数告诉docker以后台任务形式运行镜像。因为80是默认的web端口,所以我们通过浏览器直接访问ip即可访问到我们容器中运行的MVC网站

docker 查看容器命令_docker查看最后删除的容器_docker查看容器挂载信息

至此,我们借助Docker就完美的完成了.NET Core项目的容器化部署

我打包的镜像是保存在本地的,我如何把镜像部署到其他机器上呢?请继续看

五、推送镜像到仓库

请自行到Docker Hub注册个账号,然后我们把本地打包的镜像放到自己账号下的仓库下

1、注册完毕后,执行命令

2、再执行命令

docker查看容器挂载信息_docker查看最后删除的容器_docker 查看容器命令

推送失败,提示我们的镜像命名不符规范。原来在推送之前要把镜像按/格式来命名。那如何重命名呢,我们用打标签的方式重命名

docker 查看容器命令_docker查看容器挂载信息_docker查看最后删除的容器

以上信息表示推送成功了,查看自己的仓库,如下图:

最后我们换一台机器,我们直接执行以下命令,就完成了多重部署

>docker run -p 8081:5000 79522860/mvcdemo.web

docker查看容器挂载信息_docker查看最后删除的容器_docker 查看容器命令

以上自己的镜像仓库做好了,是不是很方便,如果结合业务,会发现需要的镜像会比较多,分布式部署容器还要一个个启动容器?不docker查看容器挂载信息,其它我们还可以通过配置文件来一键部署镜像与容器docker查看容器挂载信息,一下篇我们会讲到

六、Docker常用命令

1、容器相关操作

-i:允许我们对容器内的 (STDIN) 进行交互

-t:在新容器内指定一个伪终端或终端

--name:是给容器起一个名字,可省略,省略的话docker会随机产生一个名字

2、镜像相关操作

通过ID tag镜像,下面是tag一个id为0e5574283393的本地镜像到“fedora”存储库,tag名称version1.0

通过名称tag镜像, 使用名称“httpd” tag本地镜像到存储库”fedora”,且其tag名为version1.0

———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99

1.站长不是项目作者,不对项目解答及盈亏负责。
2.本站所有项目来源于投稿或购买自其他第三方,若本站侵犯了您的权益请 联系站长 进行删除处理。
找项目网
找项目网 关注:0    粉丝:0
这个人很懒,什么都没写
扫一扫二维码分享
×
Dragon