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命令
该命令用于列出本地存储的所有容器镜像。

二、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

接着我们进入容器
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:容器的IDhanyue/nginx:v2:要创建的目标镜像名;
我们可以使用 docker images查看这个新创建的镜像

五、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:指定目标镜像名;
.:指定构建上下文路径为当前目录,它代表构建时可访问的文件范围;
构建完成之后,我们查看一下构建好的镜像

六、docker save命令
该命令用于导出镜像。
#-o用于指定导出的文件
docker save -o nginx.tar hanyue/nginx:1.23

七、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

浙公网安备 33010602011771号