专栏首页.net core让.NetCore程序跑在任何有docker的地方
原创

让.NetCore程序跑在任何有docker的地方

一.分别在Windows/Mac/Centos上安装Docker

Windows上下载地址:https://docs.docker.com/docker-for-windows/install/(window上安装的常见问题和解决方案请参考下方步骤六)

Mac上下载地址:https://hub.docker.com/editions/community/docker-ce-desktop-mac

Centos上安装Docker请参考我上篇文章链接:https://www.cnblogs.com/peyshine/p/12915317.html

二.打开vs 新建一个Web程序

这里选择启动docker支持,主要是为了能够自动生成dockerfile文件,如果忘记勾选了也没关系,也可以右键解决方案,点击‘添加’,选择‘docker支持’,vs也会自动为我们生成dockerfile,大概长这个样子

对dockerfile文件解释说明:

1.FROM

通过FROM指令来设置要制作的镜像基于哪个镜像,FROM指令必须是整个Dockerfile的第一个指令,如果指定的镜像不存在默认会自动从Docker Hub上进行拉取

2.WORKDIR

通过workdir指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录),该指令在Dockerfile文件中可以出现多次,如果使用相对路径则为相对于WORKDIR上一次的值

3.COPY

通过COPY指令来从指定路径拷贝一个文件或目录到容器的指定路径中

4.RUN

RUN指令会在一个新的容器中执行任何命令,然后把执行后的改变提交到当前镜像,提交后的镜像会被用于Dockerfile中定义的下一步操作,RUN中定义的命令会按顺序执行并提交,这正是Docker廉价的提交和可以基于镜像的任何一个历史点创建容器的好处,就像版本控制工具一样

5.EXPOSE

通过EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口

6.ENTRYPOINT

通过ENTRYPOINT指令我们指定在容器启动时要运行的应用程序

关于dockerfile的更多用法可以参考:https://docs.docker.com/engine/reference/builder/

三.DotNet Core 程序在Windows Docker上的运行

直接在VS中选择以docker方式运行,VS的输出控制台就会打印以下信息内容

可以看到运行之前,VS先做了几个检查工作

  • windows上是否安装了Docker Desktop
  • Docker Desktop是否在运行
  • Docker Desktop的操作系统模式是否与项目的目标操作系统匹配
  • 指定需要的镜像本地是否存在,不存在的就会进行拉取
  • 检查完了之后就是打包镜像和运行容器

四.打包发布镜像到https://hub.docker.com/

选择发布到Docker hub,输入自己的账号密码,没有的话可以注册一个

点击发布之后,输出控制台可以看到有build打包的过程

发布完成之后,控制台会有对应的提示信息,已经成功推送带标记的‘latest’的Docker镜像

进入Docker hub上,在自己的账户的存储库下面会多处一个镜像文件,也就是刚刚推送过去的

点击进入,可以看到拉取的命令

在powershell中拉取自己的镜像

运行容器,运行成功会返回一个长的字符串,通过docker ps指令,可以查看容器已经成功运行起来了

那么这个镜像是否能在linux上拉取并运行呢?答案是否定的,因为在添加docker支持时候,我这边选了平台支持为windows,如图

步骤四:只是玩一下怎么打包推送镜像文件,不关注的可以直接跳过步骤四

五.DotNet Core 程序在Centos Docker上的运行

重新在VS中添加一个dockerfile,这次选择linux平台的

这次我们需要修改下dockerfile文件

因为我们提前编译并且发布出来了文件,所以在dockerfile中就不需要这些步骤了

贴一下dockerfile文件

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
COPY . /app
ENTRYPOINT ["dotnet", "WebApp_Docker.dll"]

发布后将Release文件下所有文件上传到centos上,然后执行以下命令打包镜像

docker build -t docker_web_test:1.0 .

后面的点可以打印出具体的执行步骤细节

通过指令验证打包结果:# docker images

最后运行容器

docker run --name docker_web_test -d -p 7788:80 docker_web_test:1.0

可以看到容器已经运行起来,并且可以输出页面内容。

六.可能遇见的错误解决方案以及小提示:

1.在window上安装docker时需要勾选上Hyper-V

2.如果在运行容器过程中依然提示错误:“The virtual machine could not be started because a required feature is not installed”,那就需要检查bios中的虚拟功能,拿我的华硕主板和inter处理器来示范,将Inter(VMX) Virtualization Tecjnology 的值设置为 Enabled

然后保存设置退出即可

3.当我们在windows上拉取镜像碰到提示镜像在当前操作系统不支持的时候,可以在linux和Windows容器之间切换。如图

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker在centos上的安装与常用命令大全

    docker run hello-world(由于docker run 在发现本地没有存在对应的image的时候,有自动抓取image的功能,所以上面一步不是必...

    Peyshine
  • 在Docker中安装MongoDB

    访问mongodb的镜像仓库地址:https://hub.docker.com/_/mongo?tab=tags&page=1

    Peyshine
  • CI与CD之Docker上安装Jenkins

    CI:持续集成(Continuous integration,简称 CI),在传统的软件开发环境中,有集成,但是没有持续集成这种说法,长时间的分支与主干脱离,导...

    Peyshine
  • 高中生也能读懂的Docker入门教程

    Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注。如果你关注最新的技术发展,那么你一定听说过 Docker。不管是...

    小小科
  • Docker学习笔记之了解 Docker 的核心组成

    在掌握 Docker 的一些背景知识后,我们还不得不花费一节的篇幅来简单介绍有关 Docker 核心的一些知识。当然,大家不要觉得有“核心”这类的词,我们就要在...

    Jetpropelledsnake21
  • 一分钟上手Docker容器

    在微服务时代,服务数量及规模越来越大,服务的部署及运维的模式如果仍然采用传统方式就会大大增加运维成本。所以微服务时代的运维方式一定是Devops模式,通过构建自...

    用户5927304
  • 一文了解Docker

    Docker是dotCloud公司(后更名为Docker)基于go语言开发的容器项目,2013年开源。该项目后来加入Linux基金会,遵从了Apache 2.0...

    用户1278550
  • Docker系列之原理简单介绍

    Docker是一个开源的应用容器引擎;是一个轻量级容器技术; Docker支持将软件编译成一个镜像;然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可...

    用户1208223
  • Debian 8 (Jessie)下面如何安装卸载docker

    Debian是使用非常广泛的系统,本篇文章第一部分讲述如何在Debian 8 (Jessie) 下面安装 Docker 环境,第二部分介绍了如何彻底的清理 De...

    Debian社区
  • Docker入门(一)-- 基础概念与安装

    Docker最初是dotCloud公司的创始人Solomon Hyks在法国期间发起的一个公司内部项目,它是基于dotCloud公司多年云服务技术的一次革新,并...

    CodingDiray

扫码关注云+社区

领取腾讯云代金券