今天带给大家一篇文章,想大家介绍下在Centos7下,如何在docker环境部署一个简单的基于.Net6的.NetCore应用,也就是打包项目镜像,并在Linux下使用打包的镜像运行一个容器。

一 环境准备

1.1虚拟机

我们准备一台Centos虚拟机,我这里是7.6.虚拟机安装我就不介绍了,可以参考我的一篇文章


下面的虚拟机可以看到,没有.Net环境

docker制作win7镜像 制作docker镜像centos_容器

1.2 安装SdK

参考我的博文

1.3 新建项目

这里我们选择webapi

docker制作win7镜像 制作docker镜像centos_c#_02

项目建好后如下,会默认一个天气信息的控制器

docker制作win7镜像 制作docker镜像centos_c#_03

 我们稍微修改下,加一个run by docker标识

namespace DockerSample.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)] + "【run by docker】"
            })
            .ToArray();
        }
    }
}

 项目运行后,会打开swagger文档,是webapi内置好的,我们测试一下,会看到结果

docker制作win7镜像 制作docker镜像centos_c#_04

 可以看到我们加的标识了

docker制作win7镜像 制作docker镜像centos_容器_05

 1.4 配置docker

我们右键项目,添加=》添加Docker支持,这里选Linux

docker制作win7镜像 制作docker镜像centos_docker制作win7镜像_06

 确定后会生成一个Dockerfile文件,我们调整下内容

docker制作win7镜像 制作docker镜像centos_docker制作win7镜像_07

 这里我给出了每行配置的说明

# 环境运行时基础镜像
FROM mcr.microsoft.com/dotnet/aspnet:6.0
#将当前目录内容 copy到镜像目录
COPY .  /DockerSample
#设置工作目录
WORKDIR /DockerSample
#对外暴露端口 
#(注:EXPOSE并不会让容器的端口访问到主机。
#要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,
#或通过-P参数来发布EXPOSE导出的所有端口)
EXPOSE 80
EXPOSE 443
#运行镜像入口命令和可执行文件名称
ENTRYPOINT ["dotnet", "DockerSample.dll"]

 1.5 发布项目

因为我主机是win10,没有开启Hyper-V,所以我把项目发布后,上传到linux打包镜像,发布流程就按普通的web项目,发布到一个文件夹就好

发布前注意,修改下 Dockerfile的属性,设置为始终复制,这样就不用手动复制了

docker制作win7镜像 制作docker镜像centos_c#_08

docker制作win7镜像 制作docker镜像centos_c#_09

 1.6生成docker镜像

我们把刚才发布目录上传到前面准备的Linux服务器

docker制作win7镜像 制作docker镜像centos_容器_10

cd进入该目录

docker制作win7镜像 制作docker镜像centos_.netcore_11

 现在开始生成镜像,我们先看下docker已有镜像列表,等下可以对比新生成镜像

docker制作win7镜像 制作docker镜像centos_c#_12

 接下来,执行

docker build -t dockersample-image/1.0 -f Dockerfile .

(注意 . 是必须的,代表当前目录)

docker制作win7镜像 制作docker镜像centos_docker_13

 再查看下镜像,可以看到镜像已经生成成功了

docker制作win7镜像 制作docker镜像centos_c#_14

 生成的镜像,可以push到国内的镜像仓库,或者本地局域网的私服仓库,用于测试、生产等环境的发布使用

1.7 运行容器

有了镜像,我们就可以使用了

执行 

docker run -d -p 8001:80 --name dockersample1 dockersample-image/1.0

docker制作win7镜像 制作docker镜像centos_.netcore_15

我们浏览器访问服务器的8001端口 http://node2:8001/,发现报404了

docker制作win7镜像 制作docker镜像centos_docker_16

 仔细检查了发布流程,发现没问题,最后检查配置发现了问题,原来默认只有在调试环境,才会开启Swagger文档

docker制作win7镜像 制作docker镜像centos_c#_17

 这样的话,我们就直接访问接口地址吧,http://node2:8001/WeatherForecast,数据出来了

docker制作win7镜像 制作docker镜像centos_容器_18

 我们再新开一个容器试试

docker run -d -p 8002:80 --name dockersample2 dockersample-image/1.0

docker制作win7镜像 制作docker镜像centos_docker制作win7镜像_19

  访问下接口地址8002,http://node2:8002/WeatherForecast,数据也出来了

docker制作win7镜像 制作docker镜像centos_.netcore_20