W
e
l
c
o
m
e
: )

Docker的容器镜像

一、容器镜像介绍

Docker容器镜像是Docker的核心基石,是创建容器的“模板”和“蓝图”。它包含了应用程序运行所需的全部内容:应用程序代码、运行时环境(python、java)、系统变量、依赖库和配置文件等。

一、核心原理与特性

1.分层存储结构(Layered Storage)

Docker镜像并不是一个单一的大文件,而是由多个只读层(layers)叠加在一起的。

  • 指令即层:在编写Dockerfile时,每一条构建指令(FROM、RUN、COPY)都会在底层生成一个镜像层;
  • 增量记录:每一层只记录与上一层相比发生的变化(比如新增文件、修改配置),而不是完整复制整个文件系统;
  • 共享与缓存:因为镜像层是独立的,所以不同的镜像可以共享相同的基础层,比如10个基于Ubuntu的容器,只会保留一份Ubuntu基础层,这极大的节省了磁盘空间。同时,当我们在构建或者拉取镜像时,未发生变化的层会直接使用缓存,大幅提升速度,比如我已经拉取过Nginx:1.23的镜像了,如果我再去拉取Nginx:1.24的镜像,只会拉取发生变化的部分;

2.联合文件系统(UnionFS)

联合文件系统UnionFS是一个分层、轻量化的文件系统,它的核心功能是将多个独立的目录“透明地”合并成一个统一的虚拟文件系统视图。注意UnionFS并不是单一软件,而是一类文件系统的统称,目前Docker默认使用的存储驱动是Overlay2,它内存占用低并且读写性能优异。

  • 多层叠加合并:UnionFS会将多个只读目录(LowerDir镜像层)和一个可读写目录(UpperDir容器层)按顺序堆叠,对外呈现一个完整的合并目录;
  • 同名文件覆盖(白障遮蔽):如果上层目录存在与下层目录同路径的同名文件,会将下层的同名文件覆盖;

3.写时复制机制(Copy-on-Write,CoW)

镜像本身是完全只读的,当基于镜像启动容器时,Docker 会在所有只读层之上添加一个可写的容器层。当容器需要修改底层只读层的文件时,系统会先将该文件复制到可写层再进行修改,这样既保护了底层数据的完整性,又实现了高效的空间利用,同时还能保证容器运行时的隔离性与安全性。

4.只读与不可变性

镜像一旦构建完成便不可修改。这保证了无论在何种环境中,基于同一镜像启动的容器都能保持完全一致的运行状态,从根本上解决了传统部署中“在我电脑上能运行,到服务器上就报错”的环境一致性问题。

二、Docker镜像命名规范

Docker 镜像的标准命名格式为:[registry-host]/[namespace]/[repository]:[tag]

  • registry-host 仓库服务器地址(默认为 docker.io)
  • namespace 命名空间(用户或组织,官方镜像默认为 library)
  • repository 仓库名
  • tag :标签,用于版本标记,默认为 latest。

示例: docker.io/library/nginx:latest

二、容器镜像常用命令

一、docker images命令

该命令用于列出本地存储的所有容器镜像。

image.png

二、docker pull命令

该命令用于拉取/下载容器镜像。

root@DESKTOP-0QJE53P:/var/lib/docker/image# docker pull nginx:latest
latest: Pulling from library/nginx
57b3fbf43092: Pull complete
41c9f6f90940: Pull complete
d4dcde3aeeed: Pull complete
80fa08b690ad: Pull complete
72c03230f136: Pull complete
6376488be516: Pull complete
c5a7565de4cf: Pull complete
9bebb266cee4: Download complete
ce322055c0f5: Download complete
Digest: sha256:608a100c71651bf5b773c89083b4a1ad7ef4b2bd05d7a7e552271e03123692ad
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

三、docker rmi命令

该命令用于删除指定的容器镜像。

root@DESKTOP-0QJE53P:/var/lib/docker/image# docker rmi nginx:latest
Untagged: nginx:latest
Deleted: sha256:608a100c71651bf5b773c89083b4a1ad7ef4b2bd05d7a7e552271e03123692ad

四、docker commit命令

该命令用于创建镜像,它可以基于当前正在运行的某个容器作为副本来创建镜像。

首先,我们先基于已有的镜像来启动一个容器。

docker run --name nginx -d nginx:1.23

image.png

接着我们进入容器

docker exec -it nginx /bin/bash

执行更新系统命令

apt-get update
apt-get upgrade -y
  • apt-get update:刷新本地软件包索引缓存;
  • apt-get upgrade -y:将系统中所有已安装的、有可用新版本的软件包升级到最新版,-y表示自动确认;

更新完毕之后退出容器

exit

最后,基于这个更新过的容器进行提交

docker commit -m="has update" -a="hanyue" 4c35b72fc269 hanyue/nginx:v2
  • -m:提交的描述信息
  • -a:提交作者
  • 4c35b72fc269:容器的ID
  • hanyue/nginx:v2:要创建的目标镜像名;

我们可以使用 docker images查看这个新创建的镜像

image.png

五、docker build命令

该命令也用于创建镜像,它是基于 Dockerfile来构建的。

首先,我们需要创建 Dockerfile文件并写入构建镜像的相关指令,每条指定都会在镜像上创建一个层(layer),并且指令前缀必须是大写的

sudo tee /mydata/nginx/Dockerfile <<EOF
FROM nginx:1.23
RUN apt-get update && apt-get upgrade -y
EXPOSE 80
EOF
  • FROM:指定使用的镜像源;
  • RUN:告诉Docker在镜像内执行什么命令;
  • EXPOSE:声明容器在运行时会监听的端口;

文件创建好之后,使用 docker build命令构建镜像

docker build -f /mydata/nginx/Dockerfile -t hanyue/nginx:1.23 .
  • -f:指定Dockerfile文件路径;
  • -t:指定目标镜像名;
  • .:指定构建上下文路径为当前目录,它代表构建时可访问的文件范围;

构建完成之后,我们查看一下构建好的镜像

image.png

六、docker save命令

该命令用于导出镜像。

#-o用于指定导出的文件
docker save -o nginx.tar hanyue/nginx:1.23

image.png

七、docker load命令

该命令用于导入镜像文件。

docker load -i nginx.tar

八、docker export命令

该命令用于将当前正在运行的容器导出。

#-o用于指定导出的文件,a9fe60c2f21e是容器ID
docker export -o nginx2.tar a9fe60c2f21e

九、docker import命令

该命令用于将上面 docker export导出的容器作为本地容器镜像。

docker import nginx2.tar nginx:v2
posted @ 2026-06-13 16:05  寒月静无光  阅读(1)  评论(0)    收藏  举报