撸.NET Core的正确姿势
特点
案例基于刚发布的.NET Core 2.1
只需一台Linux服务器搞定一切,
全程无需自己配置dotnet环境,
需要熟悉git
docker基础知识可有可无, 过了下面几个步骤,你就已经入门Docker了
涉及到的软件: git, docker, nginx (非必需)
新手耗时
.net core未入门: 不适合
git 未入门: + 30分钟
docker未入门: +2 小时
linux未入门: +2 小时
nginx未入门: +1小时
对于一个.net core已入门的新手, 最多6个小时可以完成这个实验, 对于上述知识都有储备的人,20分钟基本就可以完成(时间取决于你的网速).
前置准备
一台Linux服务器, 能连接外网(需要在线安装git, docker, 以及下载dotnet docker相关镜像), 下面的命令以debian 8为例, ubuntu与debian 命令相同, centos需要吧apt-get 替换为yum
1. 部署git
这样一台git服务器就好了, 如果有远程的github或者oscgit可以用,那可以省略这一步
apt-get install git
useradd git
passwd git 设置git账户的密码
2. 准备代码上传
su git
mkdir samplecode
cd samplecode
git init
创建git库
提交代码到 git@ip:samplecode.git
Dockerfile:
Dockerfile文件放到.csproj文件的目录, 用来生成Docker镜像
FROM microsoft/dotnet:2.1-aspnetcore-runtime ARG source WORKDIR /app EXPOSE 80 COPY ${source:-Miao.WebApi/obj/Docker/publish} . COPY ${source:-buildreport} . ENTRYPOINT ["dotnet", "Miao.WebApi.dll"]
3. 部署docker
https://docs.docker.com/install/linux/docker-ce/debian/
apt-get install docker-ce https://github.com/aspnet/aspnet-docker/tree/master/2.1 docker pull microsoft/dotnet:2.1-sdk 用来编译dotnetcore程序 docker pull microsoft/dotnet:2.1-aspnetcore-runtime 用来运行dotnetcore程序
4. 下载代码并编译打包
mkdir /src cd /src git clone git@ip:samplecode.git cd samplecode docker run -t -v ~/.dotnet:/root/.dotnet -v ~/.nuget:/root/.nuget -v ./:/src --workdir /srcmicrosoft/dotnet:2.1-sdk bash -c "dotnet restore ./sameplecode.sln && dotnet publish ./SamepleCode.csproj -c Release -o ./obj/Docker/publish" docker build –t sampleweb:1.0 –file .\Dockerfile .\
5. 运行.net core 程序
docker run –d –it sampleweb:1.0 –p:8080:80 curl –I http://ip:8080
确认可以打开, 证明部署成功
6. 通过Nginx做反向代理(非必需)
官方建议kestrel(.net core 内置web服务器外层再加一层反代), 加了反代之后IP也能正确获取到
apt-get install nginx
nginx 配置文件
upstream sampleweb { least_conn; server 127.0.0.1:8080max_fails=3 fail_timeout=30s; } server { listen 80; server_name sampleweb.xxx.com; location / { proxy_pass http://sampleweb /; proxy_read_timeout 90; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_cache_bypass $http_upgrade; } }