.NETCore Docker实现容器化与私有镜像仓库管理

一、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安装

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

 > wget -P /etc/yum.repos.d/ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 > yum install -y docker-ce

2、启动Docker

 //启动 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.加载这个镜像到容器中, 并运行它

三、.Netcore项目在Docker中运行

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

> docker pull microsoft/dotnet

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

 > 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项目是在容器内部创建的,是与宿主机完全隔离的。这个时候你可能会想,每次都要在容器中安装源代码太不方便了,我们能不能让容器运行我们宿主机的源代码项目?嗯,这是个好问题。当然是可以实现的,下面我们就来解答这个问题。

四、 宿主机上创建.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项目

 > 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参数挂载宿主机的文件到容器的指定目录下。换句话说,就相当于宿主机共享指定文件供容器去访问

// 命令中的`\`结合`Enter`键构成换行符,允许我们换行输入一个长命令。
 > docker run -it \
 > -v /data/mvctest/:/app \
 > microsoft/dotnet:latest

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

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

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

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

4、借助Dockerfile文件

下篇我们升级此操作,不需Dockerfile的依赖,操作一条命令搞定。

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

 > cd /data/mvctest/ //确保进入我们创建的MVC项目目录中去
 > touch Dockerfile //使用touch命令创建Dockerfile
 > vi Dockerfile //使用vi命令编辑Dockerfile

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

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项目的容器化部署,后续我们将镜像部署在其它的机器上

五、推送镜像到仓库

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

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

> docker login

2、再执行命令

> docker push

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

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

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

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

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

六、Docker常用命令

1、容器相关操作

 > 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、镜像相关操作

 > 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

六、额外知识普及

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。

请在该配置文件中加入(没有该文件的话,请先建一个):

{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}

#刷新配置文件并重启docker

systemctl daemon-reload

systemctl restart docker

**********如果使用aliyun,需要登陆自己的阿里云账户获取自己的镜像地址************

总结

以上所述是小编给大家介绍的.NETCore Docker实现容器化与私有镜像仓库管理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 详解Docker 容器基础系统镜像打包

    因为容器本身是共享宿主操作系统内核,所以容器基础系统镜像包本身就是一个标准的 Linux rootfs + 用户自定义的工具.根据这个思路,我们就可以构建一个自己的容器基础系统镜像. 构建标准的 Linux rootfs 的方式有很多种方法,Redhat.Debian.SUSE等主流的发行版都有提供相应的工具支持. 大概的流程如下: 构建基础的 rootfs -> 配置基础系统参数 -> 部署用户自定义软件 -> 清理系统 -> 打包为容器镜像 -> 测试镜像 -> 发

  • .netcore 使用surging框架发布到docker

    demo运行在windows的docker中,系统是win10,所以需要先下载Docker for Windows,安装完毕后系统会重启,然后桌面上可以找到Docker for Windows的快捷图标,右下角有个鲸鱼小图标 单击右键,选择菜单中的Kitematic 会提示你下载Kitematic,自行下载后解压即可,将Kitematic快捷到桌面: 打开Kitematic,在搜索栏中下载好RabbitMQ.redis.consul相关镜像,因为这些是surging运行的先决条件. 接着去Git

  • Docker定制容器镜像的2种方法(推荐)

    一.需求 由于在测试环境中使用了docker官网的centos 镜像,但是该镜像里面默认没有安装ssh服务,在做测试时又需要开启ssh.所以上网也查了查资料.下面详细的纪录下.在centos 容器内安装ssh后,转成新的镜像用于后期测试使用. 二.镜像定制 第一种方式(手动修改容器镜像) 1.先下载centos镜像 [root@docker ~]# docker pull centos 2.启动容器并进行配置 启动容器, [root@docker ~]# docker run -it -d --

  • Docker私有仓库管理和删除本地仓库中的镜像

    一:Docker私有仓库安装 1. 下载镜像是有镜像仓库: [root@localhost ~]# systemctl start docker #如果已经有镜像了,强制删除原来的镜像的方式如下: [root@xxx-pub /]# docker rmi -f docker.io/registry Untagged: docker.io/registry:latest Untagged: docker.io/registry@sha256:51bb55f23ef7e25ac9b8313b139a

  • .NETCore Docker实现容器化与私有镜像仓库管理

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

  • 使用GoogleContainerTools容器化jib构建docker镜像

    目录 前言碎语 插件配置 配置详解 插件命令使用 集成插件生命周期 文末结语 前言碎语 今天分享一个在容器化过程中非常重要的一个工具,java应用docker镜像build工具jib,这个工具是谷歌团队研发开源的,特点是不依赖docker守护进程,直白点说就是本地环境不安装docker环境也可以打包docker镜像.不用依赖维护Dockerfile,而且基于java打包插件可以轻松嵌入到java本身的构建生命周期中(本文使用maven).可以说是java容器化构建利器. 插件配置 <plugin

  • skywalking容器化部署docker镜像构建k8s从测试到可用

    目录 前言碎语 docker镜像构建 application.yml webapp.yml setApplicationEnv.sh setWebAppEnv.sh Kubernetes中部署 文末结语 前言碎语 skywalking是个非常不错的apm产品,但是在使用过程中有个非常蛋疼的问题,在基于es的存储情况下,es的数据一有问题,就会导致整个skywalking web ui服务不可用,然后需要agent端一个服务一个服务的停用,然后服务重新部署后好,全部走一遍.这种问题同样也会存在sk

  • Node.js服务Docker容器化应用实践小结

    本篇不会讲解 Docker 命令的使用.安装等,因为在之前一篇文章一文零基础教你学会 Docker 入门到实践中也已经讲解的很详细了,不清楚的可以点击链接回头在重新看下,本篇重点是介绍 Node.js 项目如何进行 Docker 容器化及一些实践优化,还有一些常见的问题,当然如果还有其它使用上的问题也欢迎大家在评论区进行留言补充. 作者简介:五月君,Nodejs Developer,热爱技术.喜欢分享的 90 后青年,公众号「Nodejs技术栈」,Github 开源项目 www.nodejs.r

  • Docker搭建私有镜像仓库的方法

    和Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库. 使用私有仓库有许多优点: 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可: 提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用. 现在Docker用处越来越多了,所以今天就想着搭建一个私有镜像仓库来维护内部我们自己的镜像. 环境 CentOS 7.x Docker 1.12.6 安装 docker-

  • docker创建私有镜像仓库搭建教程

    我的环境相关设置如下 环境:centos7 IP地址:10.211.55.30 dockere版本:1.10.3 镜像仓库:v2 首先在10.211.55.30机器上下载registry镜像 $ docker pull registry 也可以进行镜像导入的方法进行离线的安装.可以去我的网盘中下载:https://pan.baidu.com/s/1jHZlz2u 然后进入Docker中进行导入 $ docker load -i registry.tar 下载完之后我们通过该镜像启动一个容器 $

  • Docker容器化spring boot应用详解

    前置条件 容器化spring boot应用所需环境: jdk 1.8 + maven 3.0 + 我们的需求是:使用maven打包,将spring boot应用制作成docker镜像并上传到docker hub.在其他机器上,可以直接docker pull并运行容器. 创建spring boot应用 spring boot 包结构为: └── src └── main └── java └── me └── ithakar 创建spring boot Application主类,src/main

  • 详解利用ELK搭建Docker容器化应用日志中心

    概述 应用一旦容器化以后,需要考虑的就是如何采集位于Docker容器中的应用程序的打印日志供运维分析.典型的比如SpringBoot应用的日志 收集.本文即将阐述如何利用ELK日志中心来收集容器化应用程序所产生的日志,并且可以用可视化的方式对日志进行查询与分析,其架构如下图所示: 架构图 镜像准备 镜像准备 ElasticSearch镜像 Logstash镜像 Kibana镜像 Nginx镜像(作为容器化应用来生产日志) 开启Linux系统Rsyslog服务 修改Rsyslog服务配置文件: v

  • Django Docker容器化部署之Django-Docker本地部署

    本章将在本地搭建一个容器化的 Django 项目,感受 Docker 的运作方式. 前期准备 开发环境 虽然有基于 Windows 的 Docker 版本,但各方面兼容做得都不太好(安装也麻烦些),因此建议读者在学习前,自行安装好 Linux 或 Mac 系统.当然你愿意折腾的话,在 Windows 上搞也行. 别担心,以后开发 Django 项目仍然可以在 Windows 下进行,仅仅是开发时不使用 Docker 而已. 软件安装 Docker:学习 Docker 当然要安装 Docker 软

  • CentOS7.2服务器上搭建Docker私有镜像仓库操作示例

    本文实例讲述了CentOS7.2服务器上搭建Docker私有镜像仓库操作.分享给大家供大家参考,具体如下: 鉴于国内pull镜像的速度较慢,很有必要搭建docker私有或者本地镜像仓库. 安装docker # yum -y install docker # systemctl start docker && systemctl enable docker 使用自签名进行安全认证 创建存放证书和密钥的certs目录 # mkdir -p /docker/certs # chcon -Rt s

随机推荐