云原生 | 从零开始学Docker六如何写出自己的镜像——Docker file
Posted cloud、泡泡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生 | 从零开始学Docker六如何写出自己的镜像——Docker file相关的知识,希望对你有一定的参考价值。
该篇文章已经被专栏《从零开始学docker》收录
Docker file
数据卷容器
在上一篇文章中其实有一个点我没有说,那就是如何实现两个或者多个容器之间数据共享。
打个比方,有两个容器 一个父容器一个子容器,谁去挂载了谁,那么它就是父容器,比如c2挂载c1,那么c1就是父,只要挂载了,同步的数据卷里面的内容就是同步的
了。被挂载的父容器也叫做数据卷容器
那么如何实现呢?这个时候就是使用我们的--volumes-form
首先我们启动一个centos的镜像 docker run -it --name docker01 91d74fd5d017
容器数据卷在这里!启动了docker01,然后启动docker02,03,继承之前的docker01镜像的数据docker run -it --name docker02 --volumes-from docker01 paopao/centos:1.0
容器数据卷一样在!我们在docker01加一个文件第二个也会同步!docker01就是数据卷容器现在。
创建第三个,和上面一样的!挂载docker01,通过03,02创建,01也会同步!
如果把01删了也不会影响其他容器的数据,只要有容器在用就不会丢失。其实这个功能是一个,类似于双向拷贝的概念,docker1是共享卷,虽然1挂了,但是2和3已经拷贝下了,所以不影响。(实际上是一种映射,持久化数据共享依赖于宿主机,三个容器里的文件都硬链接到宿主机下面了,路径一致)
mysql数据共享
docker run -d -p 3310:3306 -v /etc/mysql/conf.d -v /var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
mysql02挂载的目录相同,-v那段目录甚至可以不要了,因为目录相同,所以没啥问题。
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-form mysql01 mysql:5.7
可以实现两个容器数据同步。
结论
容器之间可以做配置信息传递,比如做集群要把这个集群文件拷贝到多个配置文件,每个服务器都要有,现在我们共享就ok了,数据卷生命周期一直持续到没有容器使用为止。
但是一旦持久化到本地,这个时候,本地数据是不会删除的。
Docker File
Docker File的介绍
Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建docker镜像的构建文件就是命令脚本,自制一个目录,在里面写一个脚本,用来生成镜像,镜像是一层一层的,所以脚本是一层一层的命令,脚本命令每个都是镜像一层。
dockerhub官网也可以看到dockerfile,下面是centos的dockerfile
我们来做一个最简单的dockerfile,首先要vim dockerfile1,进入编辑模式之后写入下面这些代码。
FROM centos #centos作为基础
VOLUME ["volume01","volume02"] #额外挂载目录 在创建镜像的时候就挂载好了
#不加斜杠默认根目录,数据卷目录和外部一定有一个同步目录
CMD echo "----endl----"
CMD /bin/bash #以bash启动
保存退出之后可以开始构建了!build构建 -f是file的地址
docker build -f dockerfile1 -t paopao/centos:1.0 .
当前路径的dockerfile1打包成paopaocentos1.0,然后启动镜像。
看到挂载的两个数据卷目录了,进去新建一个文件
之后出来inspect。
mount那有目录,没问题,进入目录发现有文件没问题。
未来实用得会比较多,因为会构建自己镜像,如果构建的时候没挂载卷可以-v手动挂载
构建步骤
1.写一个 dockerfile 文件
2.docker build 构建成为镜像
3.docker run 运行镜像
我们可以去dockerhub看看是怎么做的,会跳到github,官方的镜像很多都是基础包,没有什么功能,我们通常会自己搭建。
Dockerfile的构建过程
基础知识
1.每个保留关键字(指令)必须是大写字母。
2.执行是从上到下顺序执行。
3.# 表示注释。
4.每一个指令都会创建提交一个新的镜像层并提交。
docker file是面向开发的,如果发布项目做镜像,就要编写 docker file 文件。一些公司要交 Docker 镜像,逐渐成为了企业交付标准,必须掌握。
Docker File:构建文件,定义了一切的步骤,源代码。
Docker Images:通过docker file构建生成的镜像,最终要发布运行的产品,原来jar,war执行,现在都变成镜像,直接一起运行。
Docker容器:容器就是镜像运行起来提供服务的。 镜像和容器都是使用别人的,现在要自己写。
DockerFile体系结构(保留字指令)
FROM
初始化一个新的构建阶段,并设置基础映像【当前新镜像是基于哪个镜像的】,就相当于电脑,没有就不行,一切从这里开始构建。
单个dockfile可以多次出现 FROM ,以使用之前的构建阶段作为另一个构建阶段的依赖项。
MAINTAINER
镜像是谁写的,作者信息等,一般是留自己名字邮箱啥的,但是现在都用LABEL了
LABEL maintainer="paopao<3134912846@qq.com>"
LABEL description="This is my centos"
RUN
docker镜像构建的时候需要运行的命令。
RUN /bin/bash -c 'echo hello,CSDN'
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包,添加的东西一个就是一层。
可以指定多个资源,但如果它们是文件或目录,则它们的路径被解释为相对于构建上下文的源,也就是WORKDIR
WORKDIR
指定在创建容器后,终端默认登陆的进来工作目录.
如果WORKDIR不存在,即使它没有在后续Dockerfile指令中使用,它也会被创建。
docker build 构建镜像过程中,每一个 RUN 命令都会新建一层。只有通过 WORKDIR 创建的目录才会一直存在。
EXPOSE
暴露端口配置,和-p一样的。
Docker 容器在运行时侦听指定的网络端口。可以指定端口是监听TCP还是UDP,如果不指定协议,默认为TCP。
ENV
用来在构建镜像过程中设置环境变量,mysql的用户名密码这种。
ENV <key>=<value>
设置的环境变量将持续存在,可以使用docker inspect来查看。使用docker run --env <key>=<value>
来更改环境变量的值。
COPY
类似于add,将文件拷贝到镜像。
COPY指令和add指令的唯一区别在于:是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而add指令还支持通过URL从远程服务器读取资源并复制到镜像中。
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定这个容器启动的时候运行的命令,比如cmd echo输出类似于这种,只有最后一个生效,可以被替代。
如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令。
FROM centos:7
CMD ["/usr","ls -l"]
ENTRYPOINT
指定这个容器启动的时候运行的命令,可以追加命令。
ENTRYPOINT 和 CMD 一样,都是在指定容器启动程序及参数,不过它不会被 docker run 的命令行参数指定的指令所覆盖。如果要覆盖的话,需要通过docker run --entrypoint 来指定。
ONBUILD
构建一个被继承的Dockerfile的时候就会执行ONBUILID的指令,触发指令。
将一个触发指令添加到镜像中,以便稍后在该镜像用作另一个构建的基础时执行。也就是另外一个dockerfile FROM了这个镜像的时候执行。
实战-创建自己的centos
dockerhub上99%的镜像都是从这个基础镜像过来的
1.进入home,创建dockerfile目录,进入该目录vim mydocker(自己改名字也可以)。
cd home/
mkdir dockerfile
cd dockerfile
vim mydocker
2.开始写脚本(测试发现之后vim,ifconfig等都没有,先增加功能)
FROM centos:centos7 #基于什么
LABEL \\ #镜像基本信息
org.label-schema.schema-version="1.0" \\
org.label-schema.name="CentOS Base Image" \\
org.label-schema.vendor="CentOS" \\
org.label-schema.license="GPLv2" \\
org.label-schema.build-date="2022.5.26" \\
org.label-schema.zuozhe="paopao" \\
org.label-schema.email="3134912846@qq.com"
ENV MYPATH /usr/local #本地目录
WORKDIR $MYPATH #工作目录 直接用本地目录
RUN yum -y install yum #yum命令
RUN yum -y install net-tools #ifconfig一些命令
EXPOSE 80 #暴露80端口
CMD echo $MYPATH #输出
CMD echo "---end---"
CMD /bin/bash #启动之后进入bash命令行
3.开始打包镜像
docker build -f mydockerfile -t mycentos:0.1 .
4.测试运行
docker run -it mycentos:0.1
以前的默认目录是根目录,现在根据我们设置,工作目录,命令都有了。
然后可以查看镜像历史,我们平时可以研究镜像是怎么做的
docker history 镜像id #可以看到镜像是怎么做的
CMD和ENTRYPOINT的区别
CMD 指定这个容器启动的时候运行的命令,比如cmd echo输出类似于这种,只有最后一个生效,可以被替代。
ENTRYPOINT 指定这个容器启动的时候运行的命令,可以追加命令。
vim dockerfile2 编写dockerfile cmd只执行最后一个命令
FROM centos:7
CMD ["ls","-a"] 用指令的话要加这个框 我们写了一个只有ls的centos测试
docker build -f dockerfile2 -t cmdtest .
然后运行
docker run cmdtest
我们想追加一个l 他应该是ls -al,但是是cmd,-l替换了ls-a,-l不是命令,所以报错
换成ls -al就行了
然后我们试一下另一种方法
vim dockerfile3
FROM centos:7
ENTRYPOINT ["ls","-a"]
docker build -f dockerfile3 -t enrtyport .
docker run enrtyport
功能和之前一样的
docker run enrtyport -l
此时可以看出来确实是追加!
写在最后
创作不易,如果觉得内容对你有帮助,麻烦给个三连关注支持一下我!
目前正在更新的系列:从0开始的蓝桥杯省一之路,云原生系列。
感谢各位的观看,文章掺杂个人理解,如有错误请联系我指出~
从零开始学架构:架构师成长路径
内容摘要
从架构的本质,软件工程,架构师职责,成长路径等方面,介绍什么是架构,架构流程以及架构师职责和成长规划。
本篇主题
一、什么是架构
二、项目中的角色
三、架构师职责和工作内容
四、架构工作流
五、架构师成长路径
六、架构能力模型
七、扩展知识
八、本章总结
一、什么是架构
架构是系统的蓝图,描述了系统的结构和关键决策。包含系统的功能和非功能性需求,如何实现的,系统与子系统是如何划分的,系统之间如何通信的,系统功能如何设计的和交互的。
包含重要的架构决策,系统组成,功能设计,技术选型,成本分析等
架构的基础是设计满足客户需求的系统,其中包含功能性,非功能性以及质量和约束。
二、项目中的角色
客户:为系统开发买单的人,关注系统的业务价值。
用户:使用系统的人,关注是否满足功能需求,提升效率和易用性等。
项目经理:负责项目管理,组织,协调,沟通等管理工作。
需求分析师:负责需求相关工作,比如业务分析,需求获取,需求调研,需求管理,编写需求规格说明书等
系统架构师:负责整体的系统分析,架构规划,技术选型,核心功能需求和非功能性需求的架构设计。
系统设计师:在架构模型的基础上,进行核心功能和非核心功能的详细设计。
开发人员:根据架构设计和详细设计完成编码和单元测试,达到提测标准。
测试人员:验证开发功能是否满足需求,比如进行功能测试,集成测试,性能测试,压力测试,安全性测试,回归测试等。
运维人员:负责部署环境搭建,部署和日常维护。
三、架构师职责和工作内容
架构师在项目中起到承上启下的作用。建议参与到系统建设过程的全流程中。
架构师的职责如下:
1)支持售前或需求阶段,提供概念架构或技术咨询;
2)系统分析,架构设计,技术选型,产出架构解决方案;
3)指导项目团队成员,按照架构设计完成,开发,测试和发布;
4)开发或设计开发框架,制定编码/编程规范,设计架构原型,验证架构原型;
5)组织技术或架构培训,把握技术/架构方向;
6)方案平衡(实现与成本),干系人沟通,技术风险管理,技术领袖等;
按照项目阶段,简述工作内容,如下:
售前阶段,给予商务支持,提供系统解决方案和架构咨询。
需求阶段,与需求分析师一起,参与需求沟通,协助完成技术/业务咨询和需求模型。(好的架构师同时是业务专家)
架构阶段:进行系统分析和设计,进行系统抽象,设计系统模型,进行技术原型,开发架构原型等
设计阶段:指导设计人员完成详细设计;
开发阶段:指导开发人员按设计实现,解决技术难题。
测试阶段:指导测试人员测试工作,特别是非功能需求的测试。
发布阶段:指导部署人员按照部署架构进行部署,及时解答或反馈试运行期间的架构问题。
其他工作:技术选型,人员培训,技术指导
四、架构工作流程
架构工作流程是一个系统如何从需求,架构到实现的过程和方法。
良好的架构,需要架构师除具备技术和架构设计能力外,还要有良好(丰富)的业务知识。从软件工程角度,架构师除参与系统的架构设计阶段外,还需要参与需求分析阶段,开发,测试,发布,试运行阶段。
本节内容,从需求模型和解决方案模型,介绍架构工作的流程。
主要包括需求模型,架构模型,设计模型,解决方案模型,四个方面。
需求模型:参与需求分析和需求模型设计,提供技术建议或引导需求定义,提供解决方案指导。
主要参与者:需求分析师,业务分析师
辅助参与者:架构师,设计师
架构模型:根据需求模型,产出架构模型。
1)选择架构对象:关键流程,核心用例和非功能需求;
2)流程建模:梳理需求关键流程,分析业务对象,子系统,模块,设计出系统的交互流程;
3)领域建模:梳理业务流程中涉及的对象,子系统模块,划分子系统,模块,核心对象,通信机制,事务模型等
4)输出总体架构:根据领域模型和业务流程模型,结合组件架构,部署架构,通信机制,输出系统体架构方案。
5)架构验证:验证架构可用性,可以用评审或架构原型的方式,进行评审或实际测试验证。
主要参与者:架构师,架构委员会
辅助参与者:系统设计师,开发人员,测试人员
设计模型:在架构师指导下,根据系统架构,完成各子系统,模块,功能,接口的概要或详细设计。
主要参与者:系统设计师,高级工程师
辅助参与者:架构师
解决方案模型:架构模型,设计模型,架构原型等统一组成架构解决方案。
一个完整的系统架构应包括:整体架构,子系统,模块,功能概要或详细设计,通信机制,事务机制,接口定义(内部,外部),领域模型,业务流程,数据库设计,中间件,组件架构,部署架构等
系统架构解决方案标准
1)满足系统的功能和非功能性需求;
2)符合项目要求的规模和成本;
3)满足开发,测试和发布要求;
五、架构师成长路径
本质:学习,实践,总结,个人进步和能力成长的过程。
开发工程师:主要在指导下进行开发或独立进行简单功能开发。本阶段的核心是学好技术本身,多做一些项目,勤奋,思考,总结。这个时期就是学习,实践让自己的技能水平不断提升。空闲时间可以学一些设计模式,软件工程方面的知识,用于拓展视野和为高级工程师做准备。
当自己的技术能力,项目经验,编码水平,设计能力达到一定程度后,就可以升级为高级工程师。
一句话:写好代码,积累经验。
高级工程师:可以独立或带领工程师负责某模块/系统的设计和开发,在技术和项目上有一定的经验。本阶段可以根据自己的职业目标选择深入技术或学习管理知识。
学习的方向:技术深度,技术广度,分布式,架构知识和管理知识等。
一句话:技术深入全面,思考完善的系统设计。
系统架构师(技术专家):在某一方面技术达到一定深度,在某些方面有自己的见解和独立解决问题的能力。可带领一个技术团队进行开发和管理工作。可完成需求分析,系统设计,技术选型,架构设计,开发管理等工作。
一句话:技术专家,架构实践和管理能力。
资深架构师:具备丰富的大型项目,多种项目的需求分析,系统架构,系统设计,项目管理等经验。在技术的广度和深度方面,业务知识方面具备专业的建树。
一句话:大型项目,领域专家和解决方案。
技术总监,CTO,技术副总裁:负责公司整体技术规划,技术管理,把握技术方向,精通业务和技术,具备良好的沟通,组织和协调能力。
一句话:方向,流程,制度,规范,管理。
以上是个人对职位和能力的总结,供参考。
六、架构师能力模型
从宏观角度和专业领域,简单介绍架构师的能力模型。
6.1 宏观角度
深度:在某一项或多项技术领域有一定深度,掌握技术的特点,适应场景和缺点
广度:多项技术,掌握非技术知识,比如需求,项目,管理等
6.2 专业领域
技术:精通一方面或多方面技术,有自己的见解和实践经验;
业务:精通负责领域的业务知识,达到或基本达到领域专家级别;
架构:精通需求分析,系统架构,设计模型,架构模型,具备丰富的架构经验;
管理:精通技术管理,项目管理和通用管理知识和能力;
七、架构扩展知识
以下内容可自行脑补。
1. 软件工程
2. 需求工程
3. 项目管理
4. 干系人,涉众
八、本章总结
从架构的本质,项目角色,架构师职责,软件工程,成长路径等方面,介绍了什么是架构,架构流程以及架构师职责,成长路径和能力模型。
本篇是根据学到的知识,工作经验和个人思考 ,进行的总结,供学习参考。不足之处,欢迎大家一起交流。
预告: 第二篇 架构知识领域
2.1架构方法论:面向过程,面向对象,面向方面,面向服务
2.2系统划分:系统,子系统,模块,功能,接口
2.3架构基本原则:通用专用,职责分离等
2.4模式:设计模式,架构模式,基础设施模式
2.5架构视图:4+1视图
以上是关于云原生 | 从零开始学Docker六如何写出自己的镜像——Docker file的主要内容,如果未能解决你的问题,请参考以下文章
云原生 | 从零开始学Kubernetes二使用kubeadm搭建K8S集群
云原生 | 从零开始学Kubernetes十八Kubernetes核心技术Service实战
云原生 | 从零开始学Kubernetes三Kubernetes集群管理工具kubectl