Docker容器引擎镜像创建
目录
一、镜像的创建
(一)基于现有镜像创建
1.启动一个镜像,在容器里做修改
2.将修改后的容器提交为新的镜像
(二)基于本地模板创建
(三)基于Dockerfile 创建
1.联合文件系统(UnionFS)
(1)定义
(2)特性
2.镜像加载原理
3.为什么Docker里的centos的大小才200M?
4.Dockerfile
(1)概述定义
(2)结构
5.Docker 镜像结构的分层
6.Dockerfile 操作常用的指令
7.编写 Dockerfile 的格式
8.ADD 和 COPY 的区别
(1)共同点
(2)区别
9.CMD 和 ENTRYPOINT 的区别
(1)共同点
(2)区别
10.容器启动命令的优先级
二、Dockerfile案例
(一)nginx yum安装模板
1.建立工作目录
2.给目录下添加nginx yum源
3.编写dockerfile文件
3.生成镜像
4.准备网站页面
(二)nginx编译安装模板
1.上传安装包
2.编写Dockerfile文件
3.生成镜像
4.创建容器
5.访问浏览器测试
(1)在容器中添加网页测试页面
(2)退出容器修改网页测试页面
一、镜像的创建
(一)基于现有镜像创建
1.启动一个镜像,在容器里做修改
docker run -dit --name test01 centos:7 /bin/bash
docker ps -a

2.将修改后的容器提交为新的镜像
需要使用该容器的 ID 号创建新镜像
docker commit -m "new" -a "centos" 36163e2d38c1 centos:test
#常用选项:
-m 说明信息;
-a 作者信息;
-p 生成过程中停止容器的运行。docker images
docker inspect centos:test


(二)基于本地模板创建
通过导入操作系统模板文件可以生成镜像,模板可以从 OPENVZ 开源项目下载,下载地址为http://openvz.org/Download/template/precreated
docker export -o centos test01
docker import centos centos:test01

(三)基于Dockerfile 创建
1.联合文件系统(UnionFS)
(1)定义
- Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、OverlayFS 及 Devicemapper 都是一种 UnionFS。
- Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
(2)特性
- 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
- 我们下载的时候看到的一层层的就是联合文件系统。

2.镜像加载原理
- Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS。
- bootfs主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。
- 在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
- rootfs,在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
- 我们可以理解成一开始内核里什么都没有,操作一个命令下载debian,这时就会在内核上面加了一层基础镜像;再安装一个emacs,会在基础镜像上叠加一层image;接着再安装一个apache,又会在images上面再叠加一层image。最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。
3.为什么Docker里的centos的大小才200M?
因为对于精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
4.Dockerfile
(1)概述定义
- Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
- 镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。
- Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile上添加或者修改指令,重新生成 image 即可, 省去了敲命令的麻烦。
- 除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。Dockerfile是由多条的指令组成的文件,其中每条指令对应 Linux 中的一条命令,Docker 程序将读取Dockerfile 中的指令生成指定镜像。
(2)结构
- Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
- Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。
5.Docker 镜像结构的分层
镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。
- Dockerfile 中的每个指令都会创建一个新的镜像层;
- 镜像层将被缓存和复用;
- 当Dockerfile 的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;
- 某一层的镜像缓存失效,它之后的镜像层缓存都会失效;
- 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在 Docker 容器中不可见了。
6.Dockerfile 操作常用的指令
| 指令 | 作用 |
| FROM | 指定基础镜像(是Dockerfile的第一行指令) |
| MAINTAINER | 指定镜像维护人信息(可选) |
| RUN | 指定linux命令,尽量将多条linux命令合并在一个RUN指令里,用 ; 或 && 或 <<EOF 串起来使用 |
| EXPOSE | 指定容器要开启的应用的端口号 |
| ENV | 指定容器的环境变量 |
| ADD/COPY | 复制本地文件/目录到镜像里 |
| VOLUME | 指定容器的匿名数据卷(作用类似于 docker run -v /var/lib/docker/volumes/容器ID/:容器数据卷目录) |
| USER | 指定容器的运行用户 |
| WORKDIR | 指定后续镜像层的工作目录 |
| ARG | 指定构建镜像时传入的参数变量(可通过 "docker build --build-arg 变量=值" 进行传入参数) |
| CMD/ENTRYPOINT | 指定容器启动时执行的命令和参数 |
7.编写 Dockerfile 的格式
- 第一行必须使用 FROM 指令指明所基于的镜像名称;
- 之后使用 MAINTAINER 指令说明维护该镜像的用户信息;
- 然后是镜像操作相关指令,如 RUN 指令。每运行一条指令,都会给基础镜像添加新的一层。
- 最后使用 CMD 指令指定启动容器时要运行的命令操作。
8.ADD 和 COPY 的区别
(1)共同点
- 都可以将本地的文件|目录复制到镜像里
(2)区别
- ADD还可以通过URL地址下载文件并复制到镜像里,还能将本地的压缩包解压后再复制到镜像里(URL下载和压缩包解压特性不能同时生效)
- 即通过URL下载的压缩包只能以压缩包的形式复制到镜像里
9.CMD 和 ENTRYPOINT 的区别
(1)共同点
- 都可以用来指定容器的启动命令
(2)区别
- ENTRYPOINT指定的容器启动命令优先级更高,如果CMD和ENTRYPOINT同时存在,那么CMD指定的内容将作为ENTRYPOINT指定的容器启动命令的选项或参数使用
10.容器启动命令的优先级
docker run --entrypoint="命令" > 镜像里的ENTRYPOINT指令指定的"命令" > docker run .... 镜像 "命令" > 镜像里的CMD指令指定的"命令"
二、Dockerfile案例
(一)nginx yum安装模板
1.建立工作目录
mkdir /opt/nginx
cd /opt/nginx

2.给目录下添加nginx yum源
cd /etc/yum.repos.d
vim nginx.repo[nginx]name=nginx repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true


3.编写dockerfile文件
vim Dockerfile
#指定基础镜像
FROM centos:7#指定维护人信息
MAINTAINER this is nginx image by yum install <yy 20240125>#编写构建镜像过程
COPY nginx.repo /etc/yum.repos.d/RUN yum install -y nginxEXPOSE 80
#EXPOSE 443 CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

3.生成镜像
docker build -t nginx:zk . #表示将此路径下的文件导入成模板########如果有网络报错提示########
解决方法:
vim /etc/sysctl.conf
net.ipv4.ip_forward=1sysctl -p
systemctl restart network
systemctl restart docker


4.准备网站页面
docker exec -it dee3a2db17d4 bash
cd /usr/share/nginx/html
echo "this is test web" > test.html浏览器访问172.16.72.80:1216/test.html


(二)nginx编译安装模板
1.上传安装包

2.编写Dockerfile文件
vim DockerfileFROM centos:7ADD nginx-1.24.0.tar.gz /opt/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ make && \yum clean all && \useradd -M -s /sbin/nologin nginx && \cd /opt/nginx-1.24.0/ && \./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && \make && make installENV PATH=$PATH:/usr/local/nginx/sbinEXPOSE 80
#EXPOSE 443ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]CMD ["-g", "daemon off;"]

3.生成镜像
docker build -t nginx:kk .

4.创建容器
用此镜像模版创建容器,并挂载到宿主机指定目录下
docker run -d -P -v /opt/nginx/html:/usr/local/nginx/html/ nginx:kk
docker ps -a

5.访问浏览器测试
(1)在容器中添加网页测试页面
docker exec -it 6803785b4a27 bash
cd /usr/local/nginx/html
echo "this is test web2" > test.html浏览器访问172.16.72.80:32769/test.html


(2)退出容器修改网页测试页面


相关文章:
Docker容器引擎镜像创建
目录 一、镜像的创建 (一)基于现有镜像创建 1.启动一个镜像,在容器里做修改 2.将修改后的容器提交为新的镜像 (二)基于本地模板创建 (三)基于Dockerfile 创建 1.联合文件系统(…...
布尔逻辑与逻辑门
计算机为什么使用二进制: 计算机的元器件晶体管只有 2 种状态,通电(1)& 断电(0),用二进制可直接根据元器件的状态来设计计算机。而且,数学中的“布尔代数”分支,可以…...
opencv-python计算视频光流
光流基本概念 光流表示的是相邻两帧图像中每个像素的运动速度和运动方向。具体:光流是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系…...
Spring 中获取 Bean 对象的三种方式
目录 1、根据名称获取Bean 2、根据Bean类型获取Bean 3、根据 Bean 名称 Bean 类型来获取 Bean(好的解决方法) 假设 Bean 对象是 User,并存储到 Spring 中,注册到 xml 文件中 public class User {public String sayHi(){retur…...
centos系统安装Ward服务器监控工具
简介 Ward是一个简约美观多系统支持的服务器监控面板 安装 1.首先安装jdk yum install java-1.8.0-openjdk-devel.x86_64 2.下载jar wget 3.启动 java -jar ward-1.8.8.jar 体验 浏览器输入 http://192.168.168.110:4000/ 设置服务名设置为:myserver 端口号:5000 点击…...
计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )
文章目录 为什么要数据交换?总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…...
【C++入门到精通】特殊类的设计 | 单例模式 [ C++入门 ]
阅读导航 引言一、设计模式概念(了解)二、单例模式1. 饿汉模式(1)概念(2)模拟实现(3)优缺点(4)适用场景 2. 懒汉模式(1)概念ÿ…...
【创建vue项目的两种方式】
Vue环境搭建 NodeJs安装包安装淘宝镜像 环境搭建webpack安装全局安装vue/cli查看模板创建项目1.webpack2. vue-cli NodeJs安装包 下载链接:官网链接 下载下来后,直接傻瓜式的安装即可。 通过在cmd控制台输入以下命令查看是否安装成功 node -v因为适配某…...
2. HarmonyOS应用开发DevEcoStudio准备-1
2. HarmonyOS应用开发DevEcoStudio准备-1 下载 DevEco Studio 进入HUAWEI DevEco Studio产品页产品页。 单击下载列表右侧的按钮,下载 DevEco Studio。 安装 DevEco Studio 下载完成后,双击下载的 deveco-studio-xxxx.exe,进入 DevEco St…...
《二叉树》——3(层序遍历)
目录 前言: 层序遍历: 解析: 前言: 本文主讲链式二叉树的层序遍历,在前面的张篇blog我们初步实现了链式二叉树递归部分的内容,对于递归算法的学习和思维方式我们仍然需要不断加强,所以将对链式二叉树进行…...
HarmonyOS应用开发者基础认证考试答案
HarmonyOS应用开发者基础认证考试答案 一、判断题 1.Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(True) 2.所有使用Component修饰的自定义组件都支持onPageShow,onBackPress和onPageHide…...
【前端素材】bootstrap3 实现地产置业公司source网页设计
一、需求分析 地产置业公司的网页通常是该公司的官方网站,旨在向访问者提供相关信息和服务。这些网页通常具有以下功能: 公司介绍:网页通常包含有关公司背景、历史、核心价值观和使命等方面的信息。此部分帮助访问者了解公司的身份和目标。 …...
C++ 数论相关题目 博弈论 Nim游戏
给定 n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。 问如果两人都采用最优策略,先手是否必胜。 输入格式…...
机器学习---无偏估计
1. 如何理解无偏估计 无偏估计:就是我认为所有样本出现的概率⼀样。 假如有N种样本我们认为所有样本出现概率都是 1/N。然后根据这个来计算数学期望。此时的数学期望就是我们平常讲 的平均值。数学期望本质就 是平均值。 2. 无偏估计为何叫做“无偏”࿱…...
C语言基础13
今天是学习嵌入式相关内容的第十四天,以下是今日所学内容 1.结构体: 1.结构体类型定义 2.结构体变量的定义 3.结构体元素的访问 4.结构体的存储 内存对齐 结构体整体的大小必须为最大基本类型长度的整数倍 5.结构体作为函数参数 值传递 练习:定…...
【Java】Maven配置加载到全局
Maven配置加载到全局 <build><plugins><plugin><artifactId>maven-resources-plugin</artifactId><configuration><encoding>utf-8</encoding><useDefaultDelimiters>true</useDefaultDelimiters></configura…...
右手螺旋线定则
通电螺线管中的安培定则(安培定则二):用右手握住通电螺线管,让四指指向电流的方向,那么大拇指所指的那一端是通电螺线管的N极。...
2024 高级前端面试题之 React 「精选篇」
该内容主要整理关于 React 模块的相关面试题,其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 React模块精选篇 1. 如何理解React State不可变性的原则2. JSX本质3. React合成事件机制4. setState和batchUpdate机制5. 组件渲染和更新过程6. Diff算法相…...
OSPF协议解析及相关技术探索(C/C++代码实现)
OSPF(开放最短路径优先)是一种用于自治系统(AS)内部的路由协议,它是基于链路状态算法的。OSPF的设计目的是为了提供一种可扩展、快速收敛和高效的路由解决方案。 OSPF概念和特点 概念 自治系统(AS&#…...
如何恢复已删除的照片?
在这篇综合文章中发现恢复丢失照片的有效且免费的方法。无论您使用的是智能手机、iPhone、Windows 计算机、Mac、SD 卡还是数码相机,我们都提供有关如何恢复已删除照片的分步说明。此外,学习一些有价值的技巧,以防止将来意外删除照片。 意外…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
