本文用圖文的方式記錄了我自己搭建centos+asp.net core + docker + jexus + nginx的整個過程,希望對有同樣需求的朋友有一定的參考作用。
本文主要內容如下:
- centos7安裝
- yum鏡像
- docker鏡像
- docker安裝
- dotnetcore安裝
- Docker安裝dotnetcore鏡像
- asp.net core 創建與發布
- docker中部署asp.net core
- jexus轉發
- nginx轉發
1.centos7安裝
a.下載centos的iso文件,比如:CentOS-7-x86_64-Everything-1611.iso
b.虛擬機安裝,比如:hyper-v
c.手動分區:
/boot 至少1G,建議2G(很多東西會裝在里面,別信網上說的100M足夠的話了,設置大點)
/swap 2倍內存大小
/ 10G吧
/home 10G以上吧
/var 至少1G,建議5G(docker很容易裝滿)
d.軟件預裝,選擇:帶UI的Server
2.yum鏡像
a.訪問阿里雲http://mirrors.aliyun.com
b.找到你要裝的OS,點右邊“help”進入安裝指南
c.根據指南,安裝鏡像(執行命令的時候請加上sudo,如果你不是root)
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
3.docker鏡像
a. 打開開發者中心https://dev.aliyun.com/search.html
b.右上角“注冊/登陸”
c.登陸后,右上角有一個“管理中心”
d.進入管理中心,點擊“加速器”
開始前先參照這個帖子《CentOS禁止packagekit離線更新服務的辦法》http://www.cnblogs.com/zjoch/p/6500480.html處理,否則出現如下錯誤
按提示完成鏡像設置
sudo curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh - 以下命令一行一行輸入 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://uca6qywb.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
4.docker安裝
a.安裝Docker軟件包
$ sudo yum install docker-engine
b.設置Docker服務開機自啟
$ sudo systemctl enable docker.service
c.啟動Docker服務
$ sudo systemctl start docker
d.驗證Docker是否安裝成功
$ sudo docker run --rm hello-world
5.dotnetcore安裝
a.打開微軟dotnetcore安裝幫助頁面
https://www.microsoft.com/net/core#linuxcentos
選擇你要安裝的OS
按照他的步驟,1,2,3,4安裝就OK了。
b.后面發布web程序的時候,會需要額外安裝一些組件,這里先一起安裝了(我這里是CENTOS安裝方法,其他的可能不同,請自行搜索)
安裝 NPM 工具,參照https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-a-centos-7-server
sudo yum install epel-release
sudo yum install nodejs
安裝bower工具,參照https://bower.io/#install-bower
sudo npm install -g bower
安裝gulp 工具(貌似我實踐過程中沒有說必須安裝這個)
sudo npm install gulp -g
6.Docker 安裝dotnetcore鏡像
到這里,假設你的Docker已經安裝完成,以下環境為 Liunx(centos 7)。
sudo docker info
得到命令了吧,切換到命令行窗口運行以下命令來安裝asp.net core 鏡像。(這里等待時間特別長,你可以去做點其他事情!)
sudo docker pull microsoft/dotnet
鏡像下載完成之后,輸入sudo docker images
我們檢查一下:
sudo docker images
Docker 常用命令
rm -rf 目錄名
刪除非空目錄
docker info
檢查Docker的安裝是否正確,如果沒有找到此命令,則表示Docker沒有正確安裝
docker pull busybox
拉取一個預建的鏡像
sample_job=$(docker run -d busybox /bin/sh -c "while true; do echo Docker; sleep 1; done")
以后台進程的方式運行hello docker
sample_job命令會隔一秒打印一次Docker,使用Docker logs可以查看輸出。如果沒有起名字,那這個job會被分配一個id,以后使用命令例如Docker logs查看日志會變得比較麻煩。
docker logs $sample_job
運行Docker logs命令來查看job的當前狀態:
docker help
所有Docker命令
docker stop $sample_job
停止名為sample_job的容器
docker restart $sample_job
重新啟動該容器
docker stop $sample_job docker rm $sample_job
如果要完全移除容器,需要將該容器停止,然后才能移除
docker commit $sample_job job1
將容器的狀態保存為鏡像
docker images
令查看所有鏡像的列表
下面分享一些我經常使用的一些命令:
移除所有的容器和鏡像,用一行命令大掃除:docker kill $(docker ps -q) ; docker rm $(docker ps -a -q) ; docker rmi $(docker images -q -a)
僅僅想刪除所有的容器,你可以運行如下命令:docker kill $(docker ps -q) ; docker rm $(docker ps -a -q)
清除名稱為none的鏡像,一般都是下載一般失敗的殘留:
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm docker images|grep none|awk '{print $3 }'|xargs docker rmi
實測能工作的命令(老外的:http://jimhoskins.com/2013/07/27/remove-untagged-docker-images.html):
docker rm $(docker ps -a -q)
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
清除單個鏡像:docker rmi -f <image id>
7. asp.net core 創建與發布
(可參考http://www.cnblogs.com/savorboard/p/dot-net-linux-jexus.html前半部分)
在 Asp.Net Core 項目中,我們使用 dotnet new -t WebApp
命令和創建一個新的空的 Web 應用程序,然后使用dotnet resotre
還原 Nuget。
dotnet new -t WebApp
dotnet resotre
主要是用以下幾個命令:
mkdir HelloWebApp
這個命令是創建一個名為 HelloWebApp 的文件夾。
dotnet new -t Web
這個命令是使用 Web 模板來新建一個 WebApp 的 Mvc 應用程序。
因為后面部署到docker中需要固定端口號,所以需要修改Program.cs里的代碼,修改后如下(其實就是新增紅色的那行):
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
namespace WebApplication
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseUrls("http://*:5000")
.UseStartup<Startup>()
.Build();
host.Run();
}
}
}
輸入命令sudo gedit Program.cs,並修改源碼文件如下:
sudo gedit Program.cs
編輯完成,點擊右上角“Save”,點“x”關閉后返回終端.
新建了應用程序之后,使用dotnet run
命令來測試一下我們的應用程序。
dotnet run
我們打開瀏覽器輸入 http://localhost:5000,來看一下效果。
可以看到已經成功運行了。
如果發布應用程序,我們需要使用 dotnet publish
命令,通過使用 --help
參數可以看到一些可以使用的命令參數。
-f|--framework <FRAMEWORK> Target framework to compile for -r|--runtime <RUNTIME_IDENTIFIER> Target runtime to publish for -b|--build-base-path <OUTPUT_DIR> Directory in which to place temporary outputs -o|--output <OUTPUT_PATH> Path in which to publish the app --version-suffix <VERSION_SUFFIX> Defines what `*` should be replaced with in version field in project.json -c|--configuration <CONFIGURATION> Configuration under which to build --native-subdirectory Temporary mechanism to include subdirectories from native assets of dependency packages in output --no-build Do not build projects before publishing
我們運行dotnet publish -o ~/WorkSpace/publish
發布到 publish 文件夾,當看到Published 1/1 projects successfully
的時候,說明已經發布成功了。
dotnet publish -o ~/WorkSpace/publish
發布之后 publish 文件夾里面的子文件夾有必要說明一下。
appsettiong.json 應用程序的配置文件 refs 應用程序引用的.net fx系統程序集 runtimes 運行時環境,可以看到里面的文件夾包含 win7、linxu,mac os 等,說明我們這個應用程序是跨平台的。 views 這個文件夾存放的就是我們的 mvc 的視圖文件。 wwwroot 文件夾,存放的是前端使用的 js 庫,css 樣式表,和圖片等。
然后使用dotnet HelloWebApp.dll
測試發布過后的程序是否運行正常。
cd ~/WorkSpace/publish
dotnet HelloWebApp.dll
8.docker中部署asp.net core
Dockerfile 是什么東西,Dockerfile有什么用,可以參考http://blog.csdn.net/wsscy2004/article/details/25878223
a、程序命令行切換到publish文件目錄中。
b、sudo touch Dockerfile
名稱不要寫錯了,沒有任何后綴名,來新建一個Dockerfile文件。
sudo touch Dockerfile
c、sudo gedit Dockerfile
使用gedit來編輯Dockerfile
sudo gedit Dockerfile
Dockerfile中輸入以下內容:
#基於 `microsoft/dotnet:1.1.0-core` 來構建我們的鏡像 FROM microsoft/dotnet:latest #拷貝項目publish文件夾中的所有文件到 docker容器中的publish文件夾中 COPY . /publish #設置工作目錄為 `/publish` 文件夾,即容器啟動默認的文件夾 WORKDIR /publish #設置Docker容器對外暴露5000端口 EXPOSE 5000 #使用`dotnet HelloWebApp.dll`來運行應用程序 CMD ["dotnet", "HelloWebApp.dll"]
保存后關閉就是了
構建鏡像
運行 docker build -t hellowebapp:1.0 .
來構建一個鏡像(后面的.代表當前目錄,別搞丟了。。。)
sudo docker build -t hellowebapp:1.0 .
運行鏡像
使用如下幾種方式運行:
直接用docker名字前台(運行期間不能做其他事情,可以再開一個終端,或者ctrl+c結束)運行 docker run -p 5000:5000 hellowebapp:1.0
(推薦)直接用docker名字后台(運行期間還可以敲命令)運行 docker run -d -p 5000:5000 hellowebapp:1.0
用自定義名字后台運行 docker run --name hellowebapp -d -p 5000:5000 hellowebapp:1.0
sudo docker run -p 5000:5000 hellowebapp:1.0
sudo docker run -d -p 5000:5000 hellowebapp:1.0
sudo docker run --name hellowebapp -d -p 5000:5000 hellowebapp:1.0
打開瀏覽器測試一下:
9.jexus轉發
可以參考另一片帖子,http://www.cnblogs.com/gaobing/p/5663012.html
進入臨時目錄
cd /tmp
網上下載jexus最新獨立安裝包
sudo wget linuxdot.net/down/jexus-5.8.2-x64.tar.gz
解壓安裝包
tar -zxvf jexus-5.8.2-x64.tar.gz
移動到運行目錄
sudo mv jexus /usr
刪除臨時文件
sudo rm -rf jexus*.tar.gz
進入運行目錄
cd /usr/jexus
注冊服務
sudo ./jws regsvr
啟動服務(特別注意./jws start 或者 ./jws stop 或者 ./jws restart 無論在什么時候用,都必須有root權限,加sudo)
sudo ./jws start
測試服務
curl localhost/info
創建網站根目錄
sudo mkdir /var/www
sudo mkdir /var/www/default
修改默認配置
cd /usr/jexus/siteconf sudo gedit default
如果是用jexus啟動和管理DotNetCore,那么添加如下配置:
AppHost={ CmdLine=/usr/local/bin/dotnet /var/www/default/HelloWebApp.dll; AppRoot=/var/www/default; Port=5000; }
如果只是作轉發,則只添加如下配置:
AppHost.Port = 5000
重啟jexus服務
cd .. sudo ./jws restart
轉發效果,訪問80端口
10.nginx轉發
a、 新開一個終端,輸入 sudo yum install nginx -y安裝 nginx。
sudo yum install nginx -y
b、 安裝完成之后,輸入 nginx -v
查看是否安裝成功。
執行以下命令,啟動nginx
sudo nginx
c. 由於nginx默認監聽80端口,而80已經被juexus占用了,所以我們需要先修改nginx的端口為8080
安裝完 nginx 之后,默認的配置文件路徑在 /etc/nginx/nginx.conf
文件中, 切換工作目錄到/etc/nginx/
,使用
cd /etc/nginx/
編輯配置文件,修改監聽端口為8080
sudo gedit nginx.conf
保存關閉后,重新加載配置文件
sudo nginx -s reload
然后打開瀏覽器訪問http://localhost:8080
d.接下來,我們來修改轉發配置
先打開配置文件
sudo gedit nginx.conf
在 Server
節點中,找到監聽 8080端口的location 節點,修改內容為如下:
location / { proxy_pass http://localhost:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }
如果要用http://localhost:8080訪問,還需要修改默認server_name=localhost,否則請通過http://127.0.0.1:8080來訪問
保存關閉后,重新加載配置文件
sudo nginx -s reload
如果修改了server_name,reload是無效的,得先停止再啟動
sudo nginx -s stop sudo nginx
e. 測試 nginx 是否運行成功,打開瀏覽器,輸入 http://localhost:8080 查看是否顯示如下界面。
整個實踐過程就是上面的內容,希望對大家有所幫助,全文完!
相關參考:
http://www.cnblogs.com/savorboard/p/dotnetcore-docker.html
http://www.cnblogs.com/savorboard/p/dotnet-core-publish-nginx.html
https://www.linuxdot.net/
http://jimhoskins.com/2013/07/27/remove-untagged-docker-images.html
http://www.cnblogs.com/savorboard/p/dot-net-linux-jexus.html
http://www.cnblogs.com/gaobing/p/5663012.html