镜像与容器快速上手
本篇从概念到实践,帮助你理解“镜像 vs 容器”的关系,并通过几个小实验掌握基本命令。
核心概念
- 镜像(Image):一组只读的文件层 + 元数据,类似“可复制的系统快照模板”。
- 容器(Container):基于镜像创建的运行实例,有自己的进程、网络和可写层。
常用关系:
- 一个镜像可以创建多个容器。
- 删除容器不会影响镜像;删除镜像会导致未来无法再从该镜像创建新容器。
常用命令速览
docker images # 查看本地已有镜像
docker ps # 查看运行中的容器
docker ps -a # 查看所有容器(包括已退出)
docker pull alpine # 从仓库拉取镜像
docker rm <cid> # 删除容器
docker rmi <image> # 删除镜像
第一个实验:进入 alpine 容器
运行一个临时容器并进入交互式 shell:
docker run -it --rm alpine sh
-it:交互模式 + 伪终端。--rm:容器退出后自动删除。alpine:使用 Alpine Linux 镜像。sh:启动容器后执行的命令。
在容器内部可以执行:
uname -a
ls /
exit
退出后再次运行 docker ps,你会发现容器已经不存在(因为使用了 --rm)。
构建自己的镜像:Dockerfile 入门
在一个新目录下(例如 hello-docker/)创建文件:
Dockerfile:
FROM node:22-alpine AS base
WORKDIR /app
COPY package*.json ./
RUN npm install --production
FROM base AS runtime
COPY . .
CMD ["node", "index.js"]
.dockerignore:
node_modules
npm-debug.log
.git
dist
构建镜像:
docker build -t hello-docker:dev .
再次执行构建时,如果 Dockerfile 中前几步没有变化,Docker 会重用缓存层,大幅缩短构建时间。
数据持久化:卷与绑定目录
容器默认的写入是在“可写层”中,容器删除后这些数据会一起消失。持久化数据通常有两种方式:
命名卷(Volume):由 Docker 管理的存储。
docker volume create pgdata docker run -d --name pg \ -v pgdata:/var/lib/postgresql/data \ postgres:16适合数据库这类对 IO 要求高且不关心具体路径位置的场景。
绑定目录(Bind Mount):把宿主机上的具体目录挂载到容器里。
docker run --rm -it \ -v $(pwd):/app \ -w /app node:22-alpine sh常用于本地开发:容器使用宿主机的代码目录,实现热重载。
选择建议:
- 开发代码:用绑定目录,方便编辑。
- 数据库 / Kafka / Redis 等数据存储:优先命名卷。
常用调试技巧
查看日志:
docker logs -f <container-id-or-name>进入运行中的容器:
docker exec -it <cid> sh # 或 bash检查容器详细信息(包括网络、挂载、环境变量):
docker inspect <cid>
掌握这些基础动作后,你已经具备了用 Docker 运行与观察服务的能力,下一步可以进一步用 Compose 组织多服务联调。