Docker实践之.NET6基于Dockerfile构建Docker镜像播

前面都在说Docker镜像,那么Docker镜像是如何构建的呢?今天我们就来学习一下,如何基于Dockerfile来构建Docker镜像。

创建一个.NET6最小API

这里我用VS2022创建一个Docker运行的最小API,
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第1张图片
VS会自动帮我们生产Dockerfile文件
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第2张图片
我直接把代码上传到宿主机上,

一般我们都是上传到git,然后通过jenkins来调用shell脚本来构建镜像并上传到镜像仓库。

进入到Dockerfile目录,执行构建命令docker build -t 镜像名:版本 .
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第3张图片
镜像构建成功后,便可以在镜像中找到我们构建的镜像
在这里插入图片描述
启动镜像
在这里插入图片描述
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第4张图片
这里,一个.net6从构建到启动的流程的基操就over了,微软很贴心的为我们生产了Dockerfile,使得我们的操作尤为简便。但是,大多时候需要我们自己去构建Dockerfile,那么,我们就需要去了解一下怎么编写Dockerfile
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第5张图片

我们就基于前面VS帮我们生成的Dockerfile来学习一下如何编写自己的Dockerfile,其实这个脚本对于入门还是稍微负责了一些,这里涉及到了多阶段构建,先不管,我们先弄清楚里面的一些关键字及作用。

  • FROM : 基于哪个镜像,可以前端构建好的阶段别名,AS 给当前层镜像定义一个别名,别名可以在后面的构建阶段中使用
  • WORKDIR:类似于cd,如果目录不存在,会自动创建该目录
  • EXPOSE:容器要开放的端口,一般是程序启动的端口,
  • COPY:拷贝文件,一般是从宿主机目录复制到镜像里的指定目录,当然它还可以再多阶段构建过程中,从前阶段复制到当前阶段,如:COPY –from=publish /app/publish .
  • RUN: 执行脚本命令
  • ENTRYPOINT:容器启动时的参数,如:ENTRYPOINT [“dotnet”,“DockerWeb.dll”],当我们启动容器时,便会执行dotnet DockerWeb.dll,如果存在多个ENTRYPOINT命令,只有最后条命令生效。
  • CMD:和ENTRYPOINT功能类似,只不过CMD可以在启动时覆盖
  • ENV:设置容器环境变量,如:ENV JAVA_OPTS="-server -Xmx2g -Xms2g"
  • VOLUME:容器挂载目录,会在容器启动时,自动挂载到宿主机。如果在docker run时指定了-v参数来映射挂载目录则会覆盖默认挂载目录。

这里我们就把前面的Dockerfile改一下,弄一个简单一点的
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第6张图片
这里我们新建一个名为Dockerfile-sample的脚本文件,讲上面的构建脚本拷贝进去,然后执行构建命令docker build -f Dockerfile-sample -t docker-web-sample .
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第7张图片
这次构建并没有通过多阶段构建,那么为什么需要多阶段构建呢?我们来看一下两种构建方式的镜像文件,
Docker实践之.NET6基于Dockerfile构建Docker镜像播_第8张图片
可以看到,多阶段构建出来的镜像只有212MB,未进行多阶段构建出来的镜像有764MB ,这在镜像推送和拉取时,镜像较小的文件的优势便体现出来了。

你可能感兴趣的:(Docker容器技术,ASP.NET,Core,Web,API,c#,NET6,Docker)