跳到主要內容

[Docker] 建立並運行一個ASP.NET Core網站的Docker container

要透過Docker將原本的ASP.NET Core網站包成image之前,請先確認你的ASP.NET Core的Program.cs已經設定了 http and/or https 的port宣告:
public class Program
    {
        public static void Main(string[] args)
        {
            BuildWebHost(args).Run();
        }

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseKestrel(options =>
                {
                    options.Listen(IPAddress.Any, 80);
                    options.Listen(IPAddress.Any, 443, listenOptions =>
                    {
                        listenOptions.UseHttps("MgvInfoSpServer.pfx", "1234");
                    });
                })
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .UseApplicationInsights()
                .Build();
    }
* 請將 options.Listen() 中的 IP address 設成 IPAddress.Any

接著就可以將ASP.NET Core project進行打包了。
此處不介紹 Docker,直接寫出實作步驟,想知道觀念的再去看其他文章囉。

在Windows OS下:
- 先安裝 docker on windows
- 設定成Linux container環境

步驟:
1. 選定需要的base image
2. 寫 Docker file
3. 執行 Docker file
4. 啟動 Docker container
5. 其他 Docker 操作


1. 選定需要的base image

我們要執行一個ASP.NET Core網站,SDK用2.1。
從docker hub (https://hub.docker.com/_/microsoft-dotnet-core) 上選擇要抓下來的base image。

SDK 選:
mcr.microsoft.com/dotnet/core/sdk:2.1
Run-time base image 選:
mcr.microsoft.com/dotnet/core/aspnet:2.1

2. 開始寫 Docker file

在你的ASP.NET Core project的第一層目錄下(與*.sln同一層)建立"Dockerfile",內容如下:
# coding=UTF-8
# https://hub.docker.com/_/microsoft-dotnet-core

FROM mcr.microsoft.com/dotnet/core/sdk:2.1 AS build

WORKDIR /source



# copy csproj and restore as distinct layers

COPY *.sln .

COPY MgvInfoSpServer/*.csproj ./MgvInfoSpServer/

RUN dotnet restore



# copy everything else and build app

COPY MgvInfoSpServer/. ./MgvInfoSpServer/

WORKDIR /source/MgvInfoSpServer

RUN dotnet publish -c release -o /app --no-restore



# final stage/image

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1

WORKDIR /app

COPY MgvInfoSpServer/MgvInfoSpServer.pfx ./

COPY --from=build /app ./

ENTRYPOINT ["dotnet", "MgvInfoSpServer.dll"]

- 其中"MgvInfoSpServer"請換成你的project名。
- 其中"COPY MgvInfoSpServer/MgvInfoSpServer.pfx ./" 是把https的憑證複製到image裡,若你網站有開https,請在此先把憑證放到你的project目錄下(與*.csproj同一層)。

3. 執行 Docker file

- 開啟Windows的PowerShell
- 建立docker image
docker build -t mgvinfospserver:carrefour .

4. 啟動 Docker container

- 檢查image是否已產生
docker images
- 啟動 Docker container
docker run --rm -p 8000:80 -p 8001:443 mgvinfospserver:carrefour
開啟瀏覽器
http://localhost:8000/
https://localhost:8001/

5. 其他 Docker 操作

查看目前正在運行的container
- docker ps

刪除目前正在運行的container
- docker rm -f [id]

背景執行docker
- command加一個 -d

查看log
- docker logs [container ID]




留言

這個網誌中的熱門文章

[Python] 管理多個執行緒(thread)的運作與結束

在開發應用程式中,幾乎所有的專案都會用到thread,不同的程式語言有不同˙的叫用方法,但都大同小異。Thread的使用上最重要的不是在產生一個thread,而是如何結束一個thread,或是如何結束好幾個threads,以下介紹在Python中如何叫用並管理一或多個thread: 一般來說,create thread如下: def job(): while 1: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start() 這樣可以開始一個thread執行job()中的動作,但若job中的迴圈是如上範例的無限迴圈,必須要加上能讓其退出的機制: stopped = 0 def job(): global stopped while stopped == 0: print("Child thread:", i) time.sleep(1) #In main code thread = threading.Thread.__init__(job) thread.start() 這樣在主程序先將stopped設成1,再調用 thread.join() 就可以將thread完整關閉並釋放記憶體空間。 多執行續的處理: 基於這樣的方式,下面是進化版本,創建一個thread專用的class,並同時處理多個thread的執行與結束: class EventHandleThread (threading.Thread): def __init__(self, fun, name): threading.Thread.__init__(self) self.name = name self.fun = fun self.stopped = [0] def run(self): self.fun(self.name, self.stopped) print ("Exiting " ...

[Python] 將程式設定為全螢幕顯示(full screen)和永遠在最前景、最上層(topmost)

這裡以創建一個tkinter 的 Application物件為例 EX: app = Application() app.master.title("WaferCheckApp") app.master.geometry("1100x720") 將UI顯示在最上層: app.master.attributes('-topmost', True) 將UI以全螢幕顯示: app.master.attributes('-fullscreen', True)

[Python] 自己製作文字設定檔config file,動態調整程式設定

在軟體開發中,通常不會知道實際使用行為有那些與原先預期不一樣的情況,這時如果還要針對特定的不同需求改程式是很吃力不討好的事情。所以我們常常會需要能夠動態調整一些設定,以應付不同的使用情況。 下面以Python提一個簡單的方法來動態調整程式設定: 建立一個function,在程式初始化時呼叫: EX: def initialSetting():         try:             currentDirectory = os.getcwd()             filePath = '%s\\ ToolSet.cfg ' % (currentDirectory)             file = open(filePath, 'r')             for line in file.readlines():                 if line.find("Value1") == 0:                     str1 = int(line[7:-1])                 elif line.find(" Value2 ") == 0:                      str2  = int(line[7:-1])                 elif line.find(" Value3 ")...