Ubuntu 16.04+.Net Core+Docker+Nginx安装部署

前言

  最近公司的项目打算移植到.Net Core平台,所以调研了一下.Net Core在Linux下的安装部署。本篇文章会一步步的描述从安装到配置到部署的全部过程。在文章的结构和内容里,笔者借鉴了很多其他博文的内容,但感觉其他博文中都只是实现了一部分或者没有将配置内容写全。笔者做的是整理一下自己的实际部署过程。

目录

1. 准备工作

2. 创建一个非root用户

3. 更新服务器

4. 安装.Net Core

5. 创建Demo

6. 守护进程部署

7. Nginx反向代理

8. 安装Docker

9. 在Docker中部署.Net Core项目

步骤

1. 准备工作

  • 一台Linux服务器:笔者用的是VMWare的虚拟机模拟的环境,有条件的朋友可以使用真实服务器作为部署环境

  • Linux终端:笔者用的是MobaXterm

2. 创建一个非root用户

$ sudo adduser docker_user
$ sudo usermod -aG sudo docker_user
$ exit

640?wx_fmt=png


3. 更新服务器

$ sudo apt-get update        $ sudo apt-get upgrade       
$ sudo apt-get dist-upgrade  $ sudo reboot

 

4. 安装.Net Core

我们要运行.Net Core的项目,自然要安装.Net Core的环境啦。这里微软提供了大部分Linux版本的安装方案,我使用的是Ubuntu16.04,所以以下代码是针对这个系统版本的,如果你使用的是其他版本可以参考(https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x)

// 注册微软产品Key为被信任的

$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg

$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg


// 设置所需要的版本主机包

$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'

// APT支持Https

$ sudo apt-get install apt-transport-https

$ sudo apt-get update


// 安装.Net Core SDK

$ sudo apt-get install dotnet-sdk-2.0.3


// 检查安装是否成功

$ dotnet --version

5. 创建Demo

因为是Demo项目,所以就在用户根目录下创建一个文件夹,将该文件夹作为项目的根目录。

5.1 创建项目

$ cd ~/$ mkdir helloworld
$ cd helloworld
$ dotnet new mvc

640?wx_fmt=png

5.2 发布项目

$ dotnet restore
$ dotnet publish -c Release

640?wx_fmt=png

5.3 运行发布好的程序

通过上面的截图我们发现,发布完的程序和在PC平台上的差不多,是在bin/Release的目录下。我们先移动到这个目录,然后用"dotnet"命令运行这个Demo

$ cd bin/Release/netcoreapp2.0/publish/$ dotnet helloworld.dll

640?wx_fmt=png

执行命令以后,终端会如上图所示。这个时候就说明程序已经跑起来了。倒数第二行则说明了,程序默认的端口号是5000。这个时候我们就可以通过服务器IP+端口号5000访问这个网站了。(注:如果是外网访问,需要在防火墙打开5000端口的权限。这个就不在本文中扩展了。)

笔者是通过开启另一个终端来测试程序是否正常的,结果如下:

// 通过wget请求网站$ wget http://localhost:5000

640?wx_fmt=png

6. 守护进程部署

走到这一步,有不少同学就发现了。现在的程序是需要我们始终打开终端才能保证网站可以被访问的,那接下来我们要做的就是将这个网站部署成一个自定义服务。让网站可以在后台进程中运行。

6.1 准备运行目录

按照Linux部署习惯,我们在var目录下创建一个www文件夹,并将刚才发布的Demo放到该目录下

$ cd /var

$ sudo mkdir www

$ cd www

$ sudo mkdir helloworld

$ cd helloworld

$ sudo cp -r ~/helloworld/bin/Release/netcoreapp2.0/publish/* .

6.2 创建服务配置文件

$ cd /etc/systemd/system/$ sudo touch dotnet-helloworld.service

6.3 编写服务配置文件

$ sudo vi dotnet-helloworld.service

先通过vi进入该文件(注:vi是Linux下最常用的文本编辑器之一,如果对vi不了解,可以自行百度,这里就不扩展了)。进入编辑后,将以下代码写入配置文件

[Unit]

Description=DotNet Core HelloWorld Running on Ubuntu


[Service]

WorkingDirectory=/var/www/helloworld                             // 工作目录,这里我们写的是刚才创建的网站工作目录

ExecStart=/usr/bin/dotnet /var/www/helloworld/helloworld.dll     // 服务的实际执行命令

Restart=always

RestartSec=10

SyslogIdentifier=dotnet-example

User=docker_user                                                 // 已docker_user的身份启动

Environment=ASPNETCORE_ENVIRONMENT=Production

Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false


[Install]

WantedBy=multi-user.target

上面这段配置文件我是参考微软官方的部署文档写的(文档链接)

6.4 启动服务

$ sudo systemctl enable dotnet-helloworld.service
$ sudo systemctl start dotnet-helloworld.service

6.5 检查服务状态

$ sudo systemctl status dotnet-helloworld.service

当服务启动后,运行status命令查看服务状态时,会返回服务执行的日志,终端会显示类似于下图的代码。

640?wx_fmt=png

这段代码和我们之前直接用命令行启动dotnet项目是相似,这也就说明我们的服务部署成功了。我们再使用wget验证,同样可以访问这个网站了。

7. Nginx反向代理

做到这里,.Net Core项目的部署已经差不多了。接下来我们就通过Nginx进行反向代理。

7.1 安装Nginx

// 安装命令$ sudo apt-get install nginx// 完成安装后检查安装是否成功$ nginx -v

7.2 配置反向代理

// 移动到Nginx配置文件夹

$ cd /etc/nginx/conf.d/


// 创建代理配置文件

$ sudo touch helloworld.conf


// 编辑配置文件

$ sudo vi helloworld.conf


// 配置内容

server {

    listen 80;


    location / {

        proxy_pass http: //localhost:5000;

        proxy_http_version 1.1;

        proxy_set_header Upgrade $http_upgrade;

        proxy_set_header Connection keep - alive;

        proxy_set_header Host $host;

        proxy_cache_bypass $http_upgrade;

    }

}


// 测试配置

$ sudo nginx -t


// 重新加载配置

$ sudo nginx -s reload

当完成这一步后,我们就可以在浏览器里直接输入服务器的IP地址来访问Demo网站了。

640?wx_fmt=png

注:这里有一个小坑,Nginx有一个默认配置文件,文件路径在:/etc/nginx/sites-available下。文件名是default。如果访问的时候打开的不是上面这个网站,那需要到这个配置文件下,把所有的配置都注释掉,再重新reload一下Nginx。

 

8. 安装Docker

通过上面的教程,大家已经可以在自己电脑上访问Linux服务器上的.Net Core项目了。接下来我们将.Net Core项目放到Docker下运行,并同样通过Nginx方向代理,使我们能访问到.Net Core项目。

8.1 卸载旧版本Docker

因为Ubuntu系统可能自带Docker,所以在安装新版Docker前先将旧版的Docker清楚干净

$ sudo apt-get remove docker \
docker-engine \
docker.io

8.2 安装

$ sudo apt-get update


// 由于apt源使用 HTTPS 以确保软件下载过程中不被篡改。因此,我们首先需要添加使用HTTPS 传输的软件包以及 CA 证书。

$ sudo apt-get install \

apt-transport-https \

ca-certificates \

curl \

software-properties-common


// 鉴于国内网络问题,强烈建议使用国内源,官方源请在注释中查看。

// 为了确认所下载软件包的合法性,需要添加软件源的  GPG  密钥。

$ curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -


// 官方源

// $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -


// 向 source.list 中添加 Docker 软件源

sudo add-apt-repository \

"deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \

$(lsb_release -cs) \

stable"


$ sudo apt-get update


// 执行安装命令

$ sudo apt-get install docker-ce


8.3 启动Docker服务

$ sudo systemctl enable docker
$ sudo systemctl start docker

8.4 建立Docker用户组

默认情况下,docker命令会使用 Unix socket 与 Docker 引擎通讯。而只有 root 用户和 docker 组的用户才可以访问 Docker 引擎的 Unix socket。出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

 

// 建立docker用户组,这行命令执行的时候可能会报该用户组已存在。如果报这个错,可以直接跳过这条命令。$ sudo groupadd docker// 将当前用户加入docker用户组$ sudo usermod -aG docker $USER

 

执行完这条命令后,退出终端重新登录一下。就可以使用docker命令来管理docker了。

8.5 镜像加速器配置

镜像(image)是docker的一个基础元素,但当我们在国内的网络环境中拉取Docker Hub(官方Docker镜像库)镜像时会变得比较困难,这时我们就可以配置镜像加速器。这里我使用的是Docker官方提供的国内加速器服务。

// docker文件夹默认是只允许root访问的。这里笔者偷个懒就直接开放docker的文件夹权限了。

sudo chmod 777 /etc/docker

cd /etc/docker


// 创建并编辑加速器源

sudo touch daemon.js

sudo vi daemon.js


// 文件内容

{

    "registry-mirrors": [

        "https://registry.docker-cn.com"

    ]

}


// 重启服务

$ sudo systemctl daemon-reload

$ sudo systemctl restart docker

9. 在Docker中部署.Net Core项目

9.1 拉取.Net Core镜像

$ sudo docker pull microsoft/dotnet

9.2 修改Demo程序

之前我们用的是默认的Demo程序运行,程序是运行在5000端口上的,在我们的实际环境中,不可能每个服务都用同一个端口号,所以这次我们将端口好做一个小变动。

// 移动到最开始我们创建的Demo中。编辑Program.cs// $ cd ~/helloworld// $ vi Program.cs

内容为

namespace helloworld

{

    public class Program

    {

        public static void Main(string[] args)

        {

            BuildWebHost(args).Run();

        }


        public static IWebHost BuildWebHost(string[] args) =>

            WebHost.CreateDefaultBuilder(args)

                .UseStartup<Startup>()

                .UseUrls("http://*:10001")        // 使用10001作为程序运行时端口

                .Build();

    }

}

完成之后,我们重新发布

$ dotnet restore
$ dotnet publish -c Release

9.3 编写Dockerfile

// 移动到发布目录

$ cd ~/helloworld/bin/Release/netcoreapp2.0/publish/// 创建Dockerfile

$ sudo touch Dockerfile


// 编辑Dockerfile

$ sudo vi Dockerfile

以下是Dockerfile的内容

// 基于.Net Core镜像来构建我们的镜像

FROM microsoft/dotnet


// 将程序复制到镜像中的publish目录

COPY . /publish


// 定义工作目录为publish

WORKDIR /publish


// 设置Docker容器对外暴露的端口

EXPOSE 10001


// 执行dotnet命令

CMD ["dotnet", "helloworld.dll"]


9.4 构建Docker镜像

$ docker build -t helloworld:1.0 .

注意最后有一个"."

 640?wx_fmt=png

9.5 运行构建的镜像

$ docker run --name helloworld -d -p 10001:10001 helloworld:1.0

 

640?wx_fmt=png

 

9.6 修改Nginx配置

在本文前半段,我们让Nginx代理了5000端口,现在我们把他改为10001。

// 编辑之前创建的Nginx配置

$ cd /etc/nginx/conf.d/

$ vi helloworld.conf


// 只需要修改代理的端口就行

server {

  listen 80;


  location / {

    proxy_pass http://localhost:10001;

    proxy_http_version 1.1;

    proxy_set_header Upgrade $http_upgrade;

    proxy_set_header Connection keep-alive;

    proxy_set_header Host $http_host;

    proxy_cache_bypass $http_upgrade;

  }

}


// 重载Nginx

$ sudo nginx -t

$ sudo nginx -reload

好了。大功告成,我们现在又可以在浏览器中用服务器IP直接访问到Demo网站了。

总结

这次学习的过程,总共花了大概两天时间,反反复复看了很多其他的教程。但大部分教程都感觉要么没说清楚,要么就是缺少某个步骤而导致最后运行不起来,所以在完成配置以后,决定写下这篇文章,算是给自己一个交代。也希望可以帮到各位看客。

原文:http://www.cnblogs.com/noahji/p/8947151.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划】加法最大 (ssl 1595)/乘积最大 (ssl 1007)

加法最大加法最大加法最大 Description 设有一个长度为n的数字字符串&#xff0c;分成k1个部份&#xff0c;使其k1部份相加的和为最大。例如&#xff1a;数字串’340670’&#xff0c;k1&#xff0c;其加法有 34067040673 340670704 3406701010 3406703476 34076034076 其最…

7、mybatis中的sql映射文件详解(2)

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

jzoj4051-序列统计【NTT】

正题 题目链接:https://jzoj.net/senior/#contest/show/3017/2 题目大意 求有多少个长度为nnn的序列使得 都是在集合SSS中的数这些数的乘积%mx\% mx%mx 解题思路 设fi,jf_{i,j}fi,j​表示长度为iii的序列&#xff0c;乘积为jjj的有多少个&#xff0c;显然有 fi,j∗w%mfi−1…

玩Docker只要浏览器就够了,PWD是个神奇的网站

本文是d4d系列的第9篇&#xff0c;在这一篇中给大家介绍一个学习Docker最为快捷高效的方式&#xff0c;你不需要自己搭建环境&#xff0c;也不用担心把自己的开发环境搞乱&#xff0c;你需要的只是一个浏览器&#xff0c;就可以立即开始学习Docker的常用命令&#xff1b;你甚至…

【树形DP】没有上司的晚会 (ssl 1607)

没有上司的晚会没有上司的晚会没有上司的晚会 Description Ural大学有N个职员&#xff0c;编号为1~N。他们有从属关系&#xff0c;也就是说他们的关系就像一棵以校长为根的树&#xff0c;父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会&#xff0c…

8、mybatis中的sql映射文件详解(3)

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

P3159-[CQOI2012]交换棋子【费用流】

正题 题目链接:https://www.luogu.com.cn/problem/P3159 题目大意 n∗mn*mn∗m的棋盘&#xff0c;每个格子有黑子或白子&#xff0c;每次可以交换两个位置的棋&#xff0c;给出起始态和最终态和每个格子参与交换的最多次数。 求最少交换次数。 解题思路 这里只把白色棋子算作…

[系统安全]使用OD编写连连看外挂

文档下载地址&#xff1a;https://pan.baidu.com/s/1hrzzerq

2018 .NET开发者调查报告: .NET Core 是怎么样的状态

4月28日&#xff0c;在公众号里发起《.NET Core 使用调查》&#xff0c;该调查为期一周&#xff0c;有近3300名开发者参与&#xff0c;统计下结果供你的决策参考。已经使用.net core 的人数只有44%&#xff0c;计划使用.net core 比例达到48%&#xff0c; 没有计划去使用.net …

【动态规划】【递归】取数字问题 (ssl 1644)

取数字问题取数字问题取数字问题 Description 给定M*N的矩阵&#xff0c;其中的每个元素都是-10到10之间的整数。你的任务是从左上角&#xff08;1&#xff0c;1&#xff09;走到右下角&#xff08;M&#xff0c;N&#xff09;&#xff0c;每一步只能向右或向下&#xff0c;并…

9、mybatis中动态sql的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

软件质量保证划重点期末复习总结

软件质量保证复习总结大纲及问题 Module1 《软件工程实践》 1、软件工程实践通过解决问题的根源来指导软件开发。 2、软件工程实践之间相辅相成。 3、过程指导一个团队在什么时候做什么以及如何做。 4、软件工程过程为实现软件工程实践提供了上下文和支持。 Module2 《软件…

P4721-[模板]分治FFT【NTT,分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4721 题目大意 给出序列ggg&#xff0c;然后f01f_01f0​1 fi∑j1ifi−jgjf_{i}\sum_{j1}^if_{i-j}g_jfi​j1∑i​fi−j​gj​ 求序列fff 解题思路 使用分治后用NTTNTTNTT计算前区间对后区间的贡献即可。 时间复杂度O(nlo…

Microsoft Build 2018 直播来啦!

一年一度的Microsoft Build大会又来啦&#xff01;Microsoft Build是微软面向全球开发者、合作伙伴以及消费者介绍其重要产品在未来一年内发展方向的技术盛会。而今年的Microsoft Build 2018大会是微软巨大蜕变、最彻底组织变革后的第一次前沿技术大会。更多了解&#xff0c;请…

【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<100) n1个数,表示矩阵(<100) Output 最小的乘法次数 Sample Input 5 5 10 4 6 10 2 Sample Output 348 题目大意&#xff1a; 有n个矩阵&#xff0c;输入n1个数&#x…

10、mybatis中缓存的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

C#编译器优化那点事

使用C#编写程序&#xff0c;给最终用户的程序&#xff0c;是需要使用release配置的&#xff0c;而release配置和debug配置&#xff0c;有一个关键区别&#xff0c;就是release的编译器优化默认是启用的。优化代码开关即optimize开关&#xff0c;和debug开关一起&#xff0c;有以…

P3195-[HNOI2008]玩具装箱【斜率优化dp】

正题 题目链接:https://www.luogu.com.cn/problem/P3195 题目大意 nnn个物品&#xff0c;分成若干段&#xff0c;每一段的长度为j−i∑ilrCkj-i\sum_{il}^rC_kj−i∑ilr​Ck​&#xff0c;打包价格为(长度−L)2(长度-L)^2(长度−L)2 求最小价格和。 解题思路 si∑j1iCjs_i\su…

【动态规划】书的复制 (ssl 1203)

书的复制书的复制书的复制 Description 现在要把m本有顺序的书分给k个人复制&#xff08;抄写&#xff09;&#xff0c;每个人的抄写速度都一样&#xff0c;一本书不允许分给两个或两个以上的人抄写&#xff0c;分给每个人的书&#xff0c;必须是连续的&#xff0c;比如不能把…

P1975-[国家集训队]排队【树状数组套线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P1975 题目大意 一个nnn个数字的序列&#xff0c;每次交换两个数&#xff0c;求逆序对。 解题思路 显然交换lll和rrr的话对[1..l−1][1..l-1][1..l−1]和[r1,n][r1,n][r1,n]是不会有影响的&#xff0c;所以我们只需要考虑ll…