知识点-初识Docker&DockerFile知识点各种整理

前言

上周事情比较多,逃了一次更,很是遗憾。不过虽然没更新文章,但是还是思考了下后续如何来记录以及分享知识。

其实在很多时候会遇到并解决一些小问题,这些小问题单拿出来写一篇文章可能并不是很合适。但这却是日常解决问题以及知识学习的常态,如果直接放弃掉却又很可惜。

再加上很多时候很忙的话,写一篇长文加上画画图可能需要几个小时的时间,这个时间是很难保证的。

所以针对上面的情况,我决定后续的记录以及分享通过简单的知识点以及系统的文章两种方式来推进。

知识点针对的是散碎的知识的总结,适合利用零散的时间来进行知识点的查缺补漏;文章针对的是系统的内容的梳理,适合利用相对整块的时间来进行系统的知识编排。

后续大家如果有什么好的想法和意见欢迎留言,我会根据实际情况做对应的调整。最后喜欢的朋友麻烦关注支持一波,谢谢大家。

正文

下面就开始正文的讲解,今天主要是来聊聊docker相关的东西。至于为什么要讲docker,是因为现阶段的K8S使用或者编排的容器都是docker容器,使用的镜像都是docker镜像。

作为K8S的上游,要形成完整的技术闭环,docker是绕不开的技术。而掌握了docker的知识后,对于了解和掌握K8S同样有很大的帮助。

基于此,今天来简单科普下docker相关的知识点,本文先通过docker的生命周期以及流程的梳理,加上dockerfile相关的知识点讲解,先帮助大家构建下docker的基础印象。

docker是什么

这个不多说了,直接引用网上的一个比较形象的说法:

Docker是基于Go语言实现的云开源项目。 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次镜像,处处运行”。

docker生命周期

上面的图就是docker相关的组件以及生命周期。可以通过一个形象的例子来构建对应关系帮助大家理解。

  • 工厂通过商品的配方(dockerfile)来生产(build)各种不同的商品(docker image)

  • 商品通过贴牌(tag)可以做成不同品牌的商品

  • 商品生产之后运输(push)到仓库(docker registry)中存储

  • 用户要买一件商品时,先从仓库中把商品提取(pull)出来

  • 用户拿到商品后,先通过使用说明书(docketfile)把商品整理好并使用起来(run)

  • 用户可以通过商品的特征来各种使用商品:煎炒烹炸,大卸八块甚至供奉起来都可以(start,stop,restart等操作)

  • 用户也可以将商品按照自己的需求和想法进行改造和加工(比如将矿石做成战斗机),做成一种新的商品放到仓库里供其他人再次购买使用(commit)。

是不是很好理解,和生活中的逻辑一致?其实优秀的技术除了解决问题能力外,易理解性亦是一个很重要的特性,会直接影响到该技术的受众以及发展前景。

docker核心流程

上面说了docker的生命周期,下面再来说说docker的核心流程:即产品的生产(bulid)以及使用(run)。

而这两个阶段都是通过dockerfile来决定的。所以说dockerfile是docker生命周期的开始,也是docker生命周期中最重要的部分。他决定了docker将来会被做成什么样子的东西(配方)以及该如何使用(使用说明书)。

下面就来看看dockerfile的构成以及详解:

dockerfile详解

首先先来看看dockerfile的命令都有哪些以及它们都运行在哪个阶段:

命令运行阶段描述
FROMBUILD镜像的妈妈(bulid阶段的基础环境)
RUNBUILD生成镜像需要干什么(build阶段执行的命令)
COPYBUILD生成镜像需要的原始材料(build阶段从宿主机拿原始资源到镜像中)
ADDBUILD生成镜像需要的半成品(与COPY唯一不同的是会对部分文件做处理,如解压压缩包)
CMDRUN运行容器时都干了什么(run阶段执行的命令)
EXPOSERUN运行容器时开的一扇门供其他人来串门(运行时对外暴露的端口)
MAINTAINERBUILD镜像的爸爸(镜像的维护者)
ENVRUN运行容器时提供一些公用的东西给容器内部所有使用者使用(运行时环境变量)
WORKDIRBOTHbulid以及run阶段大家工作的场所(CMD以及RUN执行的工作目录)
USERBOTHbulid以及run阶段的任务执行人(CMD以及RUN执行的user)
VOLUMERUN运行阶段容器为了持久化存储以正常的文件或者目录的形式挂载于宿主机上(持久化存储,容器挂了数据还在,用户存储有状态的数据)
ENTRYPOINTRUN用来指定一个容器启动时要运行的命令(容器的初始化命令)

然后再来看看docker执行dockerfile的大致流程:

  1. docker从基础镜像运行一个容器

  2. 执行一条指令并对容器作出修改

  3. 执行run的操作提交一个新的镜像层

  4. docker再基于刚提交的镜像运行一个新容器

  5. 执行dockerfile中的下一条指令直到所有指令都执行完成

所以有人将docker比喻成洋葱,需要一层一层的剥开其实是很恰当和形象的。

最后挂一个dockerfile的样例供大家参考:

FROM node:7-alpine

ENV PROJECT_DIR=/app

WORKDIR $PROJECT_DIR

COPY package.json $PROJECT_DIR 
RUN npm install 
COPY . $PROJECT_DIR

ENV MEDIA_DIR=/media \ 
  NODE_ENV=production \
  APP_PORT=3000

VOLUME $MEDIA_DIR 
EXPOSE $APP_PORT

ENTRYPOINT ["./entrypoint.sh"] 
CMD ["start"] 

这是一段相对完整的dockerfile代码,几乎涵盖了上面所有的命令。可以供大家理解这些命令的含义以及这些命令的使用方法。

但是dockerfile写的质量直接决定了docker image的质量以及docker运行的效率,所以dockerfile的编写规范以及优化策略还是很关键的,这个后续找机会单独讲解下,大家也可以考虑下有哪些需要注意的地方。本文作为知识点讲解就暂且收尾了。

文章到这里就结束了,如果想一起入门学习K8S的小伙伴,欢迎点赞转发加关注,下次学习不迷路!

挂个公众号二维码,公众号的文章是最新的,CSDN的会有些滞后,想追更的朋友欢迎大家关注公众号,谢谢大家支持。 

公众号地址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值