ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-27 20:58:18  阅读:118  来源: 互联网

标签:11 机器 步骤 nginx 构建 镜像 docker


作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_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 

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

标签:11,机器,步骤,nginx,构建,镜像,docker
来源: https://blog.csdn.net/HiWangWenBing/article/details/122713131

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有