[云原生专题-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.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
[云原生专题-11]:容器 - 如何构建自己的docker镜像:Docker Dockerfile相关推荐
- [云原生专题-16]:容器 - 在Windows主机上搭建Docker环境
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- 【云原生进阶之容器】第一章Docker核心技术1.6节——UnionFS
<重识云原生系列>专题各章首节索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第三章云存储第1节--分布式云存储总述 第四章云网络第一节--云网络技术发展简 ...
- 【云原生进阶之容器】第二章Controller Manager原理2.8节--Resync机制
<重识云原生系列>专题各章首节索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第三章云存储第1节--分布式云存储总述 第四章云网络第一节--云网络技术发展简 ...
- 《云原生入门级开发者认证》学习笔记之云原生基础设施之容器技术
写在前面 嗯,报了考试,整理课堂笔记记忆 学习的原因: 虽然考了CKA,了解了一些K8s相关的知识 但是对云原生整个体系一直都很模糊 希望对云原生有一个基本的认识 通过学习实现云原生相关入门 博文主要 ...
- Go 开源说第十一期:KubeSphere-面向云原生应用的容器混合云
点击蓝字 关注我们 本文由"GO开源说"第十一期 <KubeSphere-面向云原生应用的容器混合云>直播内容修改整理而成,视频内容较长,本文内容有所删减和重构. Ku ...
- 【华为云原生入门级认证】第 2 章 云原生基础设施之容器技术
云原生 第2章 云原生基础设施之容器技术 2.1 容器发展背景 企业 IT 业务云化路径 - 传统业务云化 方式一:物理机部署,统一管理 特征: 业务无法云化部署,物理资源搬迁或纳管到云平台资源池. ...
- [云原生专题-18]:容器 - docker自带的集群管理工具swarm - 手工搭建集群服务全过程详细解读
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- [云原生专题-9]:容器 - Docker的启动与关闭:run、stop
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...
- 【云原生之企业级容器技术 Docker实战一】Docker 介绍
目录 一.Docker 介绍 1.1 容器历史 1.2 Docker 是什么 1.3 Docker 和虚拟机,物理主机 1.4 Docker 的组成 1.5 Namespace 1.6 Control ...
- 云原生高可用技术体系构建
伴随着互联网业务的高速发展,越来越多的线下场景需要转移到线上,而线上业务的量级也在飞速增长,给互联网业务的技术架构带来了严峻的挑战,原来的"一体机+数据库"的方式已经不适用于当前的 ...
最新文章
- Oracle 高性能SQL引擎剖析----执行计划
- jsx后缀的是什么文件_React-从JSX到虚拟DOM
- 快速弄懂陌生领域是一项“赚钱”的能力
- 二叉树先序遍历,中序遍历,后序遍历,层次遍历学习总结及完整C/C++代码
- so库文件控制导出符号
- python元组和集合的区别_python 元组与list的区别
- python 输入华氏温度f_如何用 python编写华氏摄氏度的相互转换?
- MS08-067漏洞渗透测试
- 基于SNN脉冲神经网络的Hebbian学习训练过程matlab仿真
- cubic 插值和 bicubic,pytorch, opencv和matlab的实现差异
- 音乐播放器app android,mp3音乐播放器
- tf改善_如何衡量和改善自动常见问题解答
- go:embed 的使用
- python爬取招聘网站源码及数据分析_如何用爬虫抓取招聘网站的职位并分析
- python在电脑上下载哔哩哔哩视频
- 2019年全球卫星遥感行业现状、融资及卫星遥感行业发展趋势分析:即时化、网络化、个性化、多样化(转载)
- 赶紧收下这四个安卓手机通讯录丢失怎么恢复的技巧吧
- 大学人机交互课小组作业(刚入坑菜鸟一枚,求别喷吼吼)
- hiho一下 第139周 《买零食》 多维01背包
- 文佳夹操作之获取指定目录下的所有文件及文件夹