4. 制作自己的镜像
4.1 HelloWorld By AspNetCore
通过前五章,我们已经知道了镜像 ,容器 ,仓库 三个核心的概念,下面我们使用Asp.NetCore来制作一个经典的HelloWorld镜像然后上传到私有仓库
4.1.1 制作镜像
- 基于 .NET Core 3.1 ,创建Hello World项目
- 更改启动路径打开Properties 文件夹里的launchSettings.json ,移除IIS Express节点,本步骤不是必须,更改后如下
- 更改Controller
- 添加Dockerfile ,右键项目-添加Dockerfile文本文件,注意没有扩展名,添加以下命令
- 右键Dockerfile属性,选择始终复制
- 重新生成项目,并打开生成后的文件夹
- 再此目录打开命令行,并执行以下命令
- 使用docker images 命令查看刚刚只做的镜像,可以看到刚刚只做的helloword的镜像.
- 接下来,就让我们运行该容器.在命令行输入以下命令,注意8080问您本机端口,该端口可以是其他任意端口,但是不能被其他应用程序占用
- 检查容器是否正常,在命令行中,使用以下命令.可以看到容器已经正常运行着
- 访问本地地址**localhost:8080/helloworld**,可以看到,已经正常相应
4.1.2 推送镜像
我们制作的镜像已经成功被部署了,接下来我们将这个镜像推送到Docker Hub官方镜像仓库.
- 使用docker tag 命令,对进行重命名
- 使用docker push命令推送金象
经过以上两步,我们从制作镜像 到部署镜像 再到推送镜像,都已经成功了!距离AspNetCore云原生更进一步了!
4.2 Dockerfile
第一种写法
在前面制作镜像的时候,我们使用了命令docker build -t helloworld:v1 . 我们来拆解一下这行命令
- docker build: 构建镜像命令
- -t: 镜像名称与TAG
- . : 指的是当前目录
所以就是在当前目录中构建镜像,名为:helloworld:v1,在构建竟像时Docker 会自动在指定的目录中,寻找Dockerfile文件,并按照文件中的定义步骤来构建.
我们来具体解释一下上面实战中其中Dockerfile的作用,注意所有首单词需要大写
sql
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS base
EXPOSE 80
COPY . /App
WORKDIR /App
ENTRYPOINT ["dotnet", "HelloWorld.dll"]
- FROM: 指定基础镜像
- EXPOSE: 镜像暴露的端口
- COPY: 将宿主机的文件复制到镜像的指定目录
- WORKDIR: 当前工作目录
- ENTRYPOINT: 启动命令
还有些其他常用参数
- RUN: 要执行的命令
- ENV: 指定环境变量
- USER: 指定容器内部以那个用户运行进程
- MAINTAINER: 维护者
- CMD: 启动命令
其中启动命令既有ENTRYPOINT 也有CMD,这两种命令几乎是重复的,单独使用一个可以实现大多数的用例
第二种写法
在上面的示例中,我们发现,对于项目的编译,我们使用了Visual Studio对项目进行了编译,那就意味着,我们需要宿主机上需要安装相关的dotnet sdk ,才可以进行编译,如果在多语言的环境下,那就意味着宿主机需要事先安装每一个语言的sdk ,所以这种方式不太方便,所以该Dockerfile则有另一种写法,我们来看一下
bash
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY . /src
RUN dotnet publish -c Release -o /app/publish
FROM mcr.microsoft.com/dotnet/aspnet:3.1 AS final
EXPOSE 80
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "HelloWorld.dll"]
我们分析一下这个Dockefile:
第一步 FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build 指定了我们需要编译项目的sdk的镜像
然后使用WORKDIR 命令指定工作目录在 /src ,然后使用COPY 命令,将所有文件复制到 /src目录
该Dockerfile有两步,第一步,对项目进行编译,第二部指定runtime和启动的dll入口。
将项目的编译放置到了容器内部,这样就不会依赖宿主机的环境。
4.3 自定义Nginx镜像
接下来,让我们自定义一个nginx 镜像,nginx 官方镜像里不包含ifconfig 命令,那么我们就ifconfig命令构建镜像里
- Dockerfile
cssFROM centos RUN yum install -y nginx RUN yum install -y net-tools EXPOSE 80 CMD ["nginx","-g","daemon off;"]
- 构建镜像,名为:new_nginx 执行 docker build -t new_nginx . 命令,
- 部署镜像docker run -d new_nginx ,并进入容器内部使用ifconfig命令
可以看到,容器中已经可以使用ifconfig命令了