netcore 3.1 项目部署到docker 及遇到的各种坑 和 对应解决方案

十年河东,十年河西,莫欺少年穷

学无止境,精益求精

 搞了快一天了,终于成功部署了netcore项目到docker 

按照上篇博客的发布方法进行发布,上篇博客:netcore3.1 dockerfile 生成镜像 并 部署到 linux 系统 

1、发布之前,需要说明的是,将项目Dockerfile 、Swagger 文档XML文件属性统统设置为:始终复制

 

2、编写项目Dockerfile 文件为如下,这一步最重要,否则,你会遇到各种奇葩的问题,我的Dockerfile如下:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
#ENV :配置系统环境变量,比如程序环境环境等在这里配置(开发、预发、线上环境)
#这里是配置程序运行端口 如果程序不使用默认的80端口这里一定要设置(程序运行端口)
ENV ASPNETCORE_URLS http://+:80
#设置时间为中国上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY . /app
WORKDIR /app
EXPOSE 80
ENTRYPOINT ["dotnet", "WuAnFundApi.dll"]

这里需要说明的是:

前两个 FROM 不能少,是运行环境及依赖

容器运行时间采用上海,因为默认为美国时间

COPY .  /app 第一个 . 代表发布的文件所在的 Linux 系统的目录,第二个 /app 是要复制到的目录,这里 /app 必须和 WORKDIR 的 /app 保持一致

EXPOSE 80 ,代表暴露80端口,因为没有暴露 443 端口,我们需要将netcore 代码 startUp.cs  中的这段注释掉,声明不使用 HTTPS

            //app.UseHttpsRedirection();

如果要使用HTTPS协议,需要SSL证书,如果你有ssl证书,可以这样增加一个443端口

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
#ENV :配置系统环境变量,比如程序环境环境等在这里配置(开发、预发、线上环境)
#这里是配置程序运行端口 如果程序不使用默认的80端口这里一定要设置(程序运行端口)
ENV ASPNETCORE_URLS http://+:80
#设置时间为中国上海
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY . /app
WORKDIR /app
EXPOSE 80
EXPOSE 443
ENTRYPOINT ["dotnet", "WuAnFundApi.dll"]

更详细信息可参考https://www.cnblogs.com/yiting/p/13388155.html  或   http://t.zoukankan.com/shapman-p-13545457.html

3、将发布的文件放入linux系统,我这里采用的SCP命令,关于SCP命令,大家可参考鄙人博客:windows 下使用SCP命令传递文件/文件夹到Liunx系统

 4、发布文件放入Linux系统后,cd 到该目录下,执行Build命令,构建镜像

[root@localhost webapp]# docker build -f Dockerfile  -t webapp:1.0 .

/5、构建成功后,运行镜像到容器

 docker run -it --name webapp01 --restart=always -p 8088:80  -v /root/share/webapp:/app  d3abddc5e300 /bin/bash

如果你使用443端口,可以这样声明:

docker run -it --name webapp01  --restart=always -p 80:80  -p 443:443  -v /root/share/webapp:/app d3abddc5e300 /bin/bash

这里做个简单说明:

-it  已交互模式进入容器

--restart=always  容器会随着docker的启动而自动启用,这样就无需再手动开启

-v 是挂载  

 

 在这里,我们发现容器还有部分错误,表现为:log4net相关配置有问题, 如下

 

 上图中也包含了查看容器日志的命令,通过日志信息,我们同样发现Log4Net确实有错误,解决了Log4Net的错误后,不知道是否还会有其他幺蛾子错误,但程序就是这样,发现问题,解决问题,待所有问题解决后,我们就可以通过 curl 命令,访问我们的swageer了

curl localhost:8088/WuAnFundApi/swagger/index.html

今日先到这儿,回家做核酸了,妈的,天天做核酸,坐标苏州。

继续

log4net 似乎对linux的支持不太好,因此,我在项目中去掉log4net,重新打包镜像,运行容器后,就成功了

linux请求swagger 如下:

 

 浏览器中请求:

 

 在swagger的展示过程中,由于鄙人将URL地址输成了:http://192.168.136.135:8088/WuanFundApi/Swagger/index.html  导致陷入了钻牛角,百度查不到,就去必应,必应国内版查不到,又去了必应国际版,总之各种查资料,后来发现是自己的URL拼错了,正确的为:http://192.168.136.135:8088/swagger/index.html ,总之,不需要单独为swagger下载镜像啥的。

这样就

  大功告成了

@天才卧龙的波尔克

posted @ 2022-04-13 17:07  天才卧龙  阅读(1441)  评论(0编辑  收藏  举报