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

作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址: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的修改、保存、共享_文火冰糖(王文兵)的博客-CSDN博客

第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不会自己默认这行拷贝操作。
【云原生专题|[云原生专题-11](容器 - 如何构建自己的docker镜像:Docker Dockerfile)】
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.0RUN 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支持的各种命令,从无到有的构建镜像。
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客
本文网址:https://blog.csdn.net/HiWangWenBing/article/details/122713131

    推荐阅读