Docker 基础概念:镜像、容器、仓库、Docker 引擎
说实话,很多人刚接触 Docker 时,都被那套概念绕晕过。镜像?容器?仓库?到底有啥区别?
我在项目里带过不少新人,发现一个问题:概念不清,后面早晚要出大坑。今天咱们就把这几个核心概念掰开揉碎了讲透。
为啥要用 Docker?
你想想看,传统部署一个 Java 应用,你先得装 JDK,配环境变量,再装个 Tomcat,还可能跟系统里其他的软件冲突。换个服务器,又得重来一遍。累不累?
Docker 的思路很简单:把应用和它需要的运行环境打包成一个标准化的单元。这个单元,就是镜像。
我刚开始用 Docker 时,最头疼的就是环境不一致。开发环境跑得好好的,测试环境就挂了。后来全改成 Docker,问题少了八成。说白了,Docker 解决的就是「在我这可以,在你那就不行」这个老大难。
大家可能会问,那虚拟机不行吗?行,但太重了。每个虚拟机都要装一整套操作系统,启动慢,资源占用高。Docker 容器呢?共享宿主机的操作系统内核,启动毫秒级,资源占用也小得多。
核心优势一句话总结:一次封装,到处运行。省时、省力、省资源。
四个核心概念
| 概念 | 一句话解释 | 类比一下 |
|---|---|---|
| 镜像 (Image) | 一个只读的、用来创建容器的模板 | 好比一个安装光盘,里面有软件和系统 |
| 容器 (Container) | 镜像的运行实例,有自己独立的文件系统 | 好比用光盘装好系统的电脑,能开机干活 |
| 仓库 (Registry) | 集中存放镜像的地方 | 好比应用商店,可以从这里下载或上传镜像 |
| 引擎 (Engine) | 负责管理镜像、容器、网络的守护进程 | 好比这台电脑的电源和主板,是一切的基础 |
1. 镜像 (Image)
镜像就是一个只读的模板。里面装好了操作系统的基础层、运行环境、应用代码和配置。
举个栗子,你要部署一个 Nginx。你从 Docker Hub 拉一个官方的 Nginx 镜像下来,它里面已经包含了精简的 Linux 系统、Nginx 程序以及默认的配置。你直接基于它启动容器就行了。
自己封装镜像也很方便,写个 Dockerfile 就行了:
FROM nginx:alpine
COPY ./my-app /usr/share/nginx/html
EXPOSE 80
这个 Dockerfile 的意思就是:基于官方 Nginx 镜像,把我本地的 my-app 文件夹复制进去,然后暴露 80 端口。
这里有个避坑指南:镜像层是只读的、分层构建的。每次 RUN、COPY 都会生成新的一层。我见过有人把几个 G 的依赖全写在一个 RUN 里,结果改个配置就要重新下载几 G 的东西。建议把变化频率低的放在前面,变化多的放在后面,这样能利用缓存,节省构建时间。