[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile

网友投稿 230 2022-10-22

[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

​目录​

​​前言:​​

​​第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 nginxRUN 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 centosRUN yum -y install wget \ && wget -O redis.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 "-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.0RUN curl -SLO "\ && curl -SLO "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支持的各种命令,从无到有的构建镜像。

作者主页(​​文火冰糖的硅基工坊​​​):​​文火冰糖(王文兵)的博客_文火冰糖的硅基工坊​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[云原生专题-10]:容器 - Docker的修改、保存、共享:commit、save、load、-v
下一篇:mybatis定义sql语句标签之delete标签解析
相关文章

 发表评论

暂时没有评论,来抢沙发吧~