Docker 镜像、容器、仓库一张图讲清楚很多初学者刚接触 Docker 时会被三个词绕晕镜像Image、容器Container、仓库Registry/Repository。它们看起来都和“装东西”有关但职责完全不同。这篇文章用一张关系图配合比喻和实战命令帮你一次性理清。一、先记住一句话镜像只读模板相当于“类”或“安装包”。容器镜像跑起来的实例相当于“对象”或“正在运行的程序”。仓库存放镜像的地方相当于“应用商店”或“远程代码库”。用程序员熟悉的比喻Docker 概念面向对象比喻生活比喻镜像类Class盖房子的图纸容器对象Instance按图纸盖好的房子仓库远程仓库图纸仓库 / 应用商店二、一张图看懂三者关系docker builddocker rundocker commitdocker pushdocker pulldocker exec 修改Dockerfile镜像 Image容器 Container仓库 Registry这张图说明了完整闭环写Dockerfile用docker build构建出镜像。用docker run把镜像启动成容器。容器里可以修改文件、安装软件。用docker commit可以把容器当前状态保存成新镜像。用docker push把镜像推到仓库。在其他机器上用docker pull从仓库拉取镜像。仓库内部还有层级关系Registry 仓库服务Namespace 命名空间/用户Repository 镜像仓库Tag: latestTag: v1.0Tag: v2.0比如nginx:latestnginx是 Repository镜像仓库名latest是 Tag标签完整写法可能是docker.io/library/nginx:latest三、镜像一切从模板开始镜像是只读的它包含一个精简的操作系统文件系统应用运行所需的依赖、库、配置启动命令、环境变量、暴露端口等元数据镜像采用分层存储。比如nginx:latest ├── Layer 1: Debian 基础层 ├── Layer 2: 安装 nginx 依赖 ├── Layer 3: 拷贝 nginx 配置 └── Layer 4: 设置启动命令多层可以复用所以多个镜像共享基础层时磁盘占用不会成倍增加。常用命令dockerimages# 查看本地镜像dockerpull nginx:latest# 从仓库拉取镜像dockerrmi nginx:latest# 删除本地镜像dockerinspect nginx:latest# 查看镜像详情四、容器镜像跑起来容器 镜像 可写层 运行时配置。当你执行dockerrun-d--namemynginx-p8080:80 nginx:latestDocker 会检查本地有没有nginx:latest镜像没有就去仓库拉。在镜像只读层之上加一个可写层。分配网络、进程空间、文件系统。启动容器。容器里的修改都发生在可写层不会影响原镜像。一旦容器删除可写层默认也会消失所以重要数据要用volume或bind mount持久化。常用命令dockerps# 查看运行中的容器dockerps-a# 查看所有容器dockerstop mynginx# 停止容器dockerstart mynginx# 启动容器dockerrmmynginx# 删除容器dockerexec-itmynginxsh# 进入容器dockerlogs mynginx# 查看日志容器有生命周期created → running → paused → stopped → exited → deleted五、仓库镜像的家仓库用来集中存储和分发镜像。常见的有Docker Hub官方公共仓库Harbor企业私有仓库GitLab Container Registry阿里云、腾讯云等容器镜像服务注意区分两个词Registry仓库服务比如 Docker Hub 整体。Repository某个镜像的仓库比如nginx这个仓库。Tag仓库里的版本比如latest、1.25、alpine。完整镜像名格式[registry地址/][命名空间/]仓库名[:标签]例如docker.io/library/nginx:latest registry.example.com/myteam/myapp:v1.2.3常用命令dockerlogin# 登录仓库dockertag mynginx:v1 user/mynginx:v1# 给镜像打标签dockerpush user/mynginx:v1# 推送镜像dockerpull user/mynginx:v1# 拉取镜像六、实战从拉取到推送下面走一遍完整流程加深理解。1. 拉取并运行 Nginxdockerpull nginx:latestdockerrun-d--namemynginx-p8080:80 nginx:latest浏览器访问http://localhost:8080能看到 Nginx 欢迎页。2. 进入容器修改内容dockerexec-itmynginxshechoHello Docker/usr/share/nginx/html/index.htmlexit刷新页面内容变成Hello Docker。3. 把容器保存成新镜像dockercommit mynginx mynginx:v1现在docker images里多了一个mynginx:v1。4. 推送到仓库dockertag mynginx:v1 yourname/mynginx:v1dockerlogindockerpush yourname/mynginx:v15. 在其他机器拉取运行dockerpull yourname/mynginx:v1dockerrun-d-p8080:80 yourname/mynginx:v1这就是镜像、容器、仓库协作的完整过程。生产环境不推荐用docker commit而应该用 Dockerfile 构建保证可重复、可审查。七、常见误区镜像不是容器镜像是静态模板容器是动态实例。删镜像前要先删依赖它的容器。容器删除数据就没了容器可写层随容器删除而消失。数据库、上传文件等必须用 volume。latest不是最新版latest只是默认标签不代表最新稳定版。生产建议用明确版本号如nginx:1.25.3。一个仓库可以有多个标签nginx:latest、nginx:1.25、nginx:alpine都属于nginx这个 Repository。仓库和镜像不是一对一仓库是“镜像的集合”标签才是具体版本。八、命令速查表操作命令查看本地镜像docker images拉取镜像docker pull nginx:latest构建镜像docker build -t myapp:v1 .运行容器docker run -d --name myapp -p 8080:80 myapp:v1查看容器docker ps -a进入容器docker exec -it myapp sh提交容器为镜像docker commit myapp myapp:v2打标签docker tag myapp:v1 user/myapp:v1推送镜像docker push user/myapp:v1删除容器docker rm myapp删除镜像docker rmi myapp:v1九、总结再回到那张核心关系图Dockerfile → 镜像 → 容器 ↑ ↓ └─ commit 镜像 ↔ 仓库push / pull镜像是只读模板分层存储可复用。容器是镜像的运行实例有可写层和生命周期。仓库是镜像的远程存放点通过 pull/push 分发。一句话记忆镜像像类容器像对象仓库像远程仓库build造镜像run起容器push/pull走仓库。