本教程的前提是,你已经在Linux服务器上已经成功的安装了Docker,我会大概介绍在此过程中用到的Docker命令,并不会介绍所有的Docker命令(因为我也不会)。

一、在Docker中运行Dotnet Core Hello World

微软官方提供了已经集成好Dotnet Core运行所需环境的Docker Image,我们可以直接使用命令:

docker run -it microsoft/dotnet:latest

其中

-i :交互模式 (so we can interact with it)

-t :  分配一个(伪)tty (link is external

microsoft/dotnet:这是微软提供的Docker Core的官方Image名称,

latest :表示我们使用这个版本的Image

通过上面的命令,我们就创建了一个Docker Container,并且启动它。

其实Docker Run,他是分了三步走的:

    • 查看本地是否有我们所需要启动的镜像,没有的话,尝试去服务器获取
    • 创建一个容器,对应的Docker命令:
docker create -it microsoft/dotnet:latest

如果创建成功了,则会输出一个容器的ID,我们也可以通过docker ps来查看

    • 启动容器,对应的Docker命令
docker start  -a -i 容器ID

这时候,我们就把最基本的容器启动起来了,在容器中,就可以执行一些Dotnet Core的控制台命令:

root@0260ab2fd089:/# dotnet new
Created new C# project in /.
root@0260ab2fd089:/# mkdir docker //创建一个文件夹,名字叫docker
root@0260ab2fd089:/# cd docker/
root@0260ab2fd089:/docker# dotnet new //创建一个Dotnet Core项目
Created new C# project in /docker.
root@0260ab2fd089:/docker# dotnet restore //还原Dotnet Core项目的依赖包
log : Restoring packages for /docker/project.json...
log : Writing lock file to disk. Path: /docker/project.lock.json
log : /docker/project.json
log : Restore completed in 4658ms.
root@0260ab2fd089:/docker# dotnet run //启动Dotnet Core项目
Project docker (.NETCoreApp,Version=v1.) will be compiled because expected outputs are missing
Compiling docker for .NETCoreApp,Version=v1. Compilation succeeded.
Warning(s)
Error(s) Time elapsed ::03.0599700 Hello World! //输出结果

二、部署一个 Web API项目到Docker

1.创建API

我们来使用VS 2015创建一个WebAPI项目的名称为:JaxApi,并对默认项目做以下调整:

A.升级项目所依赖的所有Nuget包

因为可能有的VS版本稍旧,他默认引用的包都是rc版本的,不升级可能会有一些小问题,我在最早尝试的时候遇到过在本地跑的好好的,但是到了docker中就跑不起来的问题。

如果你的VS默认引用的rc版本,那么你升级后可能会遇到项目编译不过的问题,好像是Nuget的一个Bug,他把project.json改了,我的解决办法是,在frameworks    ->   netcoreapp1.0 节点下增加如下配置:

"Microsoft.NETCore.App": {
"version": "1.0.0",
"type": "platform"
}

然后把dependencies中对Microsoft.NETCore.App的引用干掉。

这个问题最新的VS中不存在,只是我公司因为各种原因无法安装最新版

B.让WebApi不止监听localhost来的请求

新建的API项目默认他只会监听来自Localhost的web请求,我们需要在Program类中增加一个配置:

public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseUrls("http://*:9100")//监听来自所有ip的9100端口的请求
.UseStartup<Startup>()
.Build(); host.Run();
}
}

C.发布Web API

通过文件系统发布WebAPI,这里与发布普通网站并没有什么不同,所有选项默认,跟着VS一步一步来~

发布的时候最好留个后门,在Release和PublishOutput中间加上一层文件夹,待会儿告诉你啥用,比如我的发布目录:.\bin\Release\Docker\PublishOutput

2.编写DockerFile

打开刚才发布的目录,新建一个没有后缀的文件Dockerfile,与PublishOutput文件夹同级

这里我们如果使用命令行来把文件粘贴到服务器的话,文件夹要比粘贴单个文件方便的多,而且对于我本地测试来说,也没有必要来回折腾压缩文件。这种文件夹层级更加便于我们上传文件~

Docker File 内容如下,注意端口号要和上面我们Program中配置的一样:

FROM microsoft/dotnet:latest

WORKDIR /root

# Copy the app file to root

COPY PublishOutput /root/

# Configure the listening port to
EXPOSE /tcp # Start the app
ENTRYPOINT dotnet JaxApi.dll

然后把Dockerfile和PublishOutput一起上传到Linux服务器上,具体怎么上传大家就八仙过海各显神通吧~

3.编译成Image并运行

在Linux服务器上Dockerfile所在目录下,运行命令:

docker build -t jaxapi ./

docker build:根据Dockerfile来编译一个Docker Image出来

-t : 给镜像打个tag(标签),类似于起个名字

这样子,我们的docker镜像就在我们的服务器上编译好了,这时候,我们可以来启动我们的api,供外界访问

docker run -it -p : --name jaxapi jaxapi

-p :映射docker容器的端口,docker里面的9100端口映射到Linux的9100端口上

--name: 给我的container起个别名,这个可以不加

这样子,如果你在控制台看到如下提示,就证明你已经成功了:

Hosting environment: Production
Content root path: /docker
Now listening on: http://*:9100
Application started. Press Ctrl+C to shut down.

查看一下你的Linux服务器的Ip,然后通过http://ip:9100 来访问你的api吧,默认的API项目只有/api/values这个URL可以访问,最终运行效果如下:

如果您在阅读过程中,遇到一些问题,欢迎留言讨论。

未完待续……

【Step By Step】将Dotnet Core部署到Docker上的更多相关文章

  1. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...

  2. 【Step By Step】将Dotnet Core部署到Docker(中)

    在Docker中运行MySql MySQL 官方也提供了各种版本的MySQL Image来供用户使用,我们可以使用如下命令来创建并运行一个MySQL Image: docker run -it -p ...

  3. .NET Core 3.0 部署在docker上运行

    自从.NET Core3.0发布之后,写了几篇关于.NET Core 3.0的文章,有助于你快速入门.NET Core3.0. 本篇文章主要讲解如何一步步创建一个mvc项目,然后发布并部署在Docke ...

  4. .NET core 部署到Docker +Docker Protainer管理实现

    .NET core 部署到Docker +Docker Protainer管理实现 上次说到将.net core的应用程序发布到Linux中(https://www.cnblogs.com/Super ...

  5. 六、.net core (.NET 6)程序部署到Docker上

    使用Docker部署应用程序 首先确保已经安装Docker 桌面软件,如下图: 然后,把需要部署到Docker上面的项目,咱们先添加Docker的支持,启动项目右键 -> 添加 -> Do ...

  6. dotnet core部署方式两则:CLI、IIS

    最近在使用dotnet core研究整个开发过程,使用下面两种方式部署: 一,使用 dotnet run 命令运行 在项目路径,shift+右键,选择 “在此处打开命令窗口”,在CMD窗口中运行“do ...

  7. .net core部署在iis上

    部署在Windows Server 2008 R2上,一直安装失败,网上找的资料一直无法解决问题,后来找到了官方的文档, 原来是要安装sp1,大概2g左右,同时也要安装Microsoft Visual ...

  8. Linux下将.Asp Core 部署到 Docker容器中

    我们来部署一个简单的例子: 将一个简单的.Aps Core项目部署到Docker容器中并被外网访问 说明: 下面的步骤都是建立在宿主服务器系统已经安装配置过Docker容器,安装Docker相对比较简 ...

  9. 我用asp.net core 部署到docker遇到的问题

    1.怎么部署 我是用文件的形式先发布出来,然后把文件拷贝到服务器上部署到docker中去. 2.端口映射 根据查找到的资料,dockerfile 是不支持指定映射服务器端口的,只能在run的时候用-p ...

随机推荐

  1. IDEA 2017.2.2 环境下使用JUnit

    JUnit:单元测试框架,测试对象为一个类中的方法. JUnit不是Javase的一部分,想要使用需要导入jar包,在IntelliJ IDEA 中自带JUnit插件. JUnit 版本有3.X 4. ...

  2. DOM基础操作(三)

    DOM剩余的两个操作一并带来! 1.删除操作 removeChild 这个方法依然是父级调用的,参数就是要删除的子节点,其实实际上是剪切,这个方法会把我们删除掉的元素给返回,我们可以用一个变量去保存这 ...

  3. Python随笔目录

    Python 一.Python基础 Python入门 数据类型 函数(迭代器生成器三元表达式) 模块和常用内置模块 面向对象 网络编程(socket) 并发编程 ... 二.数据库 MySQL PyM ...

  4. c++实现全密码生成

    这里所谓的“全密码”指的是指定字符串中所有可能出现的密码.以字符串“0123456789”为例,可能出现的2位密码会有100个,即L^N个.(L代表字符串的长度,N代表要生成密码的位数). 第一种方法 ...

  5. 【html/css】模态框的实现

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 算法之冒泡排序(Java语言)

    冒泡排序(英语:Bubble Sort) 是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说 ...

  7. MAC电脑安装svn客户端cornerstone

    个人感觉在mac上最好用的svn客户端就是cornerstone,公司客户端也统一使用这个 sudo spctl --master-disable 这条命令作用就是使得mac运行安装任何来源App,不 ...

  8. MySQL在线加字段实现原理

    博客已转移到腾讯DBA博客 http://tencentdba.com/ 腾讯互娱内部维护了一个MySQL分支,基于官方5.5.24,实现了类似于Oracle 11g的快速加字段功能,这个分支我们内部 ...

  9. kettle使用命令行传入数据库链接参数(ip、数据库、端口、用户、密码)执行job时子转换失败。

    使用cmd 传参数执行 kettle job 遇到错误: 错误原因,无法找到文件.... 原来使用,通过目录指定转换,好处是:当以文件资源库保存时,可以直接将文件夹复制走,直接运行就可以,不需要单独针 ...

  10. Selenium2学习(一)-pip降级selenium3.0

    selenium版本安装后启动Firefox出现异常:'geckodriver' executable needs to be in PATH selenium默默的升级到了3.0,然而网上的教程都是 ...