docker部署Asp.net core应用的完整步骤

1 容器概念

使用Docker前我们首先要简单了解一下容器的概念。MSDN上有一张虚拟机和容器的对比图,很好的展示了虚拟机和容器的区别,如下所示,虚拟机包括应用程序、必需的库或二进制文件以及完整的来宾操作系统,每台虚拟机都有一个单独的内核,我们完全可以把虚拟机看做是一台真实的物理机。容器包括应用程序及其所有依赖项,与其他容器共享 OS 内核,容器在主机操作系统上作为独立进程运行,我们可以把容器看做是一个应用沙盒。

我们经常会遇到“我机器上可以运行”的问题吧,然后部署到其他机器时就遇到了各种坑,这多是因为其他设备上缺少应用所需的环境或者缺少应用的依赖项造成的。使用容器技术可以很好的解决这个问题,容器是一个“应用的沙盒”,这个沙盒内部包含了应用所需的环境和所有依赖项,只要有这个沙盒存在,应用在任何环境下都能正常的运行,容器技术的典型特点就是“一次封装,到处运行”。

Docker 是一个使用go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。我们先了解Docker中的三个核心概念:

1 镜像(Image)

 镜像是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

2 容器(Container)

 容器是镜像的运行时实例 ,执行镜像时内存中运行的就是容器。如果把镜像看做面向对象中的类,容器就是对象。使用类时通过new来获取一个对象,类似的使用镜像时通过 docker run <镜像名/镜像id>创建一个容器。

3 仓库(Repository)

 仓库时用来存放镜像的地方,Docker hub是docker官方提供的仓库,类似于githhub,,通过push推送镜像到仓库,通过pull命令拉取镜像。当然我们也可以使用其他仓库,或者自己搭建一个仓库。

2安装docker

 1 Windows安装docker

docker是运行在Linux系统上的,在Windows上使用docker默认要用到Hyper-V功能,所以我们在Windows系统上安装Docker必须先开启Hyper-V功能。首先打开【控制面板】,找到【启动或关闭Windows功能】,然后勾选【Hyper-V】,点击确定即可安装Hyper-V。

安装好Hyper-V后,到docker官网下载Windows版本的docker,docker需要登录账户才能下载,我们可以创建一个账户,牢记这个账号,我们以后会经常用到。docke下载地址:docker下载。下载完成后,双击安装包,一路next即可。安装完成后需要重启电脑,打开命令行,输入docker run hello-world,如果出现以下界面,表示docker已经安装成功了。docker run hello-world命令首先会在本地找名字为hello-world的镜像,如果本地不存在这个镜像就会从docker hub上拉取hello-world镜像,然后运行。

2 Centos安装docker

Linux系统安装常用软件都十分方便,执行下边的命令即可安装docker

#删除旧版本
sudo yum remove docker \
   docker-client \
   docker-client-latest \
   docker-common \
   docker-latest \
   docker-latest-logrotate \
   docker-logrotate \
   docker-engine
#安装一些需要的工具
yum install -y yum-utils device-mapper-persistent-data lvm2
#添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#更新yum缓存
yum makecache fast
#安装docker
yum -y install docker-ce
#启动docker服务
systemctl start docker
#测试docker
docker run hello-world

安装完成后执行docker run hello-world命令,如果出现下边的界面表示docker安装成功了

3 Docker基本使用

1 使用官方docker实例

可以查看官方教程详细地了解docker的使用,这里我们先用两分钟分钟展示一下微软官方提供的docker栗子,执行命令docker run -p 8000:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/core/samples:aspnetapp,-p 8000:80表示将服务器的8000端口和容器的80端口建立映射,访问服务器8000端口时会去访问容器的80端口。--name设置镜像的名字

打开浏览器,访问虚拟机的8000端口如下,说明我们的容器已经成功启动了!

我们使用docker imagesdocker container ls查看一下本机的容器和镜像,结果如下:

2 Docker常用命令

其实我们实际开发中能用到的docker命令并不多,这里简单汇总一下最常用的docker命令。

## 查看docker版本和信息
#查看docker-cli的版本
docker --version
#查看docker版本和信息
docker version
docker info

## docker镜像相关命令
#拉取镜像
docker pull [imgName:tag]
#运行镜像,执行后会生成一个容器
docker run [imgName:tag/imgID]
#查看所有的镜像
docker images
#删除镜像 执行rmi命令前必须删除所有该镜像的container
docker rmi [imgName:tag/imgID]
#查看所有的容器,没有-a表示查询所有正在运行中的容器
docker container ls -a
#查看docker正在运行和已经停止的容器
docker ps -a
#启动容器
docker start [ctnName/cID]
#停止容器
docker stop [ctnName/cID]
#删除容器,执行rm命令前必须先停止该容器
docke rm [ctnName/cID] 

##清理镜像和容器
#删除所有的镜像和容器
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
#删除所有的容器
docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
#清除名称为none的镜像
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
docker images|grep none|awk '{print $3 }'|xargs docker rmi

有时候我们需要和容器交互,可以使用命令docker exec -it [name/id] common。如我们启动一个mysql容器mysqlx1,执行docker exec -it mysqlx1 mysql -p表示和容器mysqlx1交互,执行的命令是【mysql -p】进行登录,如下所示。Ctrl +p+q退出容器,回到服务器目录。

3 定制容器

大多数用户使用docker的核心目的是更方便的交付项目,就是将我们的应用程序构建成镜像,然后交付镜像即可,这里演示怎么构建一个Aspnet core项目的镜像。

1. 开发aspnet core应用

我们创建一个Asp net core MVC项目,项目名为DockerDemo,为了方便不勾选Https和Docker支持,如下:

简单修改首页,运行一下,测试项目没有bug,运行首页如下:

2 发布项目,添加Dockerfile

发布项目,然后在发布文件夹下添加Dockerfile文件,结构如下:

Dockerfile的内容如下:

#拉取runtime父镜像,运行aspnet core应用必须要用runtime
FROM microsoft/dotnet:2.2-aspnetcore-runtime
#设置容器工作目录
WORKDIR /DockerDemo
#把当前目录的所有文件copy到工作目录中
COPY . /DockerDemo
#暴露一个端口让外部可以访问
EXPOSE 80
#容器入口命令,即容器启动时执行dotnet DockerDemo.dll命令
ENTRYPOINT ["dotnet", "DockerDemo.dll"]

Dockerfile常见指令简单说明

Dockerfile常用指令:

#FROM:通常情况下,我们创建的镜像时基于另外一个镜像的,这时就要用FROM,当然我们也可以完全从头创建
#WORKDIR:设置容器的工作目录
#MAINTAINER:该镜像的维护人
#COPY:经常需要把源码复制到容器中,只用COPY就可以实现这一点
#RUN:这里可以定义一些需要运行的命令,执行的目录是WORKDIR。如npm install ,dotnet restore,dotnet run等
#ENTRYPOINT:定义容器的入口,通常是一些dotnet/node等命令,如dotnet xxx.dll
#CMD:设置容器运行的默认命令和参数,即容器启动时执行的命令。当容器运行时,可以通过命令行覆盖CMD定义的命令
#EXPOSE:暴露端口
#ENV:设置环境变量

3 创建镜像

docker创建镜像很简单,执行docker build -t dockerdemo:v1.0 .命令即可创建镜像,其中dockerdemo:v1.0是镜像的名字和版本tag,名字和tag可以随便设置。然后通过docker images命令查看所有镜像,如下:

4 运行容器

使用命令docker run -d -p 8080:80dockerdemo:v1.0启动容器,-d 表示后台运行,-p 8080:80表示服务器的8080端口映射到容器的80端口,我们也可以使用服务器的其他端口,容器的端口为Dockerfile中Expose的端口。执行docker container ls查看容器,这里我们的容器已经启动了,如下:

打开浏览器,输入【服务器IP:服务器端口】接口访问容器,如下:

到这一步,本地创建镜像和运行容器成功了。

5 使用docker hub存储和分发镜像

docker提供了远程仓库用于存储和分发镜像,其作用类似于github,区别在于github托管代码,而docker hub托管镜像。我们创建好了镜像可以推送(push)到远程仓库,然后在其他设备上拉取(pull)镜像,有了docker hub我们可以更方便的管理和分发镜像。docker hub的使用非常简单,只记住三个命令就可以了

#标记镜像,就是设置远程镜像名和标记
docker tag localname:localtag dockeruser/repname:reptag
#推送镜像文件到docker hub
docker push username/repname:reptag
#拉取远程镜像
docker pull repname:reptag

#注:localname是本地镜像名 localtag是本地镜像tag
# repname远程仓库的镜像名 reptag是远程仓库的tag
# username是我们的dockerhub用户名

这里将上边创建的本地镜像推动到docker hub。使用命令docker tag dockerdemo:v1.0 wyyxxx/resdockerdemo:v1.0标记,使用命令docker push wyyxxx/resdockerdemo:v1.0推动镜像到远程仓库,打开镜像仓库,登陆后就可以看到我们自定义的镜像了,如下所示。

然后使用另一台安装了docker的服务器,执行命令docker run -p 8080:80 wyyxxx/resdockerdemo:v1.0拉取远程镜像并启动,打开浏览器输入地址,如下:

我们在通过拉取远程镜像并运行容器时,不需要事先部署环境(如安装runtime)等,因为镜像中已经设置了需要的所有环境和依赖资源,只需要使用docker run命令运行即可。这也是使用容器交付的方便之处。

4 使用Docker的一点建议

① “3C原则”一个容器只运行一个应用

② 使用镜像交付应用程序,而不是直接部署

如果要在centos上部署一个aspnet core应用程序。错误的做法是:在docker中先安装一个centos系统,在centos系统中部署环境,然后部署我们的netcore应用程序,,最后把部署的应用程序生成镜像。正确的做法是通过Dockerfile定义我们需要的环境和依赖项,然后生成镜像,通过镜像去分发和执行。

③ 分层构建镜像

还是上边centos部署netcore应用的栗子,如果从零定制镜像时,我们应该把centos作为一层镜像,环境runtime作为一层镜像,最后我们的应用做为一层镜像,使用Dockerfile的FROM 指令拉取父镜像。这样做的好处是节省空间和复用镜像。如上边我们使用了2.2版本的runtime镜像,当我们创建了另一个web应用再来定制镜像时,这两个应用程序镜像可以 共用同一个runtime镜像。

④ 不要把数据存储在容器中

容器是随时可能销毁的,销毁后容器内部的数据就不存在了,所以最好不要在容器中存储需要持久化的数据。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • 利用docker-compose搭建AspNetCore开发环境

    使用docker-compose搭建AspNetCore开发环境 1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上监听一个端口就可以了,不污染主机.再组合各Web程序.Redis/Memcached.SqlServerOnLinux. 新建一个目录sites,所有和集群相关的都放在这里,目录结构如下所示 sites     nginx      

  • Docker容器运行ASP.NET Core的实现步骤

    最近要学习的知识太多,都不知道先学哪些了,原本计划这篇博客是写xamarin.forms中的listview用法,关于listview的用法简书上有一篇介绍的也比较详细,所以暂时先缓一缓,属于次要任务,等以后再写.本周在万能的淘宝找了写关于区块链的教程,同时了解了下.net core.最近一两年对C#技术跟进不多,侧重点是Java,之前出.net core1.0的时候觉得.net core还不完善,所以就没学,没想到.net core这么快已经要到3.0了.毕竟自己是C#出身,一精多转,不能忘本

  • .Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的方法

    前言 本文主要介绍了关于.Net Core自动化部署用docker版jenkins部署dotnetcore应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的实现步骤吧. 安装docker版jenkins 因为jenkins的docker版本本身没有 dotnetcore的环境,所以我们需要先自己动手制作下包含dotnet环境的jenkins Docker Container Dockerfile FROM jenkins/jenkins # Switch to root t

  • 详解.NET Core+Docker 开发微服务

    .NET Core发布很久了,因为近几年主要使用java,所以还没使用过.NET Core,今天正好有一个c#写的demo,需要做成服务,不想再转成java来实现,考虑使用.NET CORE来尝下鲜,目标是开发一个微服务,然后部署到Docker swarm集群,供其他应用调用. 环境准备 下载.NET core的最新版本2.1.3, 安装后打开命令行验证: 出现下面的输出,就代表安装成功了 dotnet Usage: dotnet [options] Usage: dotnet [path-to

  • 详解ASP.NET Core 网站在Docker中运行

    Docker作为新一代的虚拟化方式,未来肯定会得到广泛的应用,传统虚拟机的部署方式要保证开发环境.测试环境.UAT环境.生产环境的依赖一致性,需要大量的运维人力,使用Docker我们可以实现一次部署,到处运行. 本文介绍如何把ASP.NET Core网站部署在Docker中运行. 软件环境清单 CentOS 7.3.1611 Docker 1.12.6 .NET Core 1.1 安装Docker $ #安装Docker $ yum install docker $ #启动docker服务 $

  • 详解ASP.NET Core Docker部署

    前言 在前面文章中,介绍了 ASP.NET Core在 macOS,Linux 上基于Nginx和Jexus的发布和部署,本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序. ASP.NET Nginx 发布和部署 :http://www.cnblogs.com/savorboard/p/dotnet-core-publish-nginx.html. Asp.Net Jexus 发布和部署:http://www.cnblogs.com/savorboard/p/dot-n

  • Centos7+Docker+Jenkins+ASP.NET Core 2.0自动化发布与部署的实现

    前言 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将Jenkins搬到Docker上.为什么要写这篇文章呢?因为找过相关的资料,大多数文章都是基于Ubuntu 安装.net core 又或者 GitLab 进行持续集成 自动部署等等等,并未有人尝试过Centos7.3 上部署 Jenkins 并且 构建 ASP.NET CORE 2

  • Asp.net Core Jenkins Docker实现一键化部署的实现

    写在前面 在前段时间尝试过用Jenkins来进行asp.net core 程序在IIS上面的自动部署.大概的流程是Jenkins从git上获取代码 最开始Jenkins是放在Ubuntu的Docker中,但是由于Powershell执行的原因,就把Jenkins搬到了windows上.因为我们网站的部署需要停掉IIS站点,所以需要Powershell来远程操作服务器(上传文件,停止站点,启动站点),也很顺利的利用WinRM+Powershell脚本实现了上面的功能,但是最后在实际使用中发现,脚本

  • docker部署Asp.net core应用的完整步骤

    1 容器概念 使用Docker前我们首先要简单了解一下容器的概念.MSDN上有一张虚拟机和容器的对比图,很好的展示了虚拟机和容器的区别,如下所示,虚拟机包括应用程序.必需的库或二进制文件以及完整的来宾操作系统,每台虚拟机都有一个单独的内核,我们完全可以把虚拟机看做是一台真实的物理机.容器包括应用程序及其所有依赖项,与其他容器共享 OS 内核,容器在主机操作系统上作为独立进程运行,我们可以把容器看做是一个应用沙盒. 我们经常会遇到"我机器上可以运行"的问题吧,然后部署到其他机器时就遇到了

  • Linux系统Docker 部署 ASP.NET Core应用的流程分析

    一.系统环境 1.腾讯云轻量应用服务器CentOS7.6 二.操作流程及途中遇到的问题 1.SSH方式远程Linux ssh <username>@<IP address or domain name> 如果遇到下图问题: 出现这个问题的原因:known_hosts是记录远程主机的公钥的文件,之前重装个系统,而保存的公钥还是未重装系统的系统公钥,在ssh链接的时候首先会验证公钥,如果公钥不对,那么就会报错 解决方法:使用shh-keygen 命令ssh-keygen -R IP,执

  • Linux CentOS下docker部署Asp.Net6 Core

    1.项目设置 设置dockerfile属性为"始终复制", 修改dockerfile文件内容为: FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /web COPY . . EXPOSE 80 EXPOSE 443 FROM base AS final ENTRYPOINT ["dotnet", "OneZhanMVC.dll"] ps:若项目没有dockerfile右键项目,点击

  • 使用Docker部署ASP.NET Core程序

    一.前言 这篇文章介绍如何将一个ASP.NET Core应用程序在Docker中进行部署.开发工具使用的是Visual Studio 2019和VS Code. 二.使用Docker部署 我们选择新建一个MVC项目进行演示. 1.新建MVC项目 模板选择ASP.NET Core Web应用程序,如下图所示: 输入项目名称,点击“创建”: 选择Web应用程序(模型视图控制器),并勾选“启用Docker支持”,如下图所示: 然后会检查Docker环境是否安装,如下图所示: 这样一个MVC项目就创建完

  • Linux上使用Docker部署ASP.NET Core应用程序

    一.创建 1.创建应用程序 使用ASP.NET Core创建一个MVC应用程序,并修改Home控制器Index视图代码: @{ ViewData["Title"] = "Home Page"; } <div class="text-center"> @*<h1 class="display-4">Welcome</h1> <p>Learn about <a href=&qu

  • Linux CentOS下docker部署Asp.Net Core(.Net6)

    1.项目设置 设置dockerfile属性为"始终复制", 修改dockerfile文件内容为: FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /web COPY . . EXPOSE 80 EXPOSE 443 FROM base AS final ENTRYPOINT ["dotnet", "OneZhanMVC.dll"] ps:若项目没有dockerfile右键项目,点击

  • 使用Docker部署ASP.NET Core程序

    一.前言 这篇文章介绍如何将一个ASP.NET Core应用程序在Docker中进行部署.开发工具使用的是Visual Studio 2019和VS Code. 二.使用Docker部署 我们选择新建一个MVC项目进行演示. 1.新建MVC项目 模板选择ASP.NET Core Web应用程序,如下图所示: 输入项目名称,点击“创建”: 选择Web应用程序(模型视图控制器),并勾选“启用Docker支持”,如下图所示: 然后会检查Docker环境是否安装,如下图所示: 这样一个MVC项目就创建完

  • ubuntu16.4下用jexus部署ASP.NET Core环境

    上篇文章介绍了下用vs发布部署到iis环境,今天说下ubuntu下部署asp.net core,不需要安装.net core sdk,自带运行时方式部署,利用jexus服务器转发请求到asp.net core. 1.部署准备环境 vmware虚拟机(其他也可以) ubuntu16.04镜像 2.发布环境 win10系统 vs2015 update3 或vs code (也可以用dotnet new -t web 命令创建项目) dotnet sdk DotNetCore.1.0.0-SDK.Pr

  • 详解在Azure上部署Asp.NET Core Web App

    在云计算大行其道的时代,当你要部署一个网站时第一选择肯定是各式各样的云端服务.那么究竟使用什么样的云端服务才能够以最快捷的方式部署一个 ASP.NET Core的网站呢?Azure 的 Web App 服务是个很好的选择. 下面我们会通过 Visual Studio 创建一个 Asp.net Core demo 应用,然后把这个 demo 应用部署到 Azure Web App.通过阅读本文,您将能了解到如何创建 Asp.NET Core 应用程序和如何在Azure上创建 Web App 并部署

  • 在IIS上部署ASP.NET Core Web API的方法步骤

    对于本文,我想与您分享有关如何在IIS上部署ASP.NET Core Web API的指南.我将指导您安装Visual Studio 2019,.NET Core Runtime 3.0.我还确保我逐步引导您在服务器(Web IIS)中启用它,使用no受管代码选项创建新的应用程序池,创建ASP.NET Core Web API项目以及发布ASP.NET Core Web API. 了解并遵循正确的步骤来准备开发和部署环境后,在IIS上部署ASP.NET Core Web API就是一件容易的事.

随机推荐