前言
在没有 Docker 的时代,开发和运维之间最经典的对话是:
开发:“在我电脑上明明是好的啊!”
运维:“但在测试服务器上就是跑不起来!”
Docker 的出现,彻底终结了这场战争。它提出了一种理念:“Build once, Run anywhere”(一次构建,到处运行)。
要掌握 Docker,其实只需要搞懂三个核心概念:镜像 (Image)、容器 (Container) 和 仓库 (Repository)。
如果不理解它们的关系,你敲命令时就像在盲打。为了让你秒懂,我们用 “做菜” 和 “程序开发” 两个角度来打比方。
1. 镜像 (Image) —— “食谱”
定义:
镜像是一个只读的模板。它包含了一个软件运行所需的所有东西:代码、运行时环境(如 JDK)、库文件、配置文件和操作系统发行版(如 CentOS/Alpine)。
通俗比喻:
- 生活版: 镜像就是一张**“食谱”**。食谱上写好了需要什么材料、怎么做,但食谱本身不能吃。
- Java版: 镜像就是 Java 中的
Class(类)。它只是一个定义,静静地躺在硬盘里。
特点:
- 分层存储: 就像千层饼一样,一层层叠加(OS层 -> 环境层 -> 代码层)。
- 只读: 你不能直接修改镜像里的内容,只能基于它创建一个新的。
2. 容器 (Container) —— “那道菜”
定义:
容器是镜像的运行实例。它是一个独立运行的、隔离的进程。
通俗比喻:
- 生活版: 容器就是你照着食谱做出来的**“那道菜”**。你可以照着同一张食谱(镜像),做出一盘菜、两盘菜、十盘菜……每一盘菜都是独立的,你把这盘吃光了,不影响那一盘。
- Java版: 容器就是 Java 中的
Object(对象)(new Class())。
特点:
- 可读可写: 容器在启动时,会在镜像的最上层挂载一个“读写层”。程序产生的数据(日志、临时文件)都写在这里。
- 用完即扔: 容器应该是轻量级的,随时可以删除重建。
3. 仓库 (Repository) —— “超市货架”
定义:
仓库是集中存放镜像文件的地方。
- Docker Hub: 全球最大的公共仓库(类似 GitHub)。
- 阿里云 ACR (容器镜像服务): 国内常用的私有或公有仓库,下载速度更快。
通俗比喻:
- 生活版: 仓库就是**“超市”或“图书馆”**。你想做番茄炒蛋,但手里没食谱(镜像),就去超市(仓库)买一本《家常菜大全》。
- Java版: 仓库就是 Maven 中央仓库。你需要依赖 jar 包时,从仓库里下载下来。
4. 三者如何协作?(工作流)
理解了概念,我们来看看 Docker 的日常工作流,其实就是这三个概念的流转:
- Build (构建):
- 你是厨师,你写了一张新食谱。
- 命令:
docker build(把代码编译打包成 镜像)
- Push (推送):
- 你把食谱复印一份,放到书店去卖,分享给别人。
- 命令:
docker push(把 镜像 上传到 仓库)
- Pull (拉取):
- 你的同事想吃这道菜,但他不会做,于是从书店把食谱买回来。
- 命令:
docker pull(从 仓库 下载 镜像 到本地)
- Run (运行):
- 同事照着食谱,做出了这道菜,开吃!
- 命令:
docker run(基于 镜像 启动 容器)
5. 一张表总结
| 概念 | 对应角色 | 状态 | 常用命令 |
| 镜像 (Image) | 类 (Class) / 食谱 | 静态、只读 | docker build, docker images, docker rmi |
| 容器 (Container) | 对象 (Object) / 菜 | 动态、可运行 | docker run, docker ps, docker rm |
| 仓库 (Repository) | Maven仓库 / 超市 | 存储、分发 | docker pull, docker push |
结语
Docker 并没有那么神秘。
- 镜像是静态的文件。
- 容器是跑起来的进程。
- 仓库是存文件的地方。
掌握了这三点,下一篇我们将进入实战,教你如何编写一个 Dockerfile,把你写的代码打包成一个可以到处运行的镜像。