[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile_docker构建最原始的镜像-程序员宅基地

技术标签: 云原生  容器  自定义构建镜像  云原生专题  docker  

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_程序员宅基地

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122713131


目录

前言:

第1章(方法1):动态构建:基于现有的docker镜像进行修改

第2章(方法2):静态构建:基于现有的docker镜像重新构建自己的镜像

2.1 步骤1:开发机器:安装应用程序开发所需要的依赖环境

2.2 步骤2:开发机器:编写自己的Linux应用程序

2.3 步骤3:构建机器:生成Linux应用程序,可以是c++的*.so,也可以是java的*.jar,也可以是python文件。

2.4 步骤4:构建机器:创建构建镜像的工作目录,

2.5 步骤5:构建机器:把生成的Linux应用程序拷贝到工作目录/work/target 

2.6 步骤6:构建机器/开发机器:选择基础镜像

2.7 步骤7(关键):构建机器/开发机器:编写docker镜像构建的配置文件Dockerfile

2.8 步骤8:构建机器:用docker build构建新的docker镜像

2.9 步骤9:构建机器/主机机器:运行新构建的docker镜像

2.10 步骤10:云服务商环境:修改云服务器的安全组,使能Web应用所需要的端口

2.11 步骤11:个人主机:通过internet进行远程访问测试

2.12 步骤12:构建机器:发布分享镜像

2.13 步骤13:任意支持docker的主机:不任意环境部署镜像

第3章(方法3):静态构建:从无到有,全新搭建自己的镜像



前言:

我们除了使用他人开发或的微服务构建业务系统,很多时候,我们需要构建我们自己的应用程序(微服务)的镜像,然后基于我们自己的微服务镜像集成和部署我们自己的业务应用。因此,构建新的微服务镜像就显得非常重要,构建我们自己的微服务镜像,有两个基本思路:

(1)基于现有的docker镜像修改或增量,站在巨人的肩膀上进行改进;(2)从无到有,全新搭建自己的镜像。大多数时候,我们使用的第一种方法。

第1章(方法1):动态构建:基于现有的docker镜像进行修改

这种方式,就是在现有的docker镜像基础上进行修改,通过文件拷贝(docker cp)、提交(docker commit)、存储(docker save)等操作,把修改的内容存储成新的docker镜像或新的压缩文件。这种方式适合变化较小的docker镜像生成和手工操作,并且这种方式需要runtime执行docker,不适合静态构建

详见本系列的前一文章:

[云原生专题-10]:容器 - Docker的修改、保存、共享_文火冰糖(王文兵)的博客-程序员宅基地

第2章(方法2):静态构建:基于现有的docker镜像重新构建自己的镜像

这种方法与第1种方法类似,是在现有的docker镜像的基础之上,进行修改或增量,重新构建自己的新的镜像。

与第1种方法不同的是,这种方法不需要启动、运行现有的docker镜像,只需要使用原有的静态的镜像文件即可,整个构建过程完全在静态的方式下进行,适合自动化的方式构建。

2.1 步骤1:开发机器:安装应用程序开发所需要的依赖环境

2.2 步骤2:开发机器:编写自己的Linux应用程序

2.3 步骤3:构建机器:生成Linux应用程序,可以是c++的*.so,也可以是java的*.jar,也可以是python文件。

2.4 步骤4:构建机器:创建构建镜像的工作目录,

/work

/work/target  =》可以是其他名称

2.5 步骤5:构建机器:把生成的Linux应用程序拷贝到工作目录/work/target 

备注:构建work/target目录的作用是:为生成的docker镜像做好准备,方便后续把该目录中的文件,拷贝到docker镜像中。

当然,拷贝的过程,需要通过Dockerfile命令完成,Docker build不会自己默认这行拷贝操作。

2.6 步骤6:构建机器/开发机器:选择基础镜像

从docker hub中选择基础镜像,这个基础镜像通常包含了Linux rootfs以及应用程序所需要的运营环境。

2.7 步骤7(关键):构建机器/开发机器:编写docker镜像构建的配置文件Dockerfile

案例1:基于nginx镜像,创建自定义的主页的Web应用的镜像

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。

下面基于docker hub中现有的nginx 镜像定制一个新的应用程序镜像,该镜像包含有一个 /usr/share/nginx/html/index.html 文件。

FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html

--FROM nginx:docker继续的基础镜像,docker Daemon自动从docker hub中下载该基础镜像。

--RUN:Daemon会自动运行或解压nginx镜像,然后在nginx镜像内部执行RUN后面的命令,如echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html,即生成/usr/share/nginx/html/index.html文件,文件的内容为:'这是一个本地构建的nginx镜像'。

案例2:基于centos镜像,创建包含redis数据库的微服务镜像。

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

该案例中,

  • 先以docker hub中已有的centos镜像为基准:FROM centos。
  • 然后在centos镜像中,先安装wget: yum -y install wget
  • 然后在centos镜像中,通过wget远程下载redis镜像文件: wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
  • 然后在centos镜像中,通过tar命令解压redis文件:tar -xvf redis.tar.gz

Dockerfile中的其他构建命令

  • COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
  • ADD:ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下,ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

  • CMD:类似于 RUN 指令,用于运行程序,但二者运行的时间点不同: CMD 在docker run 时运行。RUN 是在 docker build。

  • ENTRYPOINT:指定运行docker时,默认执行的程序入口。 

    类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

    但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

  • ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
  • ARG

    构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

    构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

  • VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

.......

2.8 步骤8:构建机器:用docker build构建新的docker镜像

案例1:构建nginx:v3镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。

:最后的 . 代表本次执行的上下文路径,下一节会介绍。

docker build -t nginx:v3 .

案例2:构建redis:v1镜像

docker build -t redis:v1 .

2.9 步骤9:构建机器/主机机器:运行新构建的docker镜像

2.10 步骤10:云服务商环境:修改云服务器的安全组,使能Web应用所需要的端口

2.11 步骤11:个人主机:通过internet进行远程访问测试

2.12 步骤12:构建机器:发布分享镜像

2.13 步骤13:任意支持docker的主机:不任意环境部署镜像

第3章(方法3):静态构建:从无到有,全新搭建自己的镜像

这种方法已经很少用了,毕竟至少可以基于centos或Ubuntu docker镜像为基础,构建其他自定义功能的镜像,不需要重头开始。

当然,如需重头开始构建的话,可以通过Dockerfile支持的各种命令,从无到有的构建镜像。


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_程序员宅基地

本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122713131

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/HiWangWenBing/article/details/122713131

智能推荐

【转】加权最小二乘法_带权函数的最小二乘法-程序员宅基地

文章浏览阅读4.9k次,点赞4次,收藏44次。加权最小二乘、迭代最小二乘、抗差最小二乘、稳健最小二乘他们细节的区别我就不过分研究了,不过这些最小二乘似乎表达的是一个意思:构造权重函数,给不同测量值不同的权重,偏差大的值权重小,偏差小的权重大,采用迭代最小二乘的方式最优化目标函数。下面是matlab中robustfit函数权重函数,可以参考一下:..._带权函数的最小二乘法

openstack keystone 添加工程以及用户_openstack将用户加入到用户组-程序员宅基地

文章浏览阅读2.3k次。keystone用户管理可以通过rest api进行,也可以通过相关的命令行进行。python-keystone是keystone认证组件的一个客户端,提供了两种使用方式,(1)python编程接口 (2)命令行接口# Using token auth env variablesexport SERVICE_ENDPOINT=http://127.0.0.1:3535_openstack将用户加入到用户组

基于Python爬虫江苏南京餐厅餐馆数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状-程序员宅基地

文章浏览阅读2.2k次,点赞21次,收藏19次。基于Python爬虫江苏南京餐厅餐馆数据可视化系统设计与实现(Django框架) 研究背景与意义、国内外研究现状毕设毕业设计源代码,经营者可以了解顾客的消费习惯、评价意见等信息,从而调整经营策略,提供更好的服务,增加顾客的满意度和忠诚度。消费者可以通过系统获得餐厅餐馆的基本信息、价格、评价等数据,从而能够更好地了解餐厅餐馆的情况,减少了选择就餐场所时的盲目性,提高了消费者的就餐体验。通过数据可视化的方式,餐厅餐馆可以直观地展示自己的特色、菜品、评价等信息,提高了餐厅餐馆的知名度和曝光率,吸引更多的潜在顾客。

AltiumDesigner学习笔记(一)——创建工程与原理图文件-程序员宅基地

文章浏览阅读472次。一、创建工程与原理图文件1、通过菜单创建PCB工程(1)File - New - Project - PCB Project,即可在当前工作区创建新的PCB工程(2)新建工程并不直接在硬盘中创建文件,需要保存:在工程面板中,右键单击新建的工程名 - Save Project,在弹出的对话框中,选择工程存储目录(一般需要为新建的工程新建一个专属目录)并命名工程。2、通过菜单或者工..._简述新建一个项目文件并在该项目文件下新建一个原理图文件的操作

自己动手编写 Windows 防止锁屏脚本程序_防锁屏脚本-程序员宅基地

文章浏览阅读1.4w次,点赞25次,收藏108次。背景介绍有些公司处于安全和保密工作考虑,会通过 Windows 组策略强制所有办公电脑在无操作的情况下 5 分钟或者 10 分钟自动锁屏,避免无关人士看到不该看的内容。作为程序员,十分反感这种一刀切的方案,一来很容易打断思路,比如正在写代码或者向别人展示时,突然锁屏了就挺恶心的;二来每次锁屏后都要输入密码,这简直就是浪费生命,不能忍!为了解决这个问题,我们可以编写一个简单的 vbs 脚本,在锁屏周期内模拟按键操作,从而避免 Windows 桌面被锁屏。之所以使用 vbs 脚本,而不是 Python、Ja_防锁屏脚本

MFC总结_mfc报告总结-程序员宅基地

文章浏览阅读559次。一、MFC类库概述MFC(Microsoft Foundation class)微软基本类(库),有时候也有人叫做微软基本类库,因为它确实是一个类库(物理上讲),而且非常庞大;它也是一个面向对象的应用程序架构(逻辑上),程序员利用它可以很方便搭建应用程序框架。MFC结合了面向对象的编程技术和WINDOWS消息驱动的编程技术,并封装了WIN32API,其设计好处:消除了WIN32API的复杂性,封装了WIN32API,统一了程序的概念,而且可扩展。MFC由AFX项目小组进化而来,还有一些AFX代码,如Af_mfc报告总结

随便推点

开源软件的总拥有成本指南_使用开源软件需要履行哪些义务-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏5次。使用现成的软件能加速开发进程。然而开源软件(OSS)并不是免费使用的。使用开源软件往往伴随着承担义务和风险,这些都是成本。本指南根据公开信息和我15年的经验总结了使用开源软件进行专业软件开发的成本。_使用开源软件需要履行哪些义务

ROS2 Warning: RosPluginProvider._parse_plugin_xml() plugin file rqt_gui_cpp/plugin.xml not found-程序员宅基地

文章浏览阅读1k次。ROS2运行rqt指令,出现一个警告,RosPluginProvider._parse_plugin_xml() plugin file "C:\dev\ros2_galactic\share\rqt_gui_cpp/plugin.xml" in package "rqt_gui_cpp" not found原因,RosPluginProvider._parse_plugin_xml() plugin 在windows系统上不受支持。参考,https://github.com/ros-v_rospluginprovider._parse_plugin_xml() plugin file "/opt/ros/kinetic/share/rq

精品单页个人导航HTML源码_单页导航源码-程序员宅基地

文章浏览阅读1k次。简约大气精品单页导航-可自行修改其他页面,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面。_单页导航源码

Axure RP医疗在线挂号问诊原型图医院APP原形模板_医疗app原型-程序员宅基地

文章浏览阅读1.1k次。本套原型图主要功能有医疗常识科普、医院挂号、排队预约、在线问诊、医院查找等,基本所有模块都是原创设计。同时页面中使用了大量的动态面板效果,制作了仿真的预约弹窗、医院详情介绍等。你可以将页面直接套用在类似项目上,或直接在模板上拓展页面,快速搭建出高质量的医疗类APP。医疗在线挂号问诊Axure RP原型图医院APP原形模板,是一款原创的医疗类APP,设计尺寸采用iPhone13(375*812px),原型图上加入了仿真手机壳,使得预览效果更加逼真。_医疗app原型

深度缓存算法-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏4次。通常用z轴来计算各对象的距观察平面的距离。处理每一面时,将其到观察平面的深度与前面已经处理表面进行比较。如果一个表面比任一已处理表面都近,则计算其表面颜色并和深度一起存储。场景的可见面由一组在所有表面处理完后存储的表面来表示。该算法需要两个缓存器,一个用来存放颜色的颜色缓存器,一个用来存放深度的深度缓存器。利用深度缓存器进行可见性的判断,消除隐藏对象。其具体做法是首先对深度缓存器和颜色缓存器进行初..._深度缓存算法

正弦交流电电压电流峰值与有效值关系的推导-程序员宅基地

文章浏览阅读8k次,点赞2次,收藏3次。类似的,设有效电流为I_电流有限值推导

推荐文章

热门文章

相关标签