此片文章目标是将 .Net Core 发布到 Docker 上,并且连接到在 Docker上的 Redis 、上传文件到本机文件夹和连接 sqlserver 数据库。

创建项目

创建项目就不用说了,我是用得 vs2019 创建的 net core 3.1 的项目,把上传文件、连接redis和sqlserver的代码写好,因为我是在 window 环境下开发的,所以如果我们需要发布到 linux 系统的话需要注意所有用到路径的地方,比如我遇到的这几个点:

1.保存文件地址

如下在 window 上保存文件的话地址是如下使用 '\' 的

// 新文件名(包括路径)
filename = Environment.CurrentDirectory + @"\upload\" + filename;

在 linux 系统下就需要用 '/' 否则可保存不了呀

// 新文件名(包括路径)
filename = Environment.CurrentDirectory + @"/upload/" + filename;

2.加载程序集

我是通过如下方法动态加载实体映射类型的,看下面标黄的代码,在获取的路径前加了一个 “/” 是因为在 linux 中需要使用绝对路径,像是 /app/xxx 这种,不加的话就会报错

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 通过反射获取继承IEntityTypeConfiguration的实体类型
string assembleFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("Capricorn.Db.SqlServer.dll", "Capricorn.Entity.Mapping.dll").Replace("file:///", "");
Assembly asm = Assembly.LoadFile("/" + assembleFileName);
//.....省略其他代码
}

报错内容,看到这个就要注意路径问题了

Absolute path information is required. (Parameter 'path')

我们还要在 Program.cs 文件下加上如下标黄的代码,设置端口

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseUrls("http://*:80")
.UseStartup<Startup>();

发布项目

发布代码前需要先添加 Docker 支持,右键项目->添加-》Docker 支持 后就会让你选择发布的目标系统如下,我这里选择 linux

选择完成后会添加一个 Dockerfile 文件,会帮我们生成相应的构建镜像的代码,但是我们可以简化到如下

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
RUN sed -i 's/TLSv1.2/TLSv1.0/g' /etc/ssl/openssl.cnf
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "Capricorn.dll"]

注意 Dockerfile 文件中的第二行 RUN 的代码因为需要更新镜像环境的 TLS 版本,否则在连接 sqlserver 的时候可能会报如下错误:

A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: TCP Provider, error: 35 - An internal exception was caught

之后就发布为文件系统就行如下,我发布到 D:\website

打包镜像

之后我们到发布的目标位置下,打开 PowerShell 执行如下打包代码

PS D:\website> docker build -t myweb .

等待 Dockerfile 中的基础镜像下载完成,后就会完成我们打包的镜像了

备注

其实我们还可以通过 vs 进行打包,我们如下图所示,在工具栏出选择 Docker,之后执行就会自动进行打包

但是会有个问题,你可能会发现打包了半天都打包不完,一直显示容器预热中,然后在输出视图中看到容器工具中输出停止在如下代码,这三个内容很关键

Info: Using vsdbg version '16.8.11013.1'
Info: Using Runtime ID 'linux-x64'
Info: C:\Users\Xu\vsdbg\vs2017u5 exists, deleting.

要解决这个问题我们可以手动拼接下载路径,下载路径如下

https://vsdebugger.azureedge.net/vsdbg-(你的版本号 .号换成-号)/vsdbg-(你的Runtime ID).zip

比如按照我的输出中的内容就需要如下的下载链接

https://vsdebugger.azureedge.net/vsdbg-16-8-11013-1/vsdbg-linux-x64.zip

下载完成后在我们在需要的路径下直接解压文件,再创建两个文本文件 success_version.txt 和 success_rid.txt 。在 success_version.txt 文件中添加我们的版本号(我这是16.8.11013.1),在 success_rid.txt 中添加我们的 Runtime ID (我这是linux-x64),之后取消执行,重启项目,然后在重新生成就行啦。

运行容器

我们因为需要连接 redis 所以需要一个网络使容器可以互相通信,建立网络代码如下

PS D:\website> docker network create -d bridge test-net

之后我们运行项目的容器做如下操作

1.绑定刚刚创建的网络 test-net,可以与后面的 redis 通信

2.挂载容器中的路径 /app 到本机的发布路径 d:\website 下,这样我们如果代码需要重新发布,在发布完成后直接重启容器就可以生效了

3.绑定容器内的 80 端口到本机的 5000 端口,可以通过访问本地端口访问网站

PS D:\website> docker run -itd --name myweb --network test-net -v d:\website:/app -p 5000:80 myweb

运行Redis容器,我们直接用 Docker Hub 中的镜像

PS D:\website> docker run -itd --name redis_myweb --network test-net redis

如果数据库用的也是容器那和 redis 的操作差不多,不过我这里使用的是本机上的 sqlserver 数据库,具体在 appsetting.json 的配置内容如下

{
"ConnectionStrings": {
"BaseDb": {
"ProviderName": "System.Data.SqlClient",
"ConnectionString": "Data Source=host.docker.internal,1433;Database=****;User ID=sa;Password=*********"
},
"Redis": {
"ConnectionString": "redis_myweb",
"Prefix": "Cap_"
}
}
}

可以看到,由于 redis 是在容器中运行的,所以连接字符串为运行的容器的名称。而数据库因为连接本机,所以地址使用了 host.docker.internal 作为地址。host.docker.internal 表示主机的地址,在主机为 windows 的机器中才能用,如果 redis 想使用本机的,那连接字符串也可以用 host.docker.internal 。

运行网站

我们访问地址 http://localhost:5000/ 可以看到访问成功了

之后上传文件,也可以看到我们本机挂载的文件夹下多了一个 upload 文件夹,里面多了我们上传的文件

访问数据库可以看到成功返回了数据

设置缓存也成功啦

将.Net Core发布至Docker,并连接 Redis、上传文件到本机、连接sqlserver数据库的更多相关文章

  1. c#连接SFTP上传文件

    名词解释(百度百科) sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一样的语法和功能 ...

  2. python连接服务器上传文件,后台执行命令

    上传文件 import os import paramikoimport logging from django.core.cache import cache from YunTai import ...

  3. docker在windows下上传文件到容器

    我的系统是windows10,docker是用DockerToolbox工具安装的,安装完之后会默认挂载Windows的C:/Users目录,在docker里面对应路径是/c/Users,docker ...

  4. java web程序上传文件,浏览器显示连接被重置

    上传文件时,到13%时浏览器显示连接被重置如图: 参考网上很多方法 比如设置server.xml 的相应大小.时间,然并没有解决问题 connectionTimeout="2000000&q ...

  5. 解决:使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题

    最近研究了下分布式存储Fastdfs,在centOS上配置完后,使用centOS或putty连接并上传图片,然后用浏览器读取storage server返回的URL,一切正常. 但是,使用eclips ...

  6. vsftpd只能连接不能上传文件问题

    Centos7 记得很清楚,vsftpd安装后,不需要配置,本地用户就可以正常使用(登录.上传.下载) 这次配的就是不行,另起了个虚拟机,装了下,就是不需要配置,但是在一台机上,就是不行,只能登录,下 ...

  7. [原]Asp.net Core 2.1.2 测试成功Ajax上传文件新解法

    利用layui框架可以上传文件调试拦截成功! [HttpPost] public IActionResult Method1(IFormFile file) { return Json(new{suc ...

  8. ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段

    ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...

  9. Xftp连接阿里云Linux,向Linux上传文件,Windows和Linux文件传输

    我之前是用SecureCRT连接阿里云Linux的,上传文件用的Alt+p快捷键,感觉不是很方便.后来朋友给我推荐了Xshell,感觉确实好用得很多. 传输文件用的是Xftp,今天在向我的个人网站发布 ...

随机推荐

  1. Image Inpainting with Learnable Bidirectional Attention Maps

    Image Inpainting with Learnable Bidirectional Attention Maps pytorch 引言 部分卷积(PConv)的缺陷: 1 将含有1个有效值像素 ...

  2. PyQt(Python+Qt)学习随笔:QDockWidget停靠部件的dockWidgetArea和docked属性

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 dockWidgetArea和docked属性这两个属性在Design ...

  3. Python中函数是否能使用全局变量?

    Python函数中的变量,既可以使用局部变量(本地名字空间的变量),也可以使用全局变量(全局名字空间的变量),函数在执行查找变量只读时,先在局部变量中查找,找不到再查到全局变量中查找.因此当局部变量和 ...

  4. 第十五章、Model/View架构中Item Views部件的父类

    老猿Python博文目录 老猿Python博客地址 引言:本章早就写好了,其简版<第15.18节 PyQt(Python+Qt)入门学习:Model/View架构中视图Item Views父类详 ...

  5. PyQt(Python+Qt)学习随笔:QAbstractItemView的defaultDropAction属性

    老猿Python博文目录 老猿Python博客地址# 一.概述 defaultDropAction属性用于控制QAbstractItemView及其子类的实例视图中拖放时放下的默认操作.该属性的类型为 ...

  6. Windows下MySQL无法启动万能解决方案

    MySQL启动报错 window10上安装了MySQL之前使用都是执行net start mysql 启动,执行net stop mysql关闭. 某天开始启动报错"MySQL 服务无法启动 ...

  7. LeetCode初级算法之数组:66 加一

    加一 题目地址:https://leetcode-cn.com/problems/plus-one/ 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一.最高位数字存放在数组的首位, 数 ...

  8. BJOI2016 回转寿司

    题目链接 Description 给定一个长度为 \(N\) 的序列 \(a\),和一个区间 \([L, R]\). 求多少连续子序列的权值和在区间内,即满足 \(1 \le i \le j \le ...

  9. AcWing 326. XOR和路径

    大型补档计划 题目链接 如果整体来做,发现既有加法,也有整体异或,这样不容易搞. 考虑异或,各个位置互不干扰,按位考虑一下. 枚举每一位 \(k\) 发现如果设 \(f[u]\) 为这一位的期望结果还 ...

  10. tornado 作业 自定义模板 UIMethod以UIModule

    自定义uimodule s3.py import tornado.ioloop import tornado.web import UIMethod as mt class MainHandler(t ...