- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章.NETCore Docker实现容器化与私有镜像仓库管理由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、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)到仓库。其他机器或服务器上就可以使用该镜像去生成容器,进而运行相应的应用程序.
2、docker安装 。
1、使用yum源安装, 由于国内访问官方源慢,此处添加阿里的源 。
1
2
|
> wget -p
/etc/yum
.repos.d/ http:
//mirrors
.aliyun.com
/docker-ce/linux/centos/docker-ce
.repo
> yum
install
-y docker-ce
|
2、启动docker 。
1
2
3
4
5
6
7
|
//
启动 docker ce
> systemctl start docker
> systemctl
enable
docker
//
查看docker状态
> systemctl status docker
//
查看docker版本
> docker -
v
|
3、测试docker是否正确安装,执行命令:
> docker run 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的核心任务, 该命令包含了三部分. 。
c、一个容器是一个精简版的linux操作系统, 一个镜像是加载到这个容器的软件, 当你运行这个命令后, engine会做下面的事情:
1.检查是否存在hello-world这个软件镜像 。
2.从docker hub下载镜像(稍后了解docker hub) 。
3.加载这个镜像到容器中, 并运行它 。
3、.netcore项目在docker中运行 。
1、拉取microsoft/dotnet镜像,等几分钟后即可安装完毕,执行docker images可以看到本地已经包含microsoft/dotnet镜像 。
> docker pull microsoft/dotnet 。
2、运行microsoft/dotnet镜像, 使用docker run <image>可以启动镜像,通过指定参数-it以交互模式(进入容器内部)启动。依次执行以下命令:
1
2
3
4
|
> docker run -it microsoft
/dotnet
//
启动一个dotnet镜像
> dotnet new mvc -n mvctest
//
创建项目名为mvctest的.net core mvc项目
>
cd
mvctest
//
进入mvctest文件夹
> dotnet run
//
启动.net core mvc项目
|
运行结果如下图所示:
键盘按住ctrl+c即可关闭应用,输入exit即可退出当前容器 。
以上简单的几步就完成了一个.net core mvc项目的创建和运行,这个时候你可能会好奇,linux宿主机上并没有安装.net core sdk啊,mvc项目是如何创建的呢?这就是docker神奇的地方,我们从镜像仓库中拉取的dotnet镜像,包含了创建、构建、运行.net core项目所需的一切依赖和运行时环境.
退出容器之后,执行find -name mvctest(查找mvctest文件),我们发现并没有找到。这说明我们刚才创建的.net core mvc项目是在容器内部创建的,是与宿主机完全隔离的。这个时候你可能会想,每次都要在容器中安装源代码太不方便了,我们能不能让容器运行我们宿主机的源代码项目?嗯,这是个好问题。当然是可以实现的,下面我们就来解答这个问题.
4、 宿主机上创建.net core 项目 。
为了在宿主机上创建.net core 项目,这个时候我们就需要在linux宿主机上安装.net core sdk 。
1、宿主机安装.net core sdk 。
添加yum源:sudo rpm -uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm 。
开始安装:yum install -y dotnet-sdk-2.1 。
检测安装版本,如下图表示安装正确 。
2、创建.net core项目 。
1
2
3
4
5
|
>
mkdir
data
>
cd
data
> dotnet new mvc -n mvctest
//
创建项目名为mvctest的.net core mvc项目
>
cd
mvctest
//
进入mvctest文件夹
> dotnet run
//
启动.net core mvc项目
|
注:在program.cs文件中加入代码.useurls("http://*:5000"),在浏览器中访问如下图:
下一步我们就将该目录下的源码项目通过挂载的方式共享到容器中去 。
3、挂载宿主机项目到容器中 。
在启动docker镜像时,docker允许我们通过使用-v参数挂载宿主机的文件到容器的指定目录下。换句话说,就相当于宿主机共享指定文件供容器去访问 。
1
2
3
4
|
// 命令中的`\`结合`enter`键构成换行符,允许我们换行输入一个长命令。
> docker run -it \
> -v /data/mvctest/:/app \
> microsoft/dotnet:latest
|
上面的命令就是把/data/mvctest/文件夹下的文件挂载到容器的\app目录下 。
从上面的执行结果来看,容器内部中的app目录下包含了宿主机上的源码项目.
上面说到是以共享的形式,而不是容器拥有一份宿主机目录的拷贝,意味着,在宿主机上对目录的更改,会即时反应到容器中。但反过来,容器中对共享目录的更改,不会反应到宿主机上,不然就打破了容器具有的隔离特性.
通过这样一个简单场景,聪明的你是否会联想到这一场景在我们日常编码的应用之处呢?是的,我们可以用来持续构建(ci)。基本思路是,通过git clone源码到宿主机上,然后将源码目录挂载到容器中去进行构建 。
4、借助dockerfile文件 。
下篇我们升级此操作,不需dockerfile的依赖,操作一条命令搞定.
dockerfile用来定义你将要在容器中执行的系列操作。我们来创建第一个dockerfile 。
1
2
3
|
> cd /data/mvctest/ //确保进入我们创建的mvc项目目录中去
> touch dockerfile //使用touch命令创建dockerfile
> vi dockerfile //使用vi命令编辑dockerfile
|
进入vi编辑界面后,复制以下代码,使用shift + ins命令即可粘贴。然后按ese退出编辑模式,按shift + :,输入wq即可保存并退出编辑界面 。
1
2
3
4
5
6
7
|
from microsoft/dotnet:latest
workdir /app
copy . /app
run dotnet restore
expose 5000
env aspnetcore_urls http://*:5000
entrypoint ["dotnet","run"]
|
上面的命令我依次解释一下:
使用from指定容器使用的镜像 。
使用workdir指定工作目录 。
使用copy指令,复制当前目录(其中.即代表当前目录)到容器中的/app目录下 。
使用run命令指定容器中执行的命令 。
使用expose指定容器暴露的端口号 。
使用env指定环境参数,上面用来告诉.netcore项目在所有网络接口上监听5000端口 。
使用entrypoint制定容器的入口点 。
dockerfile就绪,我们就可以将我们当前项目打包成镜像以分发部署.
使用docker build -t <name> <path>指令打包镜像:
> docker build -t mvctest.web . 。
以上命令就是告诉docker将当前目录打包成镜像,并命名为hellodocker.web。命令执行完毕,输入docker images即可看到我们新打包的镜像 。
镜像创建完毕我们就可以直接运行了:
> docker run -d -p 80:5000 mvctest.web 。
上面的指令就是运行我们新打包的镜像,并通过-p参数映射容器的5000到宿主机的80端口,其中-d参数告诉docker以后台任务形式运行镜像。因为80是默认的web端口,所以我们通过浏览器直接访问ip即可访问到我们容器中运行的mvc网站 。
至此,我们借助docker就完美的完成了.net core项目的容器化部署,后续我们将镜像部署在其它的机器上 。
5、推送镜像到仓库 。
请自行到docker hub注册个账号,然后我们把本地打包的镜像放到自己账号下的仓库下 。
1、注册完毕后,执行命令 。
> docker login 。
2、再执行命令 。
> docker push 。
推送失败,提示我们的镜像命名不符规范。原来在推送之前要把镜像按<user>/<repo>格式来命名。那如何重命名呢,我们用打标签的方式重命名 。
以上信息表示推送成功了,查看自己的仓库,如下图:
最后我们换一台机器,我们直接执行以下命令,就完成了多重部署 。
> docker run -p 8081:5000 79522860/mvcdemo.web 。
以上自己的镜像仓库做好了,是不是很方便,如果结合业务,会发现需要的镜像会比较多,分布式部署容器还要一个个启动容器?不,其它我们还可以通过配置文件来一键部署镜像与容器,一下篇我们会讲到 。
6、docker常用命令 。
1、容器相关操作 。
1
2
3
4
5
6
7
|
> docker ps
//查看当前正在运行的容器
> docker ps -a
//查看所有容器的状态
> docker start/stop id/name
//启动/停止某个容器
> docker attach id
//进入某个容器(使用exit退出后容器也跟着停止运行)
> docker rm id/name
//删除某个容器,若正在运行,需要先停止
> docker rm $(docker ps -a -q)
//删除已经停止的容器
> docker logs -f hello-world
//查看指定容器的日志记录
|
> docker run -it --name hello_001 hello-world //创建一个容器,并指定标签 。
-i:允许我们对容器内的 (stdin) 进行交互 。
-t:在新容器内指定一个伪终端或终端 。
--name:是给容器起一个名字,可省略,省略的话docker会随机产生一个名字 。
2、镜像相关操作 。
1
2
3
4
5
6
|
> docker images //查看本地镜像
> docker rmi id/name //删除某个镜像,如果不指定tag,默认删除的是latest标签
> docker rmi $(docker images -q) //删除所有镜像,小心
> docker rmi $(docker images -f "dangling=true" -q) //删除所有无名称镜像(可能是构建过程中产生的中间镜像)
> docker start/stop id/name //启动/停止某个容器
> docker attach id //进入某个容器(使用exit退出后容器也跟着停止运行)
|
通过id tag镜像,下面是tag一个id为0e5574283393的本地镜像到“fedora”存储库,tag名称version1.0 。
> docker tag 0e5574283393 fedora/httpd:version1.0 。
通过名称tag镜像, 使用名称“httpd” tag本地镜像到存储库”fedora”,且其tag名为version1.0 。
> docker tag httpd fedora/httpd:version1.0 。
注意由于引用httpd的tag名称没有指定,默认引用httpd:latest 。
通过名称和tag名称 tag一个镜像,为名称为httpd和tag名称为test的本地镜像做标签,其存储库为fedora,标签名为version1.0.test 。
> docker tag httpd:test fedora/httpd:version1.0.test 。
tag一个镜像到私有的存储库, 推送一个镜像到一个私有的registry,而不是公共的docker registry,必须指定一个registry主机名和端口来tag此镜像 。
> docker tag 0e5574283393 myregistryhost:5000/fedora/httpd:version1. 。
3、卸载 docker ce 。
a、卸载docker包 。
> yum remove docker-ce 。
b、主机上的images, containers, volumes或自定义配置文件不会自动删除。 删除所有mages, containers, volumes命令 。
> rm -rf /var/lib/docker 。
6、额外知识普及 。
1、docker官方镜像库地址 。
https://hub.docker.com/r/microsoft/dotnet/ 。
2、microsoft/dotnet 镜像版本之间的区别 。
a、microsoft/dotnet:<version>-sdk(microsoft/dotnet:2.1-sdk) 。
此映像包含带有 .net core 和命令行工具 (cli) 的 .net core sdk。 此映像将映射到开发方案。 可使用此映像进行本地开发、调试和单元测试。 此映像还可用于生成方案。 使用 microsoft/dotnet:sdk 始终都提供最新版本.
b、microsoft/dotnet:<version>-runtime(microsoft/dotnet:2.1-runtime) 。
此映像包含 .net core(运行时和库),并且针对在生产环境中运行 .net core 应用进行了优化.
c、microsoft/dotnet:<version>-runtime-deps 。
runtime-deps 映像包括具有 .net core 所需的所有本机依赖项的操作系统。 此映像适用于独立应用程序.
3、镜像加速 。
鉴于国内网络问题,后续拉取 docker 镜像十分缓慢,我们可以配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com.
新版的 docker 使用 /etc/docker/daemon.json(linux) 或者 %programdata%\docker\config\daemon.json(windows) 来配置 daemon.
请在该配置文件中加入(没有该文件的话,请先建一个):
1
2
3
|
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
|
#刷新配置文件并重启docker 。
1
2
3
|
systemctl daemon-reload
systemctl restart docker
|
**********如果使用aliyun,需要登陆自己的阿里云账户获取自己的镜像地址************ 。
总结 。
以上所述是小编给大家介绍的.netcore docker实现容器化与私有镜像仓库管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!原文链接:https://www.cnblogs.com/hailang8/p/11421055.html 。
最后此篇关于.NETCore Docker实现容器化与私有镜像仓库管理的文章就讲到这里了,如果你想了解更多关于.NETCore Docker实现容器化与私有镜像仓库管理的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用以下dockerfile: FROM ubuntu:14.04 MAINTAINER xxx xxx # SSH RUN apt-get update && apt-get install
我运行了docker-compose build celery,(经过数小时的尝试,我的连接不良)成功了。 app Dockerfile的前80%是相同的,但不会重复使用缓存。从我可以浏览的内容来看,
我可以使用以下命令成功创建 Docker 注册表 v2 服务:docker service create 然后我使用 docker Push 将一些图像推送到该服务。 当我通过 curl localh
我正在尝试使用 gitlab 构建 CI,我从 docker 的 docker 镜像开始,我的前端存储库没有任何问题,但现在使用相同的 gitlab-ci 配置文件,我有此守护程序错误。 这是构建的输
用例: 我们在 Jenkins 中有几个“发布作业”build 和 push 应用程序的 Docker 镜像到 docker registry,更新各种文件中的项目版本,最后将发布标签推送到相应的 G
当我尝试构建我的 docker 文件时,docker 返回以下错误: [+] Building 0.0s (1/2)
docker-in-docker 的作者在此博客中建议不要将此图像用于 CI 目的: jpetazzo/Using Docker-in-Docker for your CI or testing en
我创建了一个 Dockerfile 来在 Docker 中运行 Docker: FROM ubuntu:16.04 RUN apt-get update && \ apt-get in
我尝试为 Docker 镜像定位一个特定标签。我怎样才能在命令行上做到这一点?我想避免下载所有图像,然后删除不需要的图像。 在 Ubuntu 官方版本中,https://registry.hub.do
我正在尝试在docker中运行docker。唯一的目的是实验性的,我绝不尝试实现任何功能,我只想检查docker从另一个docker运行时的性能。 我通过Mac上的boot2docker启动docke
docker-compose.yml version: "3" services: daggr: image: "docker.pvt.com/test/daggr:stable"
我有一个非常具体的开发环境用例。在一些代码中,我启动了一个容器来抓取页面并检索在容器中运行的服务(Gitlab)的 token 。 现在,我希望 Dockerize 运行它的代码。具体来说,类似: o
之前已经问过这个问题,但我不确定当时是否可以使用docker-compose文件完成docker堆栈部署。 由于最新版本支持使用compose将服务部署到堆栈,因此,我无法理解dab文件的值。 我检查
我在一次采访中被问到这个问题,但无法回答。也没有找到任何相关信息。 最佳答案 正如 Docker 文档中所述,Docker 注册表是: [...] a hosted service containin
有没有一种方法可以将具有给定扩展名的所有文件复制到Docker中的主机?就像是 docker cp container_name:path/to/file/in/docker/*.png path/o
我的日志驱动程序设置为journald。使用日志记录驱动程序时,daemon.json文件中的日志级别配置会影响日志吗?使用docker logs 时仅会影响容器日志? 例如,docker和journ
我最近开始使用Docker + Celery。我还共享了full sample codes for this example on github,以下是其中的一些代码段,以帮助解释我的观点。 就上下文
运行docker build .命令后,尝试提交构建的镜像,但收到以下错误 Step 12 : CMD activator run ---> Using cache ---> efc82ff1ca
我们有docker-compose.yml,其中包含Kafka,zookeeper和schema registry的配置 当我们启动docker compose时,出现以下错误 docker-comp
我是Docker的新手。是否可以在Docker Hub外部建立Docker基本镜像存储库?假设将它们存储在您的云中,而不是拥有DH帐户?谢谢。 最佳答案 您可以根据需要托管自己的注册表。可以在Depl
我是一名优秀的程序员,十分优秀!