Docker 镜像结构详解

 更新时间:2025年10月09日 16:48:24   作者:维尔切(wiltjer)  
Docker镜像是由一系列层(layers)组成的,理解Docker镜像的结构对于有效地构建、共享和管理Docker镜像至关重要,本文给大家介绍Docker镜像结构的相关知识,感兴趣的朋友一起看看吧

Docker 镜像结构

一、镜像与容器之间的关系

  • 镜像:是静态的、只读的文件系统,包含运行容器所需的程序、库、资源、配置等
  • 容器:是镜像的运行实例,是动态的进程,拥有自己的文件系统、网络、进程空间等资源
  • 关系
    • 镜像是容器的基础,容器依赖于镜像。
    • 容器启动时,会在镜像之上添加一个可写的“容器层”,所有修改都发生在这一层。
    • 镜像通过 json 文件描述运行时的配置(如启动命令、环境变量等),Docker 守护进程解析该文件并启动容器

二、镜像结构

1、基础镜像(base 镜像)

  • 不依赖于其他镜像,从 scratch 开始构建
  • 以此为基础镜像,进行扩展
  • 通常是各种 Linux 发行版(如 CentOS、Ubuntu)的镜像
  • 不同发行版的区别在于 rootfs(用户空间),而内核共享宿主机的 Kernel

2、镜像分层

  • 镜像由多个只读层组成,每层代表一个修改(如安装软件、添加文件)
  • 层次结构示例
| touch /galaxy/cy | Image |
| mkdir /galaxy    | Image |
| CentOS:7         | Base Image |
| Docker Host      | Kernel |

3、容器层

  • 容器启动时,在镜像顶部添加一个可写层
  • 用户看到的是联合文件系统,上层文件覆盖下层同名文件
  • 容器层的写入操作使用写时复制机制

三、Docker 镜像构建

1、三种构建方式对比

方式说明优点缺点
docker commit基于运行中的容器创建镜像简单快捷容易出错,效率低且可重复性弱,不安全
基于本地模板导入从模板文件导入镜像快速导入已有系统不灵活、不易定制
dockerfile通过脚本定义镜像层次透明、可重复、易于维护推荐方式

2、docker commit

通过在运行的容器内安装软件、配置环境,再将容器的“当前状态”打包为新镜像,本质是“快照式构建”

centos:7中安装vim-common

先基于centos7运行容器,容器名为cy,并使用-it生成终端进入容器

[root@docker ~]# docker run --name dc -it centos:7 /bin/bash

在容器中安装vim-common

[root@8f3a60b20edb /]# yum -y install vim-common

退出容器后,使用docker commit将v1容器打包为镜像

[root@docker ~]# docker commit dc centosdc:7
[root@docker ~]# docker images | grep centosdc

3、基于本地模板导入

直接从操作系统模板文件(如OpenVZ模板)导入镜像,模板文件通常为压缩包(如tar.gz),包含完整的rootfs和基础配置

导入ubuntu:12.04模板

下载模板

从OpenVZ官方地址(http://openvz.org/Download/templates/precreated)下载ubuntu-12.04-x86-minimal.tar.gz

导入为镜像

[root@docker ~]# cat ubuntu-12.04-x86-minimal.tar.gz | docker import - ubuntu:12.04

验证镜像

[root@docker ~]# docker images

4、Dockerfile构建

Dockerfile是一个文本文件,包含一系列“指令(Instruction)”,每一条指令对应镜像的一层——指令描述了该层的构建操作(如安装软件、复制文件、配置环境)。通过docker build命令执行Dockerfile,可自动化、可重复地构建镜像,解决了docker commit的“不透明、不可追溯”问题

编写 Dockerfile

[root@docker ~]# vim Dockerfile

Dockerfile 内容

# 第一行必须指定,基础镜像信息
FROM centos:7
# 维护者信息
MAINTAINER docker@example.com
# 镜像操作指令
RUN yum install -y httpd
EXPOSE 80
# 容器启动执行指令
CMD ["/usr/sbin/httpd"]

执行构建命令

[root@docker ~]# docker build -t httpd:wil /root/

构建过程:

  1. 下载centos7镜像
  2. 添加镜像构建者信息
  3. 基于centos7镜像启动容器,安装httpd软件,安装完毕后将容器打包为镜像
  4. 基于上一步生成的镜像启动容器,将80端口打开,打开后将容器打包为镜像
  5. 基于上一步生成的镜像启动容器,添加容器启动后需要执行的指令,再打包为镜像

查看构建历史

[root@docker ~]# docker history httpd:wil

使用DockerFile文件构建完镜像以后,Docker会把构建过程中的每一层临时镜像进行缓存。在构建新镜像时,可以直接使用之前缓存的镜像层,这样能加速镜像的构建

四、Dockerfile 语法详解

指令说明示例
FROM指定基础镜像FROM centos:7
MAINTAINER维护者信息(已逐渐被 LABEL 替代)MAINTAINER cy@example.com
LABEL元数据键值对LABEL version="1.0"
RUN构建过程中执行命令RUN yum install -y httpd
COPY复制宿主机文件到镜像COPY app.py /app/
ADD类似 COPY,支持 URL 和自动解压ADD app.tar.gz /app/
WORKDIR设置工作目录WORKDIR /app
VOLUME创建挂载点VOLUME /data
EXPOSE声明容器端口EXPOSE 80
ENV设置环境变量ENV APP_HOME /app
CMD容器启动命令(可被覆盖)CMD ["/bin/bash"]
ENTRYPOINT容器启动命令(不可被覆盖)ENTRYPOINT ["/app/start.sh"]
USER指定运行用户USER nobody

五、总结

要点说明
镜像与容器镜像是静态的模板,容器是运行实例
分层结构镜像由多个只读层组成,容器层可写
基础镜像从 scratch 构建,提供 rootfs
构建方式推荐使用 Dockerfile,透明、可重复
Dockerfile 指令每条指令对应一层,支持缓存
缓存机制加速构建,可通过 --no-cache 禁用

到此这篇关于Docker 镜像结构的文章就介绍到这了,更多相关Docker 镜像结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker打包一个Python脚本的实现方法

    Docker打包一个Python脚本的实现方法

    本文主要介绍了Docker打包一个Python脚本的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • docker的卷映射手动指定位置的操作方法

    docker的卷映射手动指定位置的操作方法

    Docker中手动指定卷映射位置通过绑定挂载实现,使用-v或--mount参数,语法清晰,支持更多选项,注意宿主机目录存在性、权限和SELinux限制,本文介绍docker的卷映射手动指定位置的操作方法,感兴趣的朋友一起看看吧
    2025-02-02
  • docker集群Error response from daemon: rpc error问题

    docker集群Error response from daemon: rpc&

    文章描述了在Docker集群中遇到的错误信息,并提供了解决办法,解决办法包括配置安全组,将Docker Swarm的所有节点IP添加到安全组中
    2025-01-01
  • docker安装的mysql修改配置文件方式

    docker安装的mysql修改配置文件方式

    本文描述了在修改MySQL容器配置文件后遇到的异常问题,并给出了解决方法,原来是因为iptables规则冲突导致,重启docker后问题解决
    2026-04-04
  • Docker安装kafka并创建topic进行消息通信过程

    Docker安装kafka并创建topic进行消息通信过程

    本文介绍了如何使用Docker容器化技术来安装和配置Apache Kafka,并详细介绍了如何创建topic进行消息通信,通过Docker和Docker Compose两种方式,可以方便地搭建Kafka集群,并进行消息的发布和订阅
    2025-12-12
  • docker-compose network名称定义解读

    docker-compose network名称定义解读

    文章详细介绍了Docker Compose网络名称的生成规则,包括没有自定义网络名、定义后缀和定义前缀的情况,通过设置环境变量`COMPOSE_PROJECT_NAME`,可以更友好的命名网络
    2026-03-03
  • docker save与docker export的区别

    docker save与docker export的区别

    docker save和docker export都能导出镜像包,本文主要介绍了docker save与docker export的区别,试图搞清楚docker save和docker export的功能是什么?适用于什么应用场景?感兴趣的可以了解一下
    2022-03-03
  • Docker中编码和时区设置不生效问题排查小结

    Docker中编码和时区设置不生效问题排查小结

    本文主要介绍了在Docker容器中排查编码和时区设置不生效的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Docker执行(进入)镜像实践

    Docker执行(进入)镜像实践

    本文介绍了如何使用Docker命令查看、安装、删除镜像,以及如何运行镜像并设置自动重启,还详细介绍了如何进入Docker容器并进行一些常见操作,如设置MySQL事务超时时间,最后,文章鼓励大家参考并支持脚本之家
    2025-12-12
  • Docker案例分析:搭建Redis服务

    Docker案例分析:搭建Redis服务

    这篇文章主要介绍了Docker案例分析:搭建Redis服务方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论