[云原生1.] Docker镜像的创建

news2024/12/27 12:21:04

文章目录

  • 1. Docker镜像概述
    • 1.1 简介
    • 1.2 镜像结构的分层详解
  • 2. 创建Docker镜像的方法类别
    • 2.1 基于已有镜像创建
      • 2.1.1 创建流程
      • 2.1.2 示例
    • 2.2 基于本地模板创建
      • 2.2.1 示例
    • 2.3 基于Dockerfile 创建
  • 3. 联合文件系统(UnionFS)
    • 2.1 简介
    • 2.2 特性
  • 4. Dockerfile的详细介绍
    • 4.1 常用相关操作命令
      • 4.1.1 命令选项
      • 4.1.2 CMD 和 ENTRYPOINT 的区别
      • 4.1.3 ADD 和 COPY 的区别
    • 4.2 Dockerfile镜像的构建步骤
    • 4.3 示例
      • 4.3.1 建立工作目录
      • 4.3.2 创建并编写Dockerfile文件
      • 4.3.3 编写执行脚本
      • 4.3.4 创建测试页面
      • 4.3.5 使用Dockerfile生成镜像
      • 4.3.6 使用新的镜像运行容器并测试
      • 4.3.7 测试
  • 5. 如何缩小镜像的体积大小?

1. Docker镜像概述

1.1 简介

镜像是创建容器的基础

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

1.2 镜像结构的分层详解

在这里插入图片描述
Docker 镜像由多个只读层组成,每个层都包含了文件系统的一部分。

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

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

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

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

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

2. 创建Docker镜像的方法类别

创建镜像有三种方法,分别为

  • 基于已有镜像创建
  • 基于本地模板创建
  • 基于Dockerfile创建。

2.1 基于已有镜像创建

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

#基本格式
docker commit [选项] 容器ID/名称 仓库名称:[标签]

##常用选项##
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。

2.1.1 创建流程

先用现有镜像创建启动容器 docker run
再进入容器进行内容更新 docker exec
最后提交成新的镜像 docker commit

2.1.2 示例

#首先启动一个镜像,在容器里做修改
docker create -it centos:7 /bin/bash

docker ps -a
#查看当前容器

在这里插入图片描述

#然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像
docker commit -m "new" -a "centos" a733d9ef8f01  centos:test

docker images

在这里插入图片描述

2.2 基于本地模板创建

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

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

2.2.1 示例

#从网站下载
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每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

3. 联合文件系统(UnionFS)

2.1 简介

Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
AUFSOverlayFSDevicemapper 都是一种 UnionFS

Union文件系统是Docker镜像的基础
镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

2.2 特性

一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

#示例
docker pull nginx

在这里插入图片描述

4. Dockerfile的详细介绍

4.1 常用相关操作命令

4.1.1 命令选项

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

4.1.2 CMD 和 ENTRYPOINT 的区别

  • 共同点:都可以用来指定容器启动命令
  • 区别:ENTRYPOINT指定的容器启动命令优先级更高,如果CMDENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用
#容器启动时运行的命令优先级
docker run --entrypoint="命令" > 镜像里的ENTRYPOINT指定的命令 > docker run ... 镜像 命令 > 镜像里的CMD指定的命令

4.1.3 ADD 和 COPY 的区别

  • 共同点:都可以将本地的文件/目录复制到镜像里
  • 区别:ADD还可以通过URL下载文件复制到镜像里,还能将本地的压缩包解压后复制到镜像里(URL下载和压缩包解压特性不能同时使用)

4.2 Dockerfile镜像的构建步骤

  1. 先在第一行用 FROM 指令指定基础镜像
  2. 还可以再用 MAINTAINER 指定镜像维护人信息(可跳过)
  3. 之后用 RUN EXPOSE ENV ADD COPY 等指令编写构建镜像的过程
  4. 结尾用 CMD/ENTRYPOINT 指定容器启动时执行的命令
  5. 最后用 docker build -t 新镜像名:标签 . [-f Dockerfile文件路径] 命令构建镜像

4.3 示例

4.3.1 建立工作目录

mkdir  /opt/apache
cd  /opt/apache

4.3.2 创建并编写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"]

4.3.3 编写执行脚本

vim  run.sh

rm -rf /run/httpd/*							#清理httpd的缓存
/usr/sbin/apachectl -D FOREGROUND			#指定为前台运行

#因为Docker容器仅在它的1号进程(PID为1)运行时,会保持运行。如果1号进程退出了,Docker容器也就退出了。

4.3.4 创建测试页面

echo "this is test web" > index.html

在这里插入图片描述

4.3.5 使用Dockerfile生成镜像

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

在这里插入图片描述

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

#使用新镜像运行容器
docker run -d -p 1216:80 httpd:centos

在这里插入图片描述

docker ps -a

在这里插入图片描述

#######如果有网络报错提示########
[Warning] IPv4 forwarding is disabled. Networking will not work.

解决方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1

sysctl -p
systemctl restart network
systemctl restart docker

4.3.7 测试

http://192.168.67.100:1216

在这里插入图片描述

5. 如何缩小镜像的体积大小?

  1. 尽可能的采用小体积的基础镜像
  2. 尽可能的减少Dockerfile指令的数量
  3. 在RUN指令里添加安装软件后清空yum/apt缓存、软件包的命令
  4. 使用多级(多阶段)构建的方法
FROM 第一阶段的基础镜像 AS 别名
......
FROM 第二阶段的基础镜像
COPY --from=别名  第一阶段构建的文件/目录  当前阶段的路径
.....
CMD/ENTRYPOINT 指定容器启动时执行的命令

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生-AWS EC2使用、安全性及国内厂商对比

目录 什么是EC2启动一个EC2实例连接一个实例控制台ssh Security groups规则默认安全组与自定义安全组 安全性操作系统安全密钥泄漏部署应用安全元数据造成SSRF漏洞出现时敏感信息泄漏网络设置错误 厂商对比参考 本文通过实操&#xff0c;介绍了EC2的基本使用&#xff0c;并在功…

【排序算法】 归并排序详解!分治思想!

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; 算法—排序篇 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言&#x1f324;️归并排序的思想☁️基本思想☁️归并的思想实现☁️分治法 &#x1f3…

并发编程 -常用并发设计模式

1. 优雅终止线程的设计模式 思考&#xff1a;在一个线程 T1 中如何优雅的终止线程 T2&#xff1f; 错误思路1&#xff1a;使用线程对象的 stop() 方法停止线程 stop 方法会真正杀死线程&#xff0c;如果这时线程锁住了共享资源&#xff0c;那么当它被杀死后就再也没有机会释 …

C/C++角谷猜想 2020年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C角谷猜想 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C角谷猜想 2020年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 所谓角谷猜想&#xff0c;是指对于任意一个正整数&…

windows电脑安装系统后固态硬盘和机械硬盘的盘符号顺序显示错乱,解决方法

一、场景 由于电脑磁盘是SSD固态硬盘自己拓展的1T机械硬盘组成&#xff0c;固态硬盘分为C、D两个盘区&#xff0c;机械硬盘分为E、F两个盘区。为了提升运行速度&#xff0c;系统安装在C盘&#xff0c;安装完成后按照习惯盘区顺应该为C、D、E、F&#xff0c;但实际情况却是D、E…

剑指offer --- 二维数组中的元素查找

目录 一、读懂题目 二、思路分析 三、代码呈现 总结 一、读懂题目 题目&#xff1a; 在一个二维数组中&#xff0c;每一行都按照从左到右递增的顺序排序&#xff0c;每一列都按照从上到下递增的顺序排序。请完成一个函数&#xff0c;输入这样的个二维数组和一个整数&#…

用baostock库获取沪深300成分股

先看效果&#xff1a; 代码&#xff0c;bs_get_hs300.py import baostock as bs import pandas as pd# 登陆系统 lg bs.login() # 显示登陆返回信息 print(login respond error_code:lg.error_code) print(login respond error_msg:lg.error_msg)# 获取沪深300成分股 rs bs…

Android开发工具介绍(adb、AVD、DDMS)

目录 1. adb 1.1 查看设备 1.2 安装软件 1.3 卸载软件 1.4 登录设备 shell 1.5 从计算机上发送文件到目标机 1.6 从目标机上下载文件到计算机 1.7 显示帮助信息 2. AVD 2.1 AVD 的创建 2.2 启动 AVD 模拟器 3. DDMS 3.1 DDMS的启动方法 3.2 DDMS 工…

H5游戏源码分享-密室逃脱小游戏(考验反应能力)

H5游戏源码分享-密室逃脱小游戏&#xff08;考验反应能力&#xff09; 预判安全位置&#xff0c;这个需要快速的反应能力 源码 <!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetutf-8" /&…

WEB登录设备控制台异常——TLS协议问题

问题描述&#xff1a;登录设备web控制台浏览器报错&#xff0c;切换其他浏览器也有问题。 出现这个问题&#xff0c;大概率是网站支持的TLS协议很低&#xff0c;而浏览器的TLS协议很高&#xff0c;那么就是是降浏览器的TLS版本。 解决步骤&#xff1a; 1、火狐浏览器地址栏输…

DbVisualizer和DBeaver启动不来,启动报错

启动报错 大多数启动报错都是因为你没有用管理员身份运行程序&#xff0c;提示的错误都是八竿子打不着的什么jdk、jvm问题。 比如DbVisualizer提示什么jvm配置参数&#xff0c;实际dbvis.exe 用管理员身份打开即可&#xff08;右键 dbvis.exe->属性->兼容性->勾上 “…

计算机毕业设计选题推荐-社区志愿者服务微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Android View 的绘制流程之 Measure 过程详解

由于 performTraversals 方法比较长&#xff0c;看一个简化版&#xff1a; // ViewRootImpl 类 private void performTraversals() {// 这个方法代码非常多&#xff0c;但是重点就是执行这三个方法// 执行测量performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);…

[EFI]asus strix b760-i 13900F电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 asus strix b760-i 处理器 I9 13900F 已驱动内存crucial ddr5-5200 64gb(32gb*2)(overclock 5600)已驱动硬盘 WD black sn850 500g*2 已驱动显卡rx570已驱动声卡Realtek ALCS1220A已驱动网卡Intel I225-V 2.5 Gigabit Ethernet已驱动无线网卡蓝牙Fevi T91…

Spring Cloud之Gateway网关学习【详细】

目录 统一网关Gateway 网关的实现 搭建网关 编写配置文件 路由断言工程 路由的过滤器 全局过滤器 网关过滤器执行顺序 网关的cors跨域配置 问题及解决 统一网关Gateway 网关的实现 SpringCloud中存在两种网关 gateway&#xff1a;基于Spring5中提供的WebFlux实现&a…

[AUTOSAR][诊断管理][ECU][$28] 通信控制

文章目录 一、简介二、 应用场景三、通信控制基本原理四、服务请求请求格式请求实例服务响应正响应格式负响应NRC支持五、常见Bug大揭秘六、示例代码28_comm_ctl.c一、简介 根据ISO14119-1标准中所述,诊断服务28服务主要用于网络中的报文发送与接受,比如控制应用报文的发送与…

java支持3种网络编程模型,以及在web项目中的应用

之前有总结过linux中的5种IO模型 https://blog.csdn.net/weixin_45068892/article/details/127424119 本次主要讲一下java中支持的IO模型。 Java共支持3种网络编程IO模式&#xff0c;及应用场景 BIO NIO AIO https://blog.csdn.net/CSDN_GIA/article/details/128535848 BIO…

idea:解决jsp request.getParameter爆红的问题

文章目录 1. 复现错误2. 分析问题3. 解决问题 1. 复现错误 今天在写jsp代码时&#xff0c;出现如下错误&#xff1a; 2. 分析问题 这是没有引入相关jsp的相关jar包引起的。 我们可按如下步骤&#xff0c;引入jsp的相关jar包。 3. 解决问题 File -> Project Structure -&g…

【Truffle】二、自定义合约测试

一、准备测试 上期我们自己安装部署了truffle&#xff0c;并且体验了测试用例的整个测试流程&#xff0c;实际开发中&#xff0c;我们可以对自己的合约进行测试。 我们首先先明白自定义合约测试需要几个文件 合约文件&#xff1a;既然要测试合约&#xff0c;肯定要有合约的源码…

vue3 Teleport组件

<Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层 的位置去。 <template><el-button click"dialogVisible true">打开弹窗</el-button><el-dialogv-model"dialogVisible&…