第六章 制作自己的镜像

4. 制作自己的镜像

4.1 HelloWorld By AspNetCore

通过前五章,我们已经知道了镜像 ,容器 ,仓库 三个核心的概念,下面我们使用Asp.NetCore来制作一个经典的HelloWorld镜像然后上传到私有仓库

4.1.1 制作镜像
  1. 基于 .NET Core 3.1 ,创建Hello World项目
  1. 更改启动路径打开Properties 文件夹里的launchSettings.json ,移除IIS Express节点,本步骤不是必须,更改后如下
  1. 更改Controller
  1. 添加Dockerfile ,右键项目-添加Dockerfile文本文件,注意没有扩展名,添加以下命令
  1. 右键Dockerfile属性,选择始终复制
  1. 重新生成项目,并打开生成后的文件夹
  1. 再此目录打开命令行,并执行以下命令
  1. 使用docker images 命令查看刚刚只做的镜像,可以看到刚刚只做的helloword的镜像.
  1. 接下来,就让我们运行该容器.在命令行输入以下命令,注意8080问您本机端口,该端口可以是其他任意端口,但是不能被其他应用程序占用
  1. 检查容器是否正常,在命令行中,使用以下命令.可以看到容器已经正常运行着
  1. 访问本地地址**localhost:8080/helloworld**,可以看到,已经正常相应
4.1.2 推送镜像

我们制作的镜像已经成功被部署了,接下来我们将这个镜像推送到Docker Hub官方镜像仓库.

  1. 使用docker tag 命令,对进行重命名
  1. 使用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命令构建镜像里

  1. Dockerfile
css 复制代码
FROM centos
RUN yum install -y nginx
RUN yum install -y net-tools
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
  1. 构建镜像,名为:new_nginx 执行 docker build -t new_nginx . 命令,
  1. 部署镜像docker run -d new_nginx ,并进入容器内部使用ifconfig命令

可以看到,容器中已经可以使用ifconfig命令了

相关推荐
小袁搬码37 分钟前
Windows中指定路径安装DockerDesktop
windows·docker·容器·docker desktop
qq_312920111 小时前
docker 部署 kvm 图形化管理工具 WebVirtMgr
运维·docker·容器
踏雪Vernon1 小时前
[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker编译环境镜像下载以及使用方式
linux·docker·容器·harmonyos
条纹布鲁斯2 小时前
dockerdsktop修改安装路径/k8s部署wordpress和ubuntu
docker·kubernetes
工业3D_大熊4 小时前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
szc17674 小时前
docker 相关命令
java·docker·jenkins
CP-DD4 小时前
Docker 容器化开发 应用
运维·docker·容器
Stark-C4 小时前
万物皆可Docker,在NAS上一键部署最新苹果MacOS 15系统
macos·docker·策略模式
老司机张师傅5 小时前
【微服务实战之Docker容器】第七章-Dockerfile解析
容器·dockerfile·虚悬镜像·docker学习
微信-since811925 小时前
[ruby on rails] 安装docker
后端·docker·ruby on rails