自從.net core支持linux後,.net core程序也可以從linux的docker生態中受益了。在docker中運行.net core程序還是非常簡單的,微軟已經爲我們製作好了.net core runtime的基礎鏡像包,只需要將我們的程序拷貝到基礎鏡像即可,下面我們就以一個簡單的示例來介紹下這一過程,
下圖就是一個已經編譯好的控制檯程序,入口是app.dll。
編寫Dockerfile
有了程序後,我們還編寫相應的dockerfile來製作Docker鏡像
FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY app /app
WORKDIR /app
ENTRYPOINT ["dotnet","app.dll"]
程序非常簡單,只有四行
- FROM指令指定了基礎鏡像,這裏使用的是.net 6的runtime鏡像mcr.microsoft.com/dotnet/aspnet:6.0,也可以使用更小的鏡像
- 通過COPY將程序集導入到基礎鏡像中
- WORKDIR指令指定了工作路徑
- ENTRYPOINT指令指定了應用程序入口
Build鏡像
編寫好dockerfile後,就可以直接build了,指令如下(注意不要漏了結尾的.):
docker build -t tianfang:console .
這裏通過參數-t指定了容器的名稱:tianfang:console,
運行容器
使用docker run命令運行鏡像,即可看到程序輸出
dev@dev:~/docker$ docker run tianfang:console
Hello, World!
Web程序示例
有了上面的基礎後,再來一個web程序的導報示例,Dockerfile如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0
ENV ASPNETCORE_URLS http://+:80
COPY app /app
WORKDIR /app
ENTRYPOINT ["dotnet","app.dll"]
和前面的示例相比多了一個ENV指令指定web程序的url,如果程序中顯示指定了url,這個也不是必要的,此時就和控制檯程序的dockerfile是一樣了,
運行時稍微有點差異, 需要增加 -p 指令開放web服務端口,這個也是docker的常規操作了。
dev@dev:~/docker$ docker run -p 1080:80 tianfang:web
基本上和控制檯程序差不多,非常簡單。
其它
如果我們修改dockerfile進行多次構建時,可以通過docker image ls指令看到會產生一些廢棄的匿名鏡像,
dev@dev:~/docker$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
tianfang hello c0d8c6a310a1 3 minutes ago 212MB
<none> <none> 4b4d47f8602c 4 minutes ago 212MB
<none> <none> 10e7cece6d5c 4 minutes ago 212MB
<none> <none> 56b9bc345162 5 minutes ago 212MB
mcr.microsoft.com/dotnet/aspnet 6.0 e3f3ae957ae9 7 days ago 212MB
可以用下列命令刪除
docker image rm -f $(docker images -f dangling=true -q)