第六章 制作自己的镜像

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命令了

相关推荐
一水鉴天4 小时前
整体设计 逻辑系统程序 之18 Source 容器(Docker)承载 C/P/D 三式的完整设计与双闭环验证 之2
docker·架构·认知科学·公共逻辑
飞快的蜗牛6 小时前
利用linux系统自带的cron 定时备份数据库,不需要写代码了
java·docker
火星MARK6 小时前
k8s面试题
容器·面试·kubernetes
香吧香7 小时前
Docker Registry 使用总结
docker
赵渝强老师8 小时前
【赵渝强老师】Docker容器的资源管理机制
linux·docker·容器·kubernetes
haicome9 小时前
deepseek部署
docker·ragflow·deepseek 部署
乄bluefox9 小时前
保姆级docker部署nacos集群
java·docker·容器
每天进步一点_JL10 小时前
Docker 是什么?
后端·docker·容器
一叶飘零_sweeeet10 小时前
从 0 到 1 掌控云原生部署:Java 项目的 Docker 容器化与 K8s 集群实战指南
docker·云原生·kubernetes·项目部署
森林猿11 小时前
docker-compose-kafka 4.1.0
docker·容器·kafka