刚开始学Docker的人,十有八九会被两个词搞晕:镜像容器

它们长得很像,名字也像,甚至命令都差不多。但如果你分不清它们,后面学Docker Compose、Dockerfile、数据卷,都会一头雾水。

今天这篇文章,我们就用最直白的方式,把镜像和容器这对“孪生兄弟”的区别讲清楚。

一、镜像是什么?

镜像,是一个静态的软件包

它把应用、依赖、配置、启动脚本,全部打包在一起。你可以把它想象成一个安装包——比如你下载的PostgreSQL安装程序,它就在那里,但还没安装。

镜像的特点:

  • 静态的,不运行

  • 可移植的,可以复制、传输、存储

  • 由多层堆叠而成

二、镜像的分层结构

Docker镜像由多层堆叠而成,像千层饼一样:

  • 最底层:Linux基础镜像(通常是Alpine,因为它非常小)

  • 中间层:中间依赖、库文件

  • 最上层:应用本身(比如PostgreSQL)

这种分层设计有两个好处:

  1. 复用:不同镜像共用同一个基础层,比如多个应用都用Alpine,这层只存一次

  2. 省带宽:下载新版镜像时,只下载变动的层,已存在的层不用重新下

三、容器是什么?

容器,是镜像的运行实例

镜像只是“安装包”,容器才是“正在运行的程序”。

当你执行:

docker run postgres:13.10

Docker会做两件事:

  1. 把镜像拉下来(如果本地没有)

  2. 启动它,变成容器

所以:

  • 镜像 = 静态的软件包(类比:下载的安装程序)

  • 容器 = 运行中的程序(类比:双击安装后正在跑的应用)

四、实战:跑一个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、数据卷、网络配置,都会顺理成章。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐