【云原生Docker系列第六篇】基于Dockerfile创建镜像(你与星光同样浪漫)(一)

简介: 【云原生Docker系列第六篇】基于Dockerfile创建镜像(你与星光同样浪漫)(一)

前言


Dockerfile是一个文本格式的配置文件,用户可以使用Dockerfile快速创建自定义的镜像。


一、Docker镜像的创建


创建镜像有三种方法:


1.基于已有镜像创建

2.基于本地模板创建

3.基于Dockerfile创建(重点)


1.1 基于现有镜像创建

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

docker create -it centos:7 bash
docker ps -a
CONTAINER ID   IMAGE      COMMAND   CREATED          STATUS    PORTS     NAMES
fb555aed6d9c   centos:7   "bash"    17 seconds ago   Created             agitated_germain
docker start fb555aed6d9c
yum install net-tools -y    
exit
[root@localhost ~]# docker create -it centos:7 bash
a0e0b9ee23f6c61f62a33bd909b65adbb0414cec3d73c6e96729eb3e1e4dd49e
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE      COMMAND       CREATED         STATUS                   PORTS     NAMES
a0e0b9ee23f6   centos:7   "bash"        6 seconds ago   Created                            modest_jepsen
#启动容器
[root@localhost ~]# docker start modest_jepsen
# 可以在容器里面安装net-tools工具
[root@localhost ~]# docker exec -it modest_jepsen bash
[root@a0e0b9ee23f6 /]# yum install -y net-tools


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

[root@localhost ~]# docker commit -m "new net-tools" -a "stevelu" a0e0b9ee23f6 centos:test1
sha256:40319e6b8822918affaacb40392d9eb30b8603b56d66c030c1a3ee9da5711d36
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
centos       test1     40319e6b8822   40 seconds ago   375MB
centos       7         eeb6ee3f44bd   9 months ago     204MB


常用选项:

选项

说明
-m 说明信息
-a 作者信息
-p 生成过程中停止容器的运行


1.2 基于本地模板创建

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


https://wiki.openvz.org/Download/template/precrated
wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz


可在主机上复制下载地址下载debian镜像导入,虚拟机上下载较慢

#导入debian压缩包
[root@localhost ~]# ls
anaconda-ks.cfg  debian-7.0-x86-minimal.tar.gz  initial-setup-ks.cfg  original-ks.cfg  
#生成镜像
[root@localhost ~]# docker import debian-7.0-x86-minimal.tar.gz -- debian:v1
sha256:0cc18c818a1948becb66cab4b4c880f815200e67fffcbb9bd48f67822010247b
#或
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:v1
#查看镜像
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
debian       v1        0cc18c818a19   16 seconds ago   215MB
#启动容器
[root@localhost ~]# docker run -itd debian:v1 bash
c1ed22a0152567a12b3f0a8b3fa57f407ca1fe55d631ece1bb9860b7fa4efb3a
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND       CREATED          STATUS                   PORTS     NAMES
c1ed22a01525   debian:v1   "bash"        5 seconds ago    Up 5 seconds                       peaceful_goldwasser




1.3 基于Dockerfile创建

1.3.1 联合文件系统(UnionFS)

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


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


特性:


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


我们下载的时候看到的一层层的就是联合文件系统。


1.3.2 镜像加载原理

在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。


1.3.3 为什么Docker里的centos的大小才200M?

因为对于精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。


1.3.4 Dockerfile

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。


镜像的定制实际上就是定制每一层所添加的配置文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile.


Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile.上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。


Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行 支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。


1.3.5 Docker镜像结构的分层

镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。



(1) Dockerfile 中的每个指令都会创建一个新的镜像层;


(2)镜像层将被缓存和复用;


(3)当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;


(4) 某一层的镜像缓存失效,它之后的镜像层缓存都会失效;


(5) 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在Docker容器中不可见了。



bootfs:bootfs加载器+内核,容器都是共享内核的,所以都有相同的bootfs


rootfs只读层:rootfs可以有多层,对外表现看起来就是一个整体


使用镜像运行一个容器实例时,就会在rootfs只读层上挂载一层可读可写层

目录
相关文章
|
3天前
|
存储 安全 持续交付
【Docker 专栏】Docker 镜像的版本控制与管理
【5月更文挑战第9天】本文探讨了Docker镜像版本控制与管理的重要性,包括可重复性、回滚能力、协作开发和持续集成。常用方法有标签、构建参数和版本控制系统。管理策略涉及定期清理、分层管理和镜像仓库。语义化标签、环境变量和配置文件在版本控制中有应用。版本系统与Docker结合能跟踪历史和促进协作。注意点包括优化镜像大小、确保安全性和兼容性。案例分析和未来趋势展示了持续发展的镜像管理技术,为Docker应用的稳定与进步保驾护航。
【Docker 专栏】Docker 镜像的版本控制与管理
|
1天前
|
Cloud Native 测试技术 数据安全/隐私保护
云原生之使用Docker部署Teedy轻量级文档管理系统
【5月更文挑战第8天】云原生之使用Docker部署Teedy轻量级文档管理系统
11 1
|
2天前
|
Cloud Native 测试技术 Linux
云原生之使用Docker部署homer静态主页
【5月更文挑战第7天】云原生之使用Docker部署homer静态主页
9 0
|
2天前
|
监控 Cloud Native 测试技术
云原生之使用Docker部署ServerBee服务器监控工具
【5月更文挑战第6天】云原生之使用Docker部署ServerBee服务器监控工具
11 1
|
3天前
|
运维 安全 Docker
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
【5月更文挑战第9天】Docker技术在软件开发和部署中带来便利,但其镜像安全问题不容忽视。本文探讨了Docker镜像安全扫描与漏洞修复,强调了镜像安全对应用和系统的重要性。文中介绍了静态和动态扫描方法,列举了软件漏洞、配置漏洞和恶意软件等常见安全问题,并提到了Clair和Trivy等扫描工具。修复策略包括更新软件、调整配置和重建镜像。此外,加强安全意识、规范镜像制作流程和定期扫描是管理建议。未来,将持续面对新的安全挑战,需持续研究和完善安全技术。
【Docker 专栏】Docker 镜像安全扫描与漏洞修复
|
3天前
|
Java Linux 数据安全/隐私保护
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
Docker自定义JDK镜像并拉取至阿里云镜像仓库全攻略
|
3天前
|
存储 弹性计算 运维
Docker数据集与自定义镜像:构建高效容器的关键要素
Docker数据集与自定义镜像:构建高效容器的关键要素
|
Shell Docker 容器
在Docker中创建应用
本文讲的是在Docker中创建应用,【编者的话】下面内容是在基于Docker,用node.js开发和部署网络应用过程中获得的经验和教训。
1784 0
|
3天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
3天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复

热门文章

最新文章