98 第一个ASP.NET Core MVC站点及发布到Linux Docker环境 - xiaoxin01/Blog GitHub Wiki

本文介绍如何建立一个最简单的ASP.NET Core MVC站点及一键部署到Linux Docker环境下

.NET Core的特性是跨平台,既然选择了.NET Core,便可以将我们开发的程序部署在Linux下,避开臃肿的windows和低下的性能,并且Linux系统开销很小,不需要高规格的服务器就可以跑起来。

本文以 .NET Core,Nginx为例,介绍如何利用Docker一键部署站点。

在开发环境建立ASP.NET Core MVC站点

在进行之前,先确认已经按照 xxx 准备好了开发及部署环境。

在开发环境打开命令行工具,进入项目所在目录(此目录已经共享并挂载进了Linux),通过命令建立 MVC 站点:

mkdir D:\projects\firstweb\web\
cd D:\projects\firstweb\web\
dotnet new mvc

还原依赖,构建和启动:

dotnet restore
dotnet run

console会输出:

Hosting environment: Development
Content root path: D:\projects\firstweb\web
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

然后在浏览器中打开地址:

http://localhost:5000

确认网站可以正常访问。

建立Web的Dockerfile

站点最终在Linux服务器会运行在Docker容器中,这里用微软官方的镜像,专门做了一些优化。

FROM microsoft/aspnetcore:1.1.1
WORKDIR /app
EXPOSE 5000
COPY obj/Docker/publish .
ENTRYPOINT ["dotnet", "web.dll"]

建立编排文件

利用docker-compose,将需要的服务编排起来。

建立文件夹,D:\projects\firstweb\docker\

Web编排文件:docker-compose.yml

version: '2'

services:
  web:
    build:
      context: ../web/
      dockerfile: Dockerfile

Nginx编排文件:docker-compose.nginx.yml:

version: '2'

services:
  nginx:
    image: nginx:1.11.9
    volumes:
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    ports:
      - "80:80"
    links:
      - web

Nginx配置文件:nginx.conf:

server {
    listen 80;

    location /{
        proxy_pass http://web:5000;
    }
}

建立build的编排文件:docker-compose.ci.build.yml

version: '2'

services:
  build:
    image: microsoft/aspnetcore-build:1.1.1
    volumes:
      - ../:/src
      - ~/.nuget/packages:/root/.nuget/packages
    working_dir: /src
    command: /bin/bash -c "cd web && pwd \
        && echo 'install node packages' && npm install -no-bin-links && echo 'done' \
        && echo 'run gulp tasks' && gulp min && echo 'done' \
        && echo 'install bower packages' && bower install --allow-root && echo 'done' \
        && echo 'restore project' && dotnet restore  && echo 'done' \
        && echo 'update database' && dotnet ef database update  && echo 'done' \
        && echo 'publish project' && dotnet publish -c Release -o ./obj/Docker/publish && echo 'finished!'"

建立一键部署脚本

在目录 D:\projects\firstweb\

建立:start.sh

projectName="firstweb"

echo "build project"
docker-compose  -f ./Docker/docker-compose.ci.build.yml -p $projectName up

echo "build web image"
docker-compose  -f ./Docker/docker-compose.yml \
                -f ./Docker/docker-compose.nginx.yml -p $projectName build

echo "start web"
docker-compose  -f ./Docker/docker-compose.yml \
                -f ./Docker/docker-compose.nginx.yml -p $projectName up -d

在部署环境建立源代码复制脚本

进入Linux部署环境,建立脚本,用于将windows下编写的代码更新到Linux下。

cd ~/projects/firstweb
vi sync.sh

然后输入:

source=/mnt/win/projects/firstweb/
distination=~/projects/firstweb/

echo "sync source code"
rsync -tvrP --exclude-from=exclude.list  $source $distination 

exclude.list文件的作用是排除不需要复制的文件,内容如下:

.git/
.vs/
.vscode/
ref
**/bin/
**/obj/
**/node_modules/
**/wwwroot/lib/
sync.sh

复制文件及部署

先把代码复制过来并加上执行权限:

cd ~/projects/firstweb
chmod +x sync.sh
./sync.sh
chmod +x start.sh

网站已经部署成功。

未来在windows开发环境修改代码之后,只需要在Linux下运行如下命令即可:

./sync.sh
./start.sh

未来还可以利用Gitlab runner来实现CI/CD,后续会有文章介绍。

⚠️ **GitHub.com Fallback** ⚠️