自从.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)