【Docker从入门到入土 3】Docker镜像的创建方法

Part3

  • 一、Docker镜像
    • 1.1 镜像的概念
    • 1.2 镜像结构的分层
  • 二、Docker镜像的创建
    • 2.1 基于现有镜像创建
      • 2.1.1 创建思路
      • 2.1.2 举个例子
    • 2.2 基于本地模板创建
    • 2.3 基于Dockerfile 创建
  • 三、Dockerfile 详解
    • 3.1 Dockerfile 操作指令
      • 3.1.1 常用的操作指令
      • 3.1.2 CMD和ENTRYPOINT的区别?
      • 3.1.3 ADD和COPY的区别?
    • 3.2 基于Dockerfile构建镜像的步骤
    • 3.3 基于Dockerfile创建镜像应用实例
      • Step1 建立工作目录
      • Step2 创建并编写Dockerfile文件
      • Step3 编写执行脚本
      • Step4 创建测试页面
      • Step5 使用Dockerfile生成镜像
      • Step6 使用新的镜像运行容器并测试
  • 四、如何去缩小构建镜像的大小?

一、Docker镜像

1.1 镜像的概念

镜像是创建容器的基础

镜像是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)。

1.2 镜像结构的分层

在这里插入图片描述

Docker 镜像由多个只读层组成,每个层都包含了文件系统的一部分。

这些层按照从底向上的顺序依次叠加,形成一个完整的镜像。

镜像的最底层是一个基础镜像(Base Image),上面叠加了一系列更高层的镜像,每个层都是前一个层的增量变化。

在容器启动时,Docker 引擎会将这些层通过联合文件系统合并成一个容器文件系统。

在容器运行过程中,Docker 引擎将修改操作写入一个可写层(Writeable Layer),该层仅保存容器运行时的状态和数据。

这种分层和联合文件系统的设计使得镜像的创建和传播非常高效,节省了存储空间和下载时间。

二、Docker镜像的创建

创建镜像有三种方法,分别为基于已有镜像创建基于本地模板创建以及基于Dockerfile创建

2.1 基于现有镜像创建

基于已有镜像创建主要使用 docker commit 命令。

本质上就是把一个容器里面运行的程序和该程序的运行环境打包,生成新的镜像

#基本格式
docker commit [选项] 容器ID/名称 仓库名称:[标签]##常用选项##
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。

2.1.1 创建思路

1)先用现有镜像创建启动容器 ,使用 docker run命令;

2)再进入容器进行内容更新 ,使用docker exec命令;

3)最后提交成新的镜像 ,使用 docker commit命令。

2.1.2 举个例子

首先启动一个镜像,在容器里做修改

docker create -it centos:7 /bin/bash
docker ps -a

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像

docker commit -m "new" -a "centos" 6446831c79c7 centos:testdocker image

在这里插入图片描述

2.2 基于本地模板创建

通过导入操作系统模板文件生成镜像,模板可以从 OPENVZ 开源项目下载。

下载地址为http://openvz.org/Download/template/precreated

举个例子

#下载
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

在这里插入图片描述

#导入为镜像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

在这里插入图片描述

2.3 基于Dockerfile 创建

除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。

Dockerfile是由多条的指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:基础镜像信息维护者信息镜像操作指令容器启动时执行指令

Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

三、Dockerfile 详解

3.1 Dockerfile 操作指令

3.1.1 常用的操作指令

常用指令含义
FROM指定基础镜像(是Dockerfile的第一行指令)
MAINTAINER指定镜像维护人信息(可选)
RUN指定Linux命令,如果要执行连续多条命令时建议用 ; 或 && 或 <<EOF 串起来使用
EXPOSE指定容器应用的端口
ENV设置镜像的环境变量
ADD/COPY复制文件/目录到镜像里
VOLUME指定容器的匿名数据卷
USER指定容器的运行用户
WORKDIR指定后续镜像层的工作目录
ARG指定构建镜像时传入的参数变量,docker build --build-arg 变量=值
CMD/ENTRYPOINT指定容器启动时执行的命令

3.1.2 CMD和ENTRYPOINT的区别?

共同点:都可以用来指定容器启动命令。

区别:ENTRYPOINT指定的容器启动命令优先级更高

如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用。

容器启动时运行的命令优先级
docker run --entrypoint=“命令” > 镜像里的ENTRYPOINT指定的命令 > docker run … 镜像 命令 > 镜像里的CMD指定的命令

3.1.3 ADD和COPY的区别?

共同点:都可以将本地的文件/目录复制到镜像里。

区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里。

URL下载和压缩包解压特性不能同时使用

3.2 基于Dockerfile构建镜像的步骤

在编写 Dockerfile 时,有严格的格式需要遵循

1)第一行 用FROM指令指明所用的基础镜像;

2)之后用MAINTAINER指令说明维护镜像的用户信息;

3)然后用镜像操作相关指令,比如RUN EXPOSE ENV ADD COPY 等指令,编写构建镜像的过程。每运行一条指令,都会给基础镜像添加新的一层;

4)结尾使用CMD/ENTRYPOINT指令指定容器启动时执行的命令;

5)最后使用docker build -t 新镜像名:标签 . [-f Dockerfile文件路径]命令构建镜像。

3.3 基于Dockerfile创建镜像应用实例

Step1 建立工作目录

mkdir  /opt/apache
cd  /opt/apache

Step2 创建并编写Dockerfile文件

vim Dockerfile#基于的基础镜像
FROM centos:7
#维护镜像的用户信息
MAINTAINER this is apache image <hmj>
#镜像操作指令安装apache软件
RUN yum -y update
RUN yum -y install httpd
#开启 80 端口
EXPOSE 80
#复制网站首页文件
ADD index.html /var/www/html/index.html##方法一
#将执行脚本复制到镜像中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]##方法二
ENTRYPOINT [ "/usr/sbin/apachectl" ]
CMD ["-D", "FOREGROUND"]

Step3 编写执行脚本

vim  run.shrm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

Step4 创建测试页面

echo "this is test web from byyb " > index.html
ls

在这里插入图片描述

Step5 使用Dockerfile生成镜像

docker build -t httpd:centos .   		
#注意别忘了末尾有"."

在这里插入图片描述

Step6 使用新的镜像运行容器并测试

1.使用新镜像运行容器

docker run -d -p 1216:80 httpd:centos

在这里插入图片描述

docker ps -a 

在这里插入图片描述

2.测试

firefox http://192.168.2.106:1216

在这里插入图片描述

四、如何去缩小构建镜像的大小?

1)尽可能的采用小体积的基础镜像

2)尽可能的减少Dockerfile指令的数量

3)在RUN指令里添加安装软件后清空yum/apt缓存、软件包的命令

4)使用多级(多阶段)构建的方法 。

FROM 第一阶段的基础镜像 AS 别名
......
FROM 第二阶段的基础镜像
COPY --from=别名  第一阶段构建的文件/目录  当前阶段的路径.....
CMD/ENTRYPOINT 指定容器启动时执行的命令

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/145608.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙软件开发】文本显示(Text/Span)

文章目录 前言一、Text控件1.1 创建文本string字符串引用Resource资源 1.2 添加子组件创建Span文本装饰线和样式文本装饰线设置文字一直保持大写/小写添加事件。 1.3 自定义文本样式文本对齐长文本处理设置行高通过decoration属性设置文本装饰线样式及其颜色。通过baselineOffs…

STM32入门F4

学习资料&#xff1a;杨桃电子&#xff0c;官网&#xff1a;洋桃电子 | 杜洋工作室 www.doyoung.net 1.为什么要学F407 STM32F103系列与STM32F407系列对照表&#xff1a; 2.F4系列命名与封装 STM32全系列分类图&#xff1a; STM32F4系列&#xff1a;STM32F4 MCU高级系列具有从…

032-第三代软件开发-Popup弹窗

第三代软件开发-Popup弹窗 文章目录 第三代软件开发-Popup弹窗项目介绍Popup弹窗官方示例项目中的代码 之前写过一个Popup抄抄别人的dimvisible 和 Open 区别 与 Dialog有啥区别其他总结一下 关键字&#xff1a; Qt、 Qml、 Popup、 弹窗、 modal 项目介绍 欢迎来到我们的…

从一个webpack loader中学习

chalk&#xff1a;给终端输出加一些自定义的样式 loader-utils&#xff1a;webpack的loader配置中会通过options传入一些用户自定义参数&#xff0c;就可以通过该包提供的getoptions()获取 node-fetch&#xff1a;Node.js的模块&#xff0c;用于从远程服务器获取数据 关于bab…

【扩散模型】【文本到音频论文系列翻译二】使用指令微调LLM和潜在扩散模型的文本到音频生成

&#x1f525; &#x1f525;&#x1f525; github: https://github.com/declare-lab/tango 效果&#xff1a;https://tango-web.github.io/ 论文地址&#xff1a;https://arxiv.org/pdf/2304.13731.pdf 数据集audiocaps下载&#xff1a; https://blog.csdn.net/weixin_4350969…

朋友圈推广如何做?

为什么在朋友圈做推广是如此重要&#xff0c;以及如何充分利用这个平台来推动你的业务增长。 不仅仅是分享生活点滴&#xff0c;朋友圈也可以成为你的事业起飞的跳板。快来了解一下吧&#xff01; 为什么在朋友圈做推广&#xff1f; 1、人脉力量&#xff1a;朋友圈是一个连接…

谷歌云的利润增长才刚刚开始

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;自从Google Cloud(谷歌云&#xff09;今年开始盈利以来&#xff0c;投资者都在怀疑这种盈利能力能否持续下去。 &#xff08;2&#xff09;虽然微软Azure目前在全球的人工智能竞…

我试图扯掉这条 SQL 的底裤。只能扯一点点,不能扯多了

之前不是写分页嘛,分页肯定就要说到 limit 关键字嘛。 然后我啪的一下扔了一个链接出来: https://dev.mysql.com/doc/refman/8.0/en/limit-optimization.html 这个链接就是 MySQL 官方文档,这一章节叫做“对 Limit 查询的优化”,针对 limit 和 order by 组合的场景进行了较…

XPS测试基本理论-科学指南针

1、XPS是什么鬼? 通过收集在入射X光作用下&#xff0c;从材料表面激发的电子能量、角度、强度等信息对材料表面进行定性、定量和结构鉴定的表面分析方法。 一般以Al、Mg作为X射线的激发源&#xff0c;俗称靶材。 2、XPS测试深度是多少? 由于电子穿过材料需要消耗能量&…

算法刷题-链表

算法刷题-链表 203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5]…

vue3如何实现页面跳转?

首先、给元素绑点击事件 其次 写跳转路由 总结&#xff1a;一定不要忘了引入Router

【JVM系列】- 探索·运行时数据区的私有结构

探索运行时数据区的私有结构 文章目录 探索运行时数据区的私有结构运行时数据区的结构与概念认识线程了解守护线程和普通线程JVM系统线程 程序计数器&#xff08;PC寄存器&#xff09;概述PC寄存器的特点PC寄存器的作用 透过案例了解寄存器为什么需要用PC寄存器来存放字节码的指…