docker基础知识

张开发
2026/5/28 21:45:46 15 分钟阅读
docker基础知识
Docker 里最核心的 4 个对象你先把这 4 个概念分清镜像 image容器 container镜像层 layer仓库 registry/repository———1. 镜像是什么镜像可以理解成一个只读的运行模板它里面包含操作系统基础环境Python你的依赖包你的项目代码容器启动命令例如python:3.11-slim它是一个基础镜像。 而你后面构建出来的resume-assistant:latest是一个业务镜像。镜像本身不会“运行”它只是一个模板。———2. 容器是什么容器可以理解成镜像运行起来之后的实例比如docker run resume-assistant:latest这时 Docker 会基于镜像创建一个容器。所以关系是镜像 - 启动 - 容器就像类 - 实例模板 - 实际运行对象一个镜像可以启动多个容器。———3. 镜像层是什么这是你刚才问题的关键。Docker 镜像不是一个“大文件硬拷贝”而是由多层组成的。例如你的项目镜像可能逻辑上长这样第1层Linux 基础系统层 第2层Python 3.11 层 第3层pip 安装 requirements.txt 的依赖层 第4层复制 app/ 代码层 第5层启动命令和环境变量层这些层会被缓存和复用。为什么这很重要假设你已经有python-base:3.11-slim然后构建 resume-assistant:latest 时是在这个基础上往上叠新层。所以不会把底层完整重复复制一份多个镜像可以共享同样的基础层这就是为什么“拉一个基础镜像”不等于浪费一整份重复空间。———4. 仓库是什么仓库就是存放镜像的地方。比如Docker Hub阿里云 ACR你这次做的事情就是把基础镜像从 Docker Hub 迁移到阿里云 ACR方便服务器拉取。例如crpi-.../sunxuehai/python-base:3.11-slim这里crpi-... 是 registry 域名sunxuehai/python-base 是仓库路径3.11-slim 是 tag———刚才发生的事情按原理拆开你刚才在服务器执行了docker pull crpi-.../sunxuehai/python-base:3.11-slim它做的事情不是“把一个文件下载到当前目录”而是Docker 去远程仓库找到这个镜像把镜像的各层下载到本机 Docker 存储在本机镜像列表中注册这个镜像 tag后续 build/run 时可以直接复用所以它更像是“导入到 Docker 本地镜像缓存” 而不是 “下载一个独立压缩包到你的 home 目录”———为什么以后不需要每次都重新拉因为 Docker 会先看本地有没有这个镜像层。如果你已经拉过python-base:3.11-slim那以后再 build只要基础镜像没变本地缓存还在Docker 通常直接复用不重新下载。这就是缓存机制。———那 Docker 为什么有时候又会重新拉因为以下几种情况会触发重新拉本地没有这个镜像你手动删掉了它你换了 tag远程镜像更新而你要求刷新构建环境不是同一台机器所以“是否重新拉”取决于本地缓存是否存在镜像标识是否一致你有没有主动刷新———为什么镜像和容器都会占空间这是新手最容易混的地方。镜像占空间因为镜像层要存储Python系统层pip 包代码容器也占空间因为容器运行后会产生可写层日志临时数据所以后面磁盘管理一般要区分镜像占多少容器占多少volume 占多少build cache 占多少———你接下来最应该建立的意识Docker 不是“每次执行一条命令就产生一个没法控制的大黑盒”而是一个有状态的本地系统pull 是把镜像放进本地镜像缓存build 是基于已有层构造新镜像run 是基于镜像创建容器push 是把镜像上传到远程仓库rm/rmi/prune 是清理本地状态———对你当前项目这个理解具体落到什么地方现在服务器上已经有一个基础镜像crpi-.../sunxuehai/python-base:3.11-slim接下来如果我们 build 项目镜像resume-assistant:latest它不会从零开始而是以 python-base:3.11-slim 为底座再安装 requirements再复制项目代码生成新的业务镜像所以基础镜像不是垃圾而是后续构建的“底座缓存”。———

更多文章