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定制容器镜像的2种方法(推荐)

    Docker定制容器镜像的2种方法(推荐)

    本篇文章主要介绍了Docker定制容器镜像的2种方法(推荐),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • 记一次Docker生产环境搭建的方法

    记一次Docker生产环境搭建的方法

    这篇文章主要介绍了记一次Docker生产环境搭建的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • 基于alpine用dockerfile创建的爬虫Scrapy镜像的实现

    基于alpine用dockerfile创建的爬虫Scrapy镜像的实现

    这篇文章主要介绍了基于alpine用dockerfile创建的爬虫Scrapy镜像的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • docker服务假死的解决方法

    docker服务假死的解决方法

    工作中使用docker-compose部署容器,有时候会出现使用docker-compose stop或docker-compose down命令想停掉容器,但是依然无法停止或者一直卡顿在停止中的阶段,所以本文给大家介绍了docker服务假死的解决方法,需要的朋友可以参考下
    2023-12-12
  • docker运行nginx不生效的解决办法

    docker运行nginx不生效的解决办法

    当docker运行nginx镜像时,设置端口映射,则只有该映射端口起作用,nginx配置的其他端口无效,接下来本文将给大家介绍docker运行nginx不生效的解决办法,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-01-01
  • Centos7 安装部署Kubernetes(k8s)集群实现过程

    Centos7 安装部署Kubernetes(k8s)集群实现过程

    这篇文章主要为大家介绍了Centos7 安装部署Kubernetes(k8s)集群实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • docker的镜像存放地址在哪里

    docker的镜像存放地址在哪里

    Docker镜像(Image)是用于创建 Docker 容器的模板,下面这篇文章主要给大家介绍了关于docker的镜像存放地址在哪里的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 10分钟学会docker

    10分钟学会docker

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
    2017-06-06
  • CentOS下Docker的安装教程详解

    CentOS下Docker的安装教程详解

    今天小编就为大家分享一篇关于CentOS下Docker的安装教程详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Docker部署nginx并修改配置文件的实现方法

    Docker部署nginx并修改配置文件的实现方法

    这篇文章主要介绍了Docker部署nginx并修改配置文件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论