第六章 制作自己的镜像

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

相关推荐
阿尔帕兹1 小时前
构建 HTTP 服务端与 Docker 镜像:从开发到测试
网络协议·http·docker
ZHOU西口3 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
景天科技苑5 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge6 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇6 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试8 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!14 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
追风林15 小时前
mac 本地docker-mysql主从复制部署
mysql·macos·docker
A ?Charis17 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
城南vision17 小时前
Docker学习—Docker核心概念总结
java·学习·docker