[云原生专题-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不会自己默认这行拷贝操作。

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支持的各种命令,从无到有的构建镜像。


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

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

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值