Docker 入门

容器不是轻量虚拟机,这是学习 Docker 最先要纠正的直觉。虚拟机虚拟的是硬件,每个虚拟机里跑一个完整的操作系统;容器虚拟的是操作系统——同一台宿主机上的所有容器共享同一个内核,各自只有独立的文件系统、进程空间和网络栈。所以容器启动以毫秒计、一个容器只多占一个进程的资源,而虚拟机开机以分钟计、一台机器跑不了几台。

示例图

三个核心概念

Docker 的日常使用只围绕三个概念转:

三者的关系和「类、对象、代码仓库」几乎一一对应:镜像是类,容器是 new 出来的实例,仓库是放类定义的地方。

最常用的五组命令

# 拉镜像 / 看本地镜像
docker pull postgres:17-alpine
docker images

# 起容器:-d 后台跑,--name 起名,-p 映射端口,-v 挂数据
docker run -d --name my-pg -p 5432:5432 postgres:17-alpine

# 看状态 / 看日志 / 进容器
docker ps
docker logs -f my-pg
docker exec -it my-pg sh

# 停 / 删(删容器不删镜像)
docker stop my-pg && docker rm my-pg

# 磁盘占用排查:哪些镜像、容器、缓存在占空间
docker system df

数据要放进数据卷

容器删了,容器里的数据就没了——这是新手交的第一笔学费,通常发生在数据库容器上。正确姿势是把有状态的数据挂到**数据卷(volume)**里,数据卷的生命周期独立于容器:

docker run -d --name my-pg \
  -v pg-data:/var/lib/postgresql/data \
  postgres:17-alpine

这样 docker rm 重建容器后数据还在。判断标准很简单:凡是删了会心疼的数据,都不应该只存在于容器里。

到这里你已经掌握了单机使用 Docker 的八成日常。下一步是当一个应用需要多个容器配合(比如应用 + 数据库)时怎么编排,那是 Docker Compose 要解决的问题。