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

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-toolsEXPOSE 80CMD 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 1500inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255ether 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 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536inet 127.0.0.1  netmask 255.0.0.0loop  txqueuelen 1000  (Local Loopback)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0[root@b868b5ba93e9 local]#

参考:
Dockerfile关键字详解

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

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

相关文章

【网络】IP协议

目录 感性理解 IP协议报头 解包分用 分片与组装 网段划分 为什么要进行网段划分 感性理解网段划分 特殊IP地址IP地址的数量限制 私有IP地址和公网IP地址 路由 感性理解 1.在之前的文章中介绍了TCP协议&#xff0c;TCP提供了可靠传输的一系列策略&#xff08;如&#…

分布式锁【数据库乐观锁实现的分布式锁、Zookeeper分布式锁原理、Redis实现的分布式锁】(三)-全面详解(学习总结---从入门到深化)

目录 分布式锁解决方案_数据库乐观锁实现的分布式锁 分布式锁解决方案_Redis实现的分布式锁原理 分布式锁解决方案_Redis实现的分布式锁 分布式锁解决方案_Redis分布式锁误删除问题 分布式锁解决方案_Redis分布式锁不可重入问题 分布式锁解决方案_基于Redisson实现的分布式…

又一家Tier1巨头「杀进」HUD赛道,2025年搭载率或破30%

作为未来智能座舱的新交互入口&#xff0c;HUD赛道正处于关键上车周期。与此同时&#xff0c;不少传统座舱Tier1巨头也在紧盯市场蛋糕。 就在去年&#xff0c;宝马官方发布了全新一代HUD演示效果&#xff0c;将会首发搭载于宝马NFUE KLASSE新世代概念车型&#xff0c;计划2025年…

HBase性能调优(二)

感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01; 版权声明&#xff1a;本文为CSDN博主「开着拖拉机回家」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。 Hbase性能调优&#xff08;二&#xff09;_开着…

消息中间件RabbitMQ详解

一、 消息中间件 简介 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流&#xff0c;并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型&#xff0c;它可以在分布式环境下扩展进程间的通信。 使用环境 消息中间件适用于需要可靠的数据传送…

6.Python:如何用Python进行数据可视化?

数据可视化是数据分析过程中不可或缺的一步&#xff0c;Python作为一个强大的编程语言&#xff0c;在数据可视化方面也是非常优秀的。本文将介绍使用Python进行数据可视化的基本步骤和常用工具。 一、Python数据可视化常用工具 Matplotlib Matplotlib是Python中最常用的数据…

「观察者(Observer)」设计模式 Swift实现

这里写目录标题 介绍设计模式介绍举例 iOS 中已有的 观察者设计模式实现Notification什么是通知机制或者说如何实现通知机制&#xff1f; KVOKVO底层实现如何实现手动KVO&#xff1f; 介绍 设计模式介绍 观察者设计模式&#xff08;Observer Pattern&#xff09;是一种行为型…

windows 下载安装Redis,并配置开机自启动

windows 下载安装Redis&#xff0c;并配置开机自启动 1. 下载 地址&#xff1a;https://github.com/tporadowski/redis/releases Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择&#xff0c;这里我们下载 Redis-x64-xxx.zip压缩包&#xff0c;之后解压 打…

简要介绍 | 边缘计算:原理,研究现状与未来展望

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对边缘计算进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 边缘计算&#xff1a;原理&#xff0c;研究现状与未来展望 What is Edge Computing? | Moving Intelligence to the Edge 一、背景介…

滑动奇异频谱分析:数据驱动的非平稳信号分解工具(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SPSS方差分析

参考文章 导入准备好的数据 选择分析方法 选择参数 选择对比&#xff0c;把组别放入因子框中&#xff0c;把红细胞增加数放进因变量列表 勾选“多项式”&#xff0c;等级取默认“线性” &#xff0c;继续 接着点击“事后比较”&#xff0c;弹出对话框&#xff0c;勾选“LSD” …

C语言面试经典问题

当准备面试C语言相关职位时&#xff0c;以下是一些常见的C语言面试问题&#xff0c;可以帮助你准备面试。 什么是C语言&#xff1f; C语言的特点是什么&#xff1f; 请解释C语言中的标识符和关键字。 什么是C语言中的数据类型&#xff1f;请列举一些常见的数据类型。 如何…