您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

从零开始学K8s: 7.创建一个自己的镜像

时间:2021-03-10 11:05:19  来源:今日头条  作者:布谷鸟学堂

1.创建一个简单的应用程序

在安装好Docker后,现在让我们来创建一个简单的应用程序。

我们先创建一个简单的Node.js Web应用,然后将它打包到镜像中。该应用可以接受HTTP请求并返回主机名。虽然应用进程和其他进程一样都是运行在宿主机上,但是在容器中运行的应用获取到的是它所在容器的主机名,而不是宿主机名。

这个Node.js应用只有一个App.js一个文件。

在~目录下执行如下命令:

mkdir test01
cd test01
vim app.js

复制如下代码到app.js文件中:

const http = require('http');
const os = require('os');
console.log("开始运行...");
var handler = function(request, response) {
console.log("收到来自 " + request.connection.remoteAddress + "的消息");
response.writeHead(200);
response.end("已发送消息至: " + os.hostname() + "n");
};
var www = http.createServer(handler);
www.listen(8080);
从零开始学K8s: 7.创建一个自己的镜像

 

该程序会启动一个监听8080端口的HTTP服务。当收到来自外界的消息后,请求处理器会记录并输出请求方的IP地址,然后给每一个请求返回状态码200以及一段包含主机名的文本。

到这一步后,我们似乎可以下载并安装Node.js环境来直接测试这个应用程序了,但这就背离了本文的初衷了。因为我们要学习的是使用Docker来将这个应用打包到容器镜像中,然后让它不需要下载和安装就可以在任何主机上执行,当然如果想运行这个镜像,主机还是需要准备好最基本的Docker环境。

2.创建镜像的Dockerfile

要想将应用程序打包的镜像里,首先得创建一个叫做Dockerfile的文件。

在~/test01目录下执行如下命令:

touch Dockerfile

这个文件就是一个指令清单,指示Docker在构建镜像时需要执行的命令。Dockerfile需要和app.js文件在同一个目录下,而且应该包含如下命令:

FROM node:7
ADD app.js /app.js
ENTRYPOINT ["node", "app.js"]
从零开始学K8s: 7.创建一个自己的镜像

 

FROM关键字所在的行定义了镜像构建过程所使用的基础镜像。此处我们使用node镜像的tag7版本。

第二行的作用是将app.js文件从本地目录添加到镜像的根目录下,并保持相同的文件名。最后一行的作用是指定运行镜像的时候应该执行的命令。本例中,这个命令是node app.js

或许你会好奇为什么要选择这个node镜像作为基础镜像。因为这个应用是一个Node.js应用,因此需要一个包含node二进制可执行文件的镜像来运行该应用。你也可以使用任何包含这个二进制文件的镜像,甚至可以使用linux发行版的基础镜像,如fedora或ubuntu,然后在构建镜像之前指定安装Node.js的命令,从而确保运行容器的时候Node.js会被安装到容器中。

但是,因为node镜像是专门用来运行Node.js应用的,而且包含运行应用所需的一切,因此我们使用它作为基础镜像。

3.构建镜像

在Dockerfile和app.js都准备好了之后,我们就可以开始构建镜像了。在Dockerfile所在目录下,通过如下命令构建镜像:

docker build -t test1 .

注意末尾还有一个点号。

从零开始学K8s: 7.创建一个自己的镜像

 

这个命令会告诉Docker基于当前目录下的Dockerfile文件来构建一个叫做test1的镜像。Docker会查找目录中的Dockerfile文件,然后基于文件中的指令构建镜像。

下图展示了镜像的构建过程:

从零开始学K8s: 7.创建一个自己的镜像

 

镜像是如何构建的

从上面可以看出,镜像的构建过程不是由Docker client执行的。而是Docker client将整个目录的的文件上传到Docker daemon(守护进程)并由它进行构建。Docker client和daemon不需要在同一台机器上。

如果你在非Linux的操作系统上使用Docker,客户端可以安装在宿主机操作系统,但是daemon需要运行在VM中。因为构建目录下的所有文件都会被上传到daemon中,如果包含了很多大文件而且daemon不在本地运行的话,上传过程就会比较耗时。

需要注意的是,不要在构建目录下存放任何不需要的文件,因为这样会减慢镜像的构建速度,特别是当Docker daemon进程位于远程机器上的时候。

在构建的过程中,Docker会从公共镜像仓库(Docker Hub)拉取基础镜像(node:7),除非这个镜像已经被拉取且存到本机上了。

什么是镜像层

一个镜像并不是一个大的二进制块,而是由很多层组成的。不同的镜像之间可能会共享某些层,这使得存储和传输镜像变得更加高效。

例如,如果你基于相同的基础镜像(比如本例中的node:7镜像)创建了几个镜像,构成这个基础镜像的所有层都只会被存储一次。而且,当拉取一个镜像的时候,Docker会单独的下载每一层。某些层可能已经存储在你的机器上了,因此Docker只会下载那些还未下载过的层。

你可能会认为每个Dockerfile只会创建一个新的层,但是事实不是这样。当构建镜像的时候,Dockerfile中的每一条单独的命令都会创建一个新的层。在镜像构建的过程中,在拉取了基础镜像的所有层之后,Docker会在这些层之上创建一个新的层并将app.js文件添加到这个层里,然后会创建另外一个新的层来指定镜像被运行的时候应该执行的命令。

最后一层会被标记为test1:latest。如下图所示:

从零开始学K8s: 7.创建一个自己的镜像

 

other:latest的镜像是与我们自己构建的镜像test1:latest共享Node.js的所有层。

当完成镜像构建后,一个新的镜像就被存储到本地了。可以通过docker images命令列出所有本地的镜像:

从零开始学K8s: 7.创建一个自己的镜像

 

4.运行镜像

现在我们就可以通过如下命令运行我们自己创建的镜像了:

docker run --name test1-container -p 8080:8080 -d test1

该命令会告诉Docker通过test1镜像启动一个叫做test1-container的容器。-d标志表示容器与终端脱离,也是就容器会在后台运行。本机的8080端口与容器的8080端口映射。

从零开始学K8s: 7.创建一个自己的镜像

 

可以看到返回的16进制数字就是容器的ID。

 

如果觉得本文对您有帮助,可以关注、转发、点赞,您的支持是我持续创作的最大动力!



Tags:K8s   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
背景:目前prometheus 给pod的内存告警阀值设置的85%,由于JVM 设置最高申请内存为pod limit 的75%,通过arthas-boot查看到堆内存和元空间占用内存之和跟prometheus告警值不同。...【详细内容】
2021-09-16  Tags: K8s  点击:(104)  评论:(0)  加入收藏
近期由于工作原因,在项目支持的过程中,进行了一次K8S的基础环境部署,云平台一直是公司的重要底座,而我由于一系列原因,一直没有亲自尝试,通过本次的机会,让我重新做了一遍,也找到了...【详细内容】
2021-09-09  Tags: K8s  点击:(90)  评论:(0)  加入收藏
概述谷歌云使用先进的 Andromeda 网络来实现 VPC 内实例之间的相互访问,以及 Google Kubernetes Engine (GKE) 的 Pod 的跨节点互访,避免了配置静态路由或者 Overlay 网络带来...【详细内容】
2021-08-20  Tags: K8s  点击:(103)  评论:(0)  加入收藏
1.创建yaml模板 kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml 2.修改模板 vim web.yamlapiVersion: apps/v1kind: Deploymentmetadata:label...【详细内容】
2021-07-20  Tags: K8s  点击:(160)  评论:(0)  加入收藏
Jenkins 是目前最常用的持续集成工具,拥有近50%的市场份额,他还是很多技术团队的第一个使用的自动化工具。由此可见他的重要性!这份Jenkins宝典从入门介绍到结合Docker+SpringC...【详细内容】
2021-06-09  Tags: K8s  点击:(145)  评论:(0)  加入收藏
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。这个工具能通过两条指令完成一个 kubernetes 集群的部署:# 创建一个 Master 节点$ kubeadm init # 将一...【详细内容】
2021-04-29  Tags: K8s  点击:(276)  评论:(0)  加入收藏
K8S 网络设计与实现是在学习 K8S 网络过程中总结的内容。本文按照 K8S 网络设计原则、Pod 内部网络、Pod 之间网络等几个步骤讲解 K8S 复杂的网络架构。 图片出自:《你女儿也...【详细内容】
2021-04-01  Tags: K8s  点击:(266)  评论:(0)  加入收藏
记录在 ubuntu-20.04.2-live-server系统上通过rancher安装k8s的过程。0. 更换阿里云软件源为了保障下载速度,将ubuntu软件源替换为阿里云软件源。如果网络通畅,可跳过。0.1....【详细内容】
2021-03-26  Tags: K8s  点击:(324)  评论:(0)  加入收藏
1.创建一个简单的应用程序在安装好Docker后,现在让我们来创建一个简单的应用程序。我们先创建一个简单的Node.js Web应用,然后将它打包到镜像中。该应用可以接受HTTP请求并返...【详细内容】
2021-03-10  Tags: K8s  点击:(219)  评论:(0)  加入收藏
一、日志收集的需求背景:• 业务发展越来越庞大,服务器越来越多​ • 各种访问日志、应用日志、错误日志量越来越多​ • 开发人员排查问题,需要到服务器上查日志,...【详细内容】
2021-03-05  Tags: K8s  点击:(189)  评论:(0)  加入收藏
▌简易百科推荐
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(10)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(10)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(47)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(33)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(61)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(167)  评论:(0)  加入收藏
环境要求 ubuntu系统:20.04 docker版本:20.10.7 redis版本:6.0.6步骤由于我这里已经有相应的redis镜像,这里就不记录了,关于docker一些基础知识可以看我以前的笔记开启3台re...【详细内容】
2021-07-26  石老师小跟班    Tags:Redis主从复制   点击:(117)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条