docker~Dockerfile方式生成控制台和Api項目的鏡像


回到目錄

一些理論知識

將控制台程序和API程序部署到docker,然后運行它,這個首先要解決的問題就是如何在linux平台運行C#代碼,哈哈,很古老的問題,事實上,對於這種問題早在幾年前就已經有了解決方案,那就是在linux上安裝mono開發環境,然后使用mono就可以運行C#代碼了,而如果你的C#是一個網站形式的,那需要一個宿主的支持,其中最權威的應該就是jexus框架,你可以把當理解成是一個服務器,就像tomcat,iis這種東西。

上一次中我們使用mono原始鏡像生成了一個新的鏡像,用來輸出hello world,事實上,我的本意不在echo一個字符出來,而是為今天的課打下基礎,因為今天就真的要在linux上運行C#了,或者說把C#項目部署到docker上了。

說干就干-控制台程序

首先要求你的控制台程序與你的Dockerfile在同級目錄,如果是publish之后的代碼,那最好也放在同一目錄下,這樣方便你Dockerfile的部署

# 使用一個基礎的鏡像
FROM mono
# 將文件復制到docker容器
COPY hello.exe .
# 使用mono運行一個應用程序
CMD mono hello.exe

上面代碼的工作流程:

  1. 要使用一個基礎鏡像mono,如果本地沒有會去下載它,如果有直接使用本地鏡像
  2. 將Dockerfile同級目錄下的hello.exe文件復制到docker里,只有這里,你的docker里的程序才找的到它
  3. 運行一個mono命令,如果你的mono沒有環境變量(profile),你需要使用WORKDIR去指定目錄)

說干就干-API程序

api程序比控制台就復雜一些,你可以使用jexus作為宿主,也可以使用api自己SelfHost,我們今天主要說說后者,它比較輕量級,事實上它也是一個控制台程序,只不過安裝了一些包包,來提供宿主功能。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
  <package id="Microsoft.AspNet.WebApi.SelfHost" version="5.2.3" targetFramework="net452" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" />
</packages>

然后在代碼里去建立路由,監聽端口,建立控制器等

        static void Main(string[] args)
        {

            var config = new HttpSelfHostConfiguration("http://localhost:5000"); //配置主機

            config.Routes.MapHttpRoute(
                "Default", "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

            //數據返回格式
            config.Formatters.Clear();
            config.Formatters.Add(new JsonMediaTypeFormatter());

            using (HttpSelfHostServer server = new HttpSelfHostServer(config)) //監聽HTTP
            {
                server.OpenAsync().Wait(); //開啟來自客戶端的請求
                Console.WriteLine("Listen 5000 port,Press Enter to quit.");
                Console.ReadKey();
            }
        }

這時,我們生成項目后,就可以為它編譯自己的Dockerfile了,然后通過docker build就可以建立自己的鏡像了,通過docker run就可以把服務運行起來了。

#使用一個基礎的鏡像
FROM mono   
#開放端口
EXPOSE 8080
#將Release目錄下的所有文件復制到docker容器的根目錄,注意不會建立Release目錄
COPY Release/ .
#使用mono運行一個應用程序
#CMD mono selfWeb.exe 

我們生成這個鏡像之前,然后去運行它,我們使用交互模式去運行,然后進入容器后,我們手動去執行mono selfWeb.exe ,當然也可以做成自己執行的!

docker run -it imageID

當進入容器后,我們就可以執行自己的命令了,這時你可以ls一個看看根目錄的情況,事實上我們API的Release下所有文件都被復制過來了。

mono selfWeb.exe 

 

這時,mono幫我們運行了這個api的宿主程序,它對外界會開放一個8080端口!

小伙伴可以訪問:Http://dockerip:8080,來感受一下了!

 回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM