特點
案例基於剛釋出的.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;
}
}