Docker镜像与容器:一次讲清楚这对“孪生兄弟”的区别,附PostgreSQL实战
刚开始学Docker的人十有八九会被两个词搞晕镜像和容器。它们长得很像名字也像甚至命令都差不多。但如果你分不清它们后面学Docker Compose、Dockerfile、数据卷都会一头雾水。今天这篇文章我们就用最直白的方式把镜像和容器这对“孪生兄弟”的区别讲清楚。一、镜像是什么镜像是一个静态的软件包。它把应用、依赖、配置、启动脚本全部打包在一起。你可以把它想象成一个安装包——比如你下载的PostgreSQL安装程序它就在那里但还没安装。镜像的特点静态的不运行可移植的可以复制、传输、存储由多层堆叠而成二、镜像的分层结构Docker镜像由多层堆叠而成像千层饼一样最底层Linux基础镜像通常是Alpine因为它非常小中间层中间依赖、库文件最上层应用本身比如PostgreSQL这种分层设计有两个好处复用不同镜像共用同一个基础层比如多个应用都用Alpine这层只存一次省带宽下载新版镜像时只下载变动的层已存在的层不用重新下三、容器是什么容器是镜像的运行实例。镜像只是“安装包”容器才是“正在运行的程序”。当你执行docker run postgres:13.10Docker会做两件事把镜像拉下来如果本地没有启动它变成容器所以镜像 静态的软件包类比下载的安装程序容器 运行中的程序类比双击安装后正在跑的应用四、实战跑一个PostgreSQL容器1. 安装Docker DesktopMac和Windows需要装Docker DesktopLinux直接用包管理器装。2. 拉取并运行PostgreSQLdocker run -e POSTGRES_PASSWORDmysecretpassword 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_PASSWORDmysecretpassword postgres:14.7这次下载会快很多因为14.7和13.10共享了很多层只下载差异部分。再执行docker ps你会看到两个PostgreSQL容器在同时运行。五、镜像和容器的核心区别概念本质状态类比镜像静态软件包不运行下载的安装程序容器运行实例运行中正在跑的应用一句话总结镜像就是躺着不动的包容器是跑起来的环境。六、分层设计为什么重要假设你已经有PostgreSQL 13.10的镜像想再拉14.7基础层Alpine已经在本地了不用重新下载公共依赖层已经在本地了不用重新下载只下载14.7独有的几层这就是分层设计的价值存得少下得快。写在最后镜像和容器是Docker最基础的两个概念。搞懂了它们后面的Dockerfile、数据卷、网络配置都会顺理成章。