在centos7.x上使用docker容器部署.net core项目
由于本次部署是连接centos本地sqlserver
先决条件,需具备以下sqlserver,nginx,docker
当然你也可以选择链接其它位置数据库
1. 安装库
1.1 安装sqlserver
在centos7.x安装Sqlserver
出处https://www.cnblogs.com/shapman/p/12347433.html
1.2 安装nginx
在centos7.x安装nginx
出处https://blog.csdn.net/qq_37345604/article/details/90034424
中途遇到yum错误,参考解决方案
1.3 安装docker
参考菜鸟教程
命令键入docker -v
2. 部署教程
2.1 在项目中添加docker file
如下图所示,鼠标右键添加docker支持
docker文件改为如下
#开放5000端口,镜像默认80更改为5000
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-bionic AS base
WORKDIR /app
EXPOSE 5000
EXPOSE 5001
COPY . .
ENV ASPNETCORE_URLS=http://+:5000
ENTRYPOINT ["dotnet", "Qiushui.Core.Blog.dll","--server.urls","http://*:5000"]
注意:
- 第一行from需要改为你自己项目对应的.net core版本(生成的dockerfile默认有)
- 开放5000以及5001端口
- 设置
urls为5000,更改默认镜像的80端口,缘由参考下面 - 修改默认端口80为5000
2.2 设置launchSettings.json以及appsettings.json
例如:项目名字以及域名不一致,记得修改为自己的
"Qiushui.Core.Blog": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Production"
}
//"applicationUrl": "http://www.qiubb.com:5002;https://www.qiubb.com:5003"
},
切记修改为自己的https证书文件,以及密码
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://www.qiubb.com:5000"
},
"HttpsInlineCertFile": {
"Url": "https://www.qiubb.com:5001",
"Certificate": {
"Path": "xxx.pfx",
"Password": "password"
}
}
},
"Certificates": {
"Default": {
"Path": "qiubb.com.pfx",
"Password": "password"
}
}
},
参考以下链接
- 使用 Nginx 在 Linux 上托管 ASP.NET Core
- HTTPS配置
- 配置证书
- 强制使用https
- Kestrel不能使用https
- Kestrel不能使用https
- Kestrel不能使用https

在startup中Configure。证书文件可前往腾讯云或者阿里云自行申请免费证书
可能出现错误:kestrel无法使用https,出现报错Microsoft.AspNetCore.Server.Kestrel[0] Unable to start Kestrel. System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found or is out of date。参考上述链接
2.3 生成发布版本文件,并上传至centos指定文件夹

用到了FileZilla工具连接centos进行文件的上传等操作。
推荐使用windows terminal进行操作
cd到你的文件目录例如cd /filename![]()
执行编译命令
镜像名字叫 blogcore-image,禁用缓存,否则迭代时会出问题
docker build --no-cache -t blogcore-image . //注意这个点 . 表示当前目录
用镜像 blogcore-image 创建容器,指定容器名称是 blogcore-container,指定时区(默认是美国时间,相差8小时)
//修改默认时区到亚洲/北京,并且将容器里的 5000 端口映射到 linux 主机的 5000端口,最后每次运行失败后自动重启
docker run --name=blogcore-container -dp 5000:5000 -p 5001:5001 --restart=always -e LC_ALL="en_US.UTF-8" -e TZ="Asia/Beijing" blogcore-image
执行命令docker ps -a会看到所有的运行容器,例如
此处可能出现WARNING: IPv4 forwarding is disabled. Networking will not work.将会请求不到本地centos的sqlserver数据库!!!!
参考docker容器无法访问宿主机端口
解决方案:转发ipv4,参考启动docker 端口映射时IPV4无法使用
docker rm ID //删除docker run 的镜像
docker stop ID //停止运行
docker start ID //开始运行
docker logs ID //查看日志,非常有用
docker images //查看所有镜像
docker rmi //删除镜像,需要先删除已经docker run的container
如果你想要查看刚刚创建的容器的时区是否成功,可以执行命令:
docker exec blogcore-container date //查询当前容器时区
2.4 修改host匹配
文件位置/etc/hosts,可以手动覆盖,也可以直接centos操作,参考修改host
127.0.0.1 www.qiubb.com
127.0.0.1 qiubb.com
此处我是将我需要的域名映射到127.0.0.1,以便kestrel请求
2.5 防火墙开放相应端口
开放端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent
重载:firewall-cmd --reload
端口查看:firewall-cmd --list-ports
启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld
2.6 nginx转发kestrl请求
docker logs Id出现以下说明我们完成了九成只差最后一步
上图中出现overriding xxx,解决方案点这
配置nginx中的config,参考配置如下
#user nobody;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
#nginx中的每个server就是一个反向代理配置,可以有多个server
server {
listen 443 ssl;
server_name qiubb.com *.qiubb.com;
client_max_body_size 1g;
ssl_certificate /usr/local/nginx/cert/1_qiubb.com_bundle.crt;#你的证书在centos存放地址
ssl_certificate_key /usr/local/nginx/cert/2_qiubb.com.key;#你的密钥
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #按照这个套件配置
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN"; #保护Nginx 免受点击劫持的侵害
add_header X-Content-Type-Options "nosniff"; #阻止MIME 类型探查
location / {
proxy_set_header Host $http_host;
proxy_pass https://www.qiubb.com:5001;#此处改为自己的kestrl监听地址,appsetting中的https
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
return 301 https://$host$request_uri;
}
}
上述配置参考官网配置,上文有链接。
nginx的配置文件存放请参考上文安装,一般默认在/usr/local/nginx/conf
执行nginx -t检查默认配置,此处可能出现未安装ssl。unknown directive ssl,解决方案点这
执行nginx -s reload未出现问题,大功告成。
3. 后文
折腾了好几天的linux部署也算是完成了,其实windows不香吗,香死了。有关supervisor守护进程的参考后续文章。遇到的问题上述文中链接应该都能找到解决方案。
懒得搬过来了,点这儿过去