在 Docker 中部署 .NET Core 网站

在 Docker 中部署网站和服务,已经是当前比较流行的运维技术,也是未来不可逆转的大趋势。作为一名 .net 开发人员,掌握 Docker 部署 .NET 网站和服务,已经是必备的技能,刻不容缓。本篇文章基于 .NET5 开发的网站,以非常简单易懂的方式,快速介绍部署方式,目的在于让大家能够快速入门,增加学习兴趣和信心。

1、安装 Docker

有关 CentOS7 安装 docker ,可以参考我的其它博客,链接地址如下:

在线安装:https://www.cnblogs.com/studyjobs/p/17460227.html

离线安装:https://www.cnblogs.com/studyjobs/p/18016962.html

2、创建并发布.NET5 的网站

1 使用 VS2019 创建项目,选择 ASP.NET Core Web 应用(模型-视图-控制器),然后一直点击下一步,可以考虑取消 HTTPS 创建出如下图所示的代码结构:

image

2 在 appsettings.json 中增加两个配置节:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  //这个是我新增加的配置节:网站启动时的端口
  "ListenPort": "http://*:9090",
  //这个是我新增加的配置节:用于显示在首页的文本
  "DisplayText": "Hello Jobs"
}

3 在 Models 文件夹下,创建一个类 CommonBLL.cs ,代码如下:

using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CoreWebDemo.Models
{
    public static class CommonBLL
    {
        //这个是我新增加的代码
        //作用是在网站启动前加载 appsettings.json 配置文件
        public static IConfiguration Config = 
            (new ConfigurationBuilder())
            .SetBasePath(Environment.CurrentDirectory)
            .AddJsonFile("appsettings.json", false, true).Build();
    }
}

备注:上面的 AddJsonFile 方法的第三个参数为 true ,表示如果修改了 appsettings.json 配置文件的话,会自动重新加载,更新上面的 Config 这个变量的内容。


4 修改 Views/Home 文件夹下的 Index.cshtml ,增加一行代码用于显示 appsettings.json 中配置节 DisplayText 中的文本到首页中,因为后面要演示网站和配置文件分离部署。(网站部署在 Docker 中,appsettings.json 文件放在 Docker 外面,修改外面的 appsettings.json 文件中的配置节,不用重启 Docker,首页刷新一下自动更新成 appsettings.json 修改后的配置节内容)

image


5 修改 Program.cs 代码,使用 appsettings.json 中配置的端口,作为网站启动端口

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(
    webBuilder =>
    {
        //我在这里增加了代码 UseUrls(要监听的网站地址端口),
        //格式类似为:UseUrls(Http://*:9090)
        webBuilder.UseUrls(CommonBLL.Config["ListenPort"]).UseStartup<Startup>();
    });

6 选择以控制台方式启动(默认使用的是 IIS Express 方式启动,端口是 5000)

image

image

image

如果控制台方式启动正常,网站启动的端口也是 appsettings.json 中 ListenPort 对应的端口,通过 localhost:9090 访问能够打开页面,并且也把配置节 DisplayText 配置的内容显示出来,则表示以上代码写的没有问题。


7 采用框架依赖、可移植的方式发布网站程序

image

发布后的内容如下图所示:

image

到此为止,Docker 部署前的准备工作已经完毕。


3、生成 Docker 镜像

下面我们把已经发布的网站,生成 Docker 镜像,具体步骤如下:

1 使用 xftp 登录到 CentOS7 服务器,在根目录下创建一个文件夹 application ,然后在 application 文件夹中再创建一个 CoreWebDemo 文件夹。将之前发布的网站,复制到 CoreWebDemo 文件夹中,另外再把 appsetting.json 文件复制一份到 application 文件夹下。

备注:application 文件夹下的这个 appsettings.json 用于在 Docker 外部署,方便后续如果要是更改配置节时,不需要进入 Docker 中进行修改。

image


2 在本机 windows 电脑上新建一个文本文件 df.txt ,编写生成镜像的指令,也就是大家常说的 Dockerfile

# 表示以 .NET5 的 SDK 作为基础镜像
FROM mcr.microsoft.com/dotnet/sdk:5.0
# 进入 Docker 时直接就进入到了 /app 这个目录
WORKDIR /app
# 将当前目录下的所有文件,复制到 docker 的 /app 目录下
COPY . /app
# 启动网站服务
ENTRYPOINT ["dotnet","CoreWebDemo.dll"]

注意:每行开头的指令,必须是大写字母。


3 将编写好的 df.txt 文件,通过 xftp 复制到 /application/CoreWebDemo 目录下

image


4 使用 xshell 登录到 CentOS7 服务器上,运行以下命令:

# 进入到 CentOS7 上网站的目录
cd /application/CoreWebDemo

# 生成 .NET5 网站的 Docker 镜像文件
docker build -t mydemo -f df.txt .

image

docker build 的参数:

-t 表示生成的镜像的 tag 名称(如果包含字母,只能使用小写字母)

-f 表示要使用的 Dockerfile 文件名称

后面一定要跟上一个点(.)


5 运行 docker images 就可以看到所生成的镜像

image


4、Docker 部署 .NET5 网站

1 使用以下命令,运行刚才生成的 .NET5 镜像

docker run --name mycoredemo -d -p 9999:9090 -v /application/appsettings.json:/app/appsettings.json mydemo

以上命令参数的含义:

--name 指定运行后的服务名称

-d 表示后台运行,不阻塞前台线程,这样命令行窗口仍然可以使用

-p 进行端口映射,网站启动后的端口是 9090(之前配置的),我想让服务器使用 9999 端口访问

-v 表示卷映射,可以把 docker 外面的文件夹或文件,映射到 docker 内部的文件夹或文件,这里将外面的 appsettings.json 配置文件,映射到 docker 网站部署的文件夹中的 appsettings.json 配置文件,从而实现在 docker 外部修改配置就可以使用 docker 内部的网站配置生效


2 运行以下命令开通防火墙 9999 端口

# 在防火墙中开通 9999 端口
firewall-cmd --zone=public --add-port=9999/tcp --permanent

# 重启加载防火墙配置
firewall-cmd --reload

3 如果 CentOS7 启动了 SeLinux 的话,请关闭 SeLinux

SeLinux 的配置文件在 /etc/selinux 目录下,配置文件的名称是 config,

打开它进行编辑,将 SELINUX 后面的值修改为 disabled

image

然后使用 xshell 运行命令 init 6 重新启动 Linux 服务器。(SeLinux 配置修改,必须重启才能生效)

到此为止 .NET5 网站在 Docker 中部署完毕,下面就访问验证一下吧。


5、浏览器访问验证部署成果

我的 CentOS7 服务器的 ip 地址是:192.168.44.5

我自己的电脑的 ip 地址是 192.168.44.88

两个 ip 在同一个网段中,因此可以直接通过 ip 地址进行访问。我们刚才通过 CentOS7 服务器的 9999 端口映射到 Docker 内网站的 9090 端口,因此可以通过 http://192.168.44.5:9999 访问网站。

image

由于我们在运行 .NET5 网站镜像时,通过 -v 参数,

把 CentOS7 服务器上 /application/CoreWebDemo/appsettings.json 文件,

映射到了 docker 内部的 /app/appsettings.json 配置文件,

因此只需要修改 CentOS7 服务器上的 appsettings.json 文件,

就相当于修改了 Docker 中 .NET5 网站的配置文件。

我们通过 xftp 把 CentOS7 服务器上的 appsettings.json 中的配置节 DisplayText 的值修改为 Perfect Jobs,保存后,然后刷新一下网页,可以发现页面也显示为 Perfect Jobs

image




posted @ 2021-09-07 21:14  乔京飞  阅读(9153)  评论(0编辑  收藏  举报