今天带给大家一篇文章,想大家介绍下在Centos7下,如何在docker环境部署一个简单的基于.Net6的.NetCore应用,也就是打包项目镜像,并在Linux下使用打包的镜像运行一个容器。
一 环境准备
1.1虚拟机
我们准备一台Centos虚拟机,我这里是7.6.虚拟机安装我就不介绍了,可以参考我的一篇文章
下面的虚拟机可以看到,没有.Net环境
1.2 安装SdK
参考我的博文
1.3 新建项目
这里我们选择webapi
项目建好后如下,会默认一个天气信息的控制器
我们稍微修改下,加一个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内置好的,我们测试一下,会看到结果
可以看到我们加的标识了
1.4 配置docker
我们右键项目,添加=》添加Docker支持,这里选Linux
确定后会生成一个Dockerfile文件,我们调整下内容
这里我给出了每行配置的说明
# 环境运行时基础镜像
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的属性,设置为始终复制,这样就不用手动复制了
1.6生成docker镜像
我们把刚才发布目录上传到前面准备的Linux服务器
cd进入该目录
现在开始生成镜像,我们先看下docker已有镜像列表,等下可以对比新生成镜像
接下来,执行
docker build -t dockersample-image/1.0 -f Dockerfile .
(注意 . 是必须的,代表当前目录)
再查看下镜像,可以看到镜像已经生成成功了
生成的镜像,可以push到国内的镜像仓库,或者本地局域网的私服仓库,用于测试、生产等环境的发布使用
1.7 运行容器
有了镜像,我们就可以使用了
执行
docker run -d -p 8001:80 --name dockersample1 dockersample-image/1.0
我们浏览器访问服务器的8001端口 http://node2:8001/,发现报404了
仔细检查了发布流程,发现没问题,最后检查配置发现了问题,原来默认只有在调试环境,才会开启Swagger文档
这样的话,我们就直接访问接口地址吧,http://node2:8001/WeatherForecast,数据出来了
我们再新开一个容器试试
docker run -d -p 8002:80 --name dockersample2 dockersample-image/1.0
访问下接口地址8002,http://node2:8002/WeatherForecast,数据也出来了