Docker镜像与容器:一次讲清楚这对“孪生兄弟”的区别,附PostgreSQL实战
本文通俗易懂地讲解了Docker中镜像和容器的核心区别。镜像相当于静态的软件安装包,包含应用、依赖和配置;容器则是镜像的运行实例。文章通过PostgreSQL示例演示了如何拉取镜像、启动容器,并解释镜像的分层结构设计带来的存储和下载优势。最后强调理解这两个基础概念对后续学习Docker技术栈的重要性。全文用生活化的比喻和实际操作帮助初学者快速掌握关键知识点。

刚开始学Docker的人,十有八九会被两个词搞晕:镜像和容器。
它们长得很像,名字也像,甚至命令都差不多。但如果你分不清它们,后面学Docker Compose、Dockerfile、数据卷,都会一头雾水。
今天这篇文章,我们就用最直白的方式,把镜像和容器这对“孪生兄弟”的区别讲清楚。
一、镜像是什么?
镜像,是一个静态的软件包。
它把应用、依赖、配置、启动脚本,全部打包在一起。你可以把它想象成一个安装包——比如你下载的PostgreSQL安装程序,它就在那里,但还没安装。
镜像的特点:
-
静态的,不运行
-
可移植的,可以复制、传输、存储
-
由多层堆叠而成
二、镜像的分层结构
Docker镜像由多层堆叠而成,像千层饼一样:
-
最底层:Linux基础镜像(通常是Alpine,因为它非常小)
-
中间层:中间依赖、库文件
-
最上层:应用本身(比如PostgreSQL)
这种分层设计有两个好处:
-
复用:不同镜像共用同一个基础层,比如多个应用都用Alpine,这层只存一次
-
省带宽:下载新版镜像时,只下载变动的层,已存在的层不用重新下
三、容器是什么?
容器,是镜像的运行实例。
镜像只是“安装包”,容器才是“正在运行的程序”。
当你执行:
docker run postgres:13.10
Docker会做两件事:
-
把镜像拉下来(如果本地没有)
-
启动它,变成容器
所以:
-
镜像 = 静态的软件包(类比:下载的安装程序)
-
容器 = 运行中的程序(类比:双击安装后正在跑的应用)
四、实战:跑一个PostgreSQL容器
1. 安装Docker Desktop
Mac和Windows需要装Docker Desktop,Linux直接用包管理器装。
2. 拉取并运行PostgreSQL
docker run -e POSTGRES_PASSWORD=mysecretpassword postgres:13.10
-
-e:设置容器内的环境变量(PostgreSQL必须设置密码才能启动) -
postgres:13.10:镜像名和版本号
第一次运行,Docker会从Docker Hub拉取镜像(此处如果下载不下来,需要配置Docker镜像,参考我的HeyGem那篇文章)。你会看到每一层在分开下载——这就是分层结构在起作用。
下载完自动启动,看到database system is ready to accept connections,说明PostgreSQL已经跑起来了。
3. 查看运行中的容器
docker ps
你会看到一个正在运行的PostgreSQL容器,有容器ID、使用的镜像、运行状态等信息。
4. 同时跑多个版本
Docker支持同时运行同一个应用的多个版本,而且彼此隔离,互不干扰。
docker run -e POSTGRES_PASSWORD=mysecretpassword postgres:14.7
这次下载会快很多,因为14.7和13.10共享了很多层,只下载差异部分。
再执行docker ps,你会看到两个PostgreSQL容器在同时运行。
五、镜像和容器的核心区别
| 概念 | 本质 | 状态 | 类比 |
|---|---|---|---|
| 镜像 | 静态软件包 | 不运行 | 下载的安装程序 |
| 容器 | 运行实例 | 运行中 | 正在跑的应用 |
一句话总结:镜像就是躺着不动的包,容器是跑起来的环境。
六、分层设计为什么重要?
假设你已经有PostgreSQL 13.10的镜像,想再拉14.7:
-
基础层(Alpine)已经在本地了,不用重新下载
-
公共依赖层已经在本地了,不用重新下载
-
只下载14.7独有的几层
这就是分层设计的价值:存得少,下得快。
写在最后
镜像和容器,是Docker最基础的两个概念。搞懂了它们,后面的Dockerfile、数据卷、网络配置,都会顺理成章。
更多推荐
所有评论(0)