Docker笔记 Dockerfile镜像原理以及制作镜像

news2024/11/23 21:42:52

1. Docker 镜像原理

思考:

  • Docker镜像本质是什么?
    答:是一个分层的文件系统。
  • Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
    答:Centos的iso镜像包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层。
  • Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
    答:由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖父镜像和基础镜像,所以整个对外暴露的tomcat镜像大小500MB。

首先要了解操作系统的组成部分当中,有个很重要的部分叫文件管理子系统
那么我们所用的docker是基于centos,或者说基于linux,所以在这里以linux的文件管理子系统做阐述

Linux文件系统由bootfsrootfs俩部分组成
在这里插入图片描述

  • bootfs:包含bootloader(引导加载程序)和kernel(内核)
  • rootfs:root文件系统,包含的就是典型linux系统中的/dev,/proc,/bin,/etc等标准目录和文件
  • 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

在了解了bootfs和rootfs之后,我们可以知道Docker镜像是由特殊的文件系统叠加而成

  • 如何叠加?
  1. 最低端是bootfs,并使用宿主机的bootfs,意思就是镜像使用的是宿主机的内核
  2. 第二层是root文件系统rootfs,称为base image
  3. 然后再往上可以叠加其他的镜像文件
  4. 统一文件系统技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
  5. 一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像,成为基础镜像。

以tomcat镜像为例:
在这里插入图片描述
所以tomcat镜像为什么有500MB原因就是用户只看到了tomcat镜像,看不到具体的细节,在这个tomcat镜像的背后还隐藏着200多MB的JDK和rootfs基础镜像


2. Docker 镜像制作

1. 容器转为镜像

#容器转为镜像
docker commit 容器id 镜像名称:版本号

#将镜像转为压缩文件
docker save -o 压缩文件名称 镜像名称:版本号

#将压缩文件还原为镜像
docker load -i 压缩文件名称

在这里插入图片描述
注:在原容器转为镜像之后,目录挂载会失效

2. dockerfile

概念:

  • Dockerfile是一个文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,属于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿着开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝移植

2.1 Dockerfile常用指令

(1) FROM 指定基础镜像

FROM centos 

(2)MAINTAINER 指定镜像的维护者信息,一般为邮箱

MAINTAINER hitredrose@163.com

(3)RUN 镜像构建时需要执行的命令

RUN yum install -y wget

(4)ADD 增加文件,会自动解压

ADD python.tar.gz /usr/local/

(5)WORKDIR 设置当前工作目录

WORKDIR /usr/local/python/

(6)VOLUME 挂载主机目录

VOLUME ["/usr/local/python","/usr/local/java/"]

(7)EXPOSE 暴露端口,注意这里指仅暴露容器的端口,并不会将容器端口与宿主机端口映射。也就是说在使用docker run的时候仍然需要继续使用-p进行端口映射,换言之,EXPOSE更多的作用在于给Dockerfile开发者提供开发端口的提示提示作用

EXPOSE 80

(8)CMD 指定容器启动的时候需要执行的命令,注意CMD只有最后一个命令会生效

CMD /bin/bash

(9)ENTRYPOINT 指定容器启动时需要运行的命令,注意ENTRYPOINT命令可以追加命令,即如果有多条ENTRYPOINT命令会全部执行,这是ENTRYPOINT命令和CMD命令最大的区别

ENTRYPOINT cd /opt
ENTRYPOINT /bin/bash

(10)ONBUILD 当构建一个被继承Dockerfile,这个时候就会运行ONBUILD指令

(11)COPY 类似ADD命令,将文件拷贝到镜像中

(11)ENV 构建的时候设置环境变量

2.2 Dockerfile实战测试

  1. 编写如下Dockerfile文件,创建自己的centos镜像
FROM centos
MAINTAINER redrose2100<hitredrose@163.com>
ENV JAVA_HOME /usr/local/jdk_1.8/
WORKDIR /usr/local
RUN yum install -y vim
RUN yum install -y net-tools

EXPOSE 80

CMD echo $JAVA_HOME
CMD echo "---end---"
CMD /bin/bash
  1. 编译镜像
docker build -f Dockerfile -t mycentos:1.0 .
  1. 然后执行docker images 查看如下:
[root@iZbp1flzt6x7pxmxfhmxeeZ opt]# docker images
REPOSITORY           TAG       IMAGE ID       CREATED              SIZE
mycentos             1.0       122504aa874c   About a minute ago   337MB
redrose2100/centos   1.1       2184c3aadaab   30 hours ago         231MB
nginx                latest    f8f4ffc8092c   4 weeks ago          133MB
mysql                5.7       9f35042c6a98   4 weeks ago          448MB
centos               latest    5d0da3dc9764   6 weeks ago          231MB
[root@iZbp1flzt6x7pxmxfhmxeeZ opt]#
  1. 测试运行
    如下,当前工作目录已经切换到 /usr/local 目录下,JAVA_HOME变量也是有值的,ifconfig命令也支持了
[root@iZbp1flzt6x7pxmxfhmxeeZ opt]# docker run -it mycentos:1.0
[root@b868b5ba93e9 local]# pwd
/usr/local
[root@b868b5ba93e9 local]# echo $JAVA_HOME
/usr/local/jdk_1.8/
[root@b868b5ba93e9 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 8  bytes 656 (656.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@b868b5ba93e9 local]#

参考:
Dockerfile关键字详解

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

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

相关文章

数据防泄密系统排名(数据防泄漏厂商排名)

在当今数字化时代&#xff0c;数据安全和隐私保护成为了企业和个人最为关注的问题之一。随着大数据的快速发展和广泛应用&#xff0c;数据泄露的风险也日益增加。为了应对这一挑战&#xff0c;各种数据防泄密系统应运而生&#xff0c;本文将为大家介绍数据防泄密系统的排名。 洞…

LayUi之手风琴的趣味案例

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.手风琴是什么 二.手风琴在什么时候使用…

亿发软件:工业4.0时代,MES智能制造系统引领传统生产制造业转型

随着制造企业迈入工业4.0时代&#xff0c;数字化智能制造的应用变得越来越重要。制造执行系统&#xff08;MES&#xff09;广泛应用于制造型企业生产管理中。工业智能制造MES系统帮助制造型企业实现智能制造升级&#xff0c;实现从需求、生产到交付全过程的智能工厂规划闭环管控…

no-unused-vars

找到 package.json 在rules输入 "no-unused-vars":"off"

【UE4 塔防游戏系列】01-前期准备

UE版本&#xff1a;4.24.3 课程视频链接&#xff1a;【虚幻4】UE4初学者进阶进阶教程&#xff08;合集&#xff09;-制作一个塔防游戏 1-8P&#xff08;全&#xff09;游戏单机游戏 步骤 1. 新建一个空白模板工程 2. 下载游戏资源 百度网盘 请输入提取码 提取码&#xf…

三菱fx2n以太网模块

大家好&#xff0c;今天要和大家分享一个有趣的故事&#xff0c;是关于一款神奇的以太网通讯处理器——捷米特JM-ETH-FX。这款产品来自捷米科技有限公司&#xff0c;是一款经济型的以太网通讯处理器&#xff0c;设计非常独特&#xff0c;能够满足日益增多的工厂设备信息化需求&…

基于linux下的高并发服务器开发(第一章)- 解决动态库加载失败的问题1.8

第一种方式&#xff1a;环境变量在终端配置&#xff0c;关掉终端就会失效 1、获取当前动态库所在路径 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/nowcoder/Linux/lesson06/library/lib ldd main ./main 第二种方式&#xff1a;永久配置环境变量&#xff08;用户级别配置…

测试面试时的经典问题分析

1. 接口测试是怎么做的&#xff0c;如何分析数据&#xff0c;可能需要讲一个实际的例子&#xff0c;比如请求的接口不对 参数不对 读取字段不对 接口我们做分为1.功能接口测试 2.接口自动化回归测试 我们接口的一个流程&#xff1a; a.需求分析 b.根据需求梳理接口测试点(评…

骨传导耳机效果怎么样?想入手骨传导耳机看这篇文章就够了

什么是骨传导传声&#xff1f;大家都知道声音是需要通过空气传播的&#xff0c;但是每个人听到的声音&#xff0c;除了大部分通过空气传播传入我们的耳朵&#xff0c;再由鼓膜振动传入听觉神经&#xff0c;还有一部分是通过骨骼的振动&#xff0c;不通过鼓膜的振动传递给听觉神…

mysql-windows 安装

今天&#xff0c;由于一个功能要用到mysql&#xff0c;所以下载了 mysql-8.0.33-winx64 的版本&#xff0c;突然发现&#xff0c;以前都是安装的Linux 版本&#xff0c;windows版本不会安装了&#xff0c;查看官网试着装了一次&#xff0c;记录本次经历&#xff1a; 软件下载 …

【项目管理】成本管理

一.成本管理的概述 在项目上对成本进行管理和控制是为了让项目经理真正了解完成项目所需要消耗的时间和所需要的资源&#xff0c;从而对其进行相应的成本控制。成本管理主要分成以下三个方面的内容&#xff1a; 二.成本估算 成本估算是对整个项目投入的各种资源的成本进行估算&…

数据结构--栈

一、栈 数组是一种连续存储、随机访问的线性表&#xff0c;链表属于分散存储、连续访问的线性表。它们每个数据都有其相对位置&#xff0c;有至多一个直接前驱和之多一个直接后继。栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;也属于线性表&#xff0c…

什么耳机带着舒服?这几款耳机戴过的人都说好

骨传导耳机凭借不入耳就能轻松听音乐的特点&#xff0c;被越来越多人所认识&#xff0c;相比传统的入耳式耳机&#xff0c;骨传导耳机拥有更多的可玩性&#xff0c;比如说跑步、游泳、健身都可以佩戴骨传导耳机&#xff0c;即使长时间佩戴也不会出现不适感&#xff0c;也不会出…

《CSDN铁粉经济学:如何快速涨粉并转化为铁粉》

目录 一、铁粉的定义 二、获取铁粉的方法 要获取铁粉&#xff0c;首先需要拥有粉丝。 &#x1f9e9;粉丝与铁粉的关系 &#x1f525;热榜与领域榜 三、我的创作路程 四、总结 首先解释什么是铁粉&#xff1a;官方定义为&#xff0c;在90天内阅读、购买专栏或其他互动&…

IP地址划分

1 IP 地址的格式 IP 地址 网络地址 主机地址 如果 IP 进行了子网划分&#xff1a; 则IP地址网络地址子网地址主机地址 网络地址是互联网上的节点在网络中具有的逻辑地址。 MAC 地址&#xff1a;处于数据链路层&#xff1b;IP 地址&#xff1a;处于网络层&#xff1b;端口号…

部署jenkins(使用华为云war包,手动制作jenkins镜像)

部署jenkins&#xff08;使用华为云war包&#xff0c;手动制作jenkins镜像&#xff09; 环境准备制作jenkins镜像启动jenkins服务进入jenkins登录页 配置jenkins用户配置jenkins代理通道 环境准备 1、JDK镜像准备docker pull openjdk:8-jdk-oracle 2、jenkins的war包准备 http…

adb shell dumpsys SurfaceFlinger

adb shell dumpsys SurfaceFlinger adb shell dumpsys SurfaceFlinger分析Android 系统图层 此命令输出的内容不较多&#xff0c;可以将输出内容重定向到一个文件中 adb shell dumpsys SurfaceFlinger > ./Downloads/surface.txt如下的内容&#xff0c;过滤HWC layers 另外…

第六章 NVMe 介绍

6.4 寻址双雄&#xff1a;PRP 和 SGL 1. 主机往 SSD 写入用户数据 2. 主机读取 SSD 上的用户数据 在上面两个过程中&#xff0c;主机在与 SSD 的数据传输过程中&#xff0c;主机是被动的一方&#xff0c;SSD 是主动的一方。即&#xff0c;主机需要数据&#xff08;读数据&#…

JVM重点整理

一、虚拟机架构图 二、类加载过程 类加载器的作用&#xff1a;负责把class文件加载到内存中 类加载过程&#xff1a; 加载&#xff1a; 通过类的全限定名获取此类的二进制字节流文件的编码结构---->运行时的内存结构内存中生成一个class对象 链接&#xff1a; 验证&#x…

LangChain大型语言模型(LLM)应用开发(五):评估

LangChain是一个基于大语言模型&#xff08;如ChatGPT&#xff09;用于构建端到端语言模型应用的 Python 框架。它提供了一套工具、组件和接口&#xff0c;可简化创建由大型语言模型 (LLM) 和聊天模型提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互&#x…