- Docker 零基础到实战:一文吃透镜像、容器与 Compose
- 一、Docker 是什么?
- 二、快速开始(Hello Container)
- 三、镜像与容器的关系
- 四、Dockerfile:把应用打包成镜像
- 五、数据与网络:卷与端口
- 六、Docker Compose:一键拉起多容器
- 七、常见场景清单
- 八、最佳实践(性能与安全)
- 九、排错速查
- 十、实践清单(建议)
- 彩蛋:梗版总结(轻松读法)
一、Docker 是什么?
- 一个“装应用的盒子”标准:镜像像模具,容器像成品,哪里都能稳定复现。
- 解决“我电脑能跑、他电脑跑不起来”的环境不一致问题��
二、快速开始(Hello Container)
- 安装 Docker Desktop(Windows/Mac)或使用包管理器(Linux)。
- 试跑:
docker run –rm hello-world - docker run –rm -p 8080:80 nginx
- 访问 http://localhost:8080 验证成功。
常用命令速查:
- docker ps 查看容器、docker images 查看镜像
- docker pull/push 拉取/推送、docker run 启动
- docker logs 看日志、docker exec -it 进入容器
三、镜像与容器的关系
- 镜像(Image):只读模板,包含运行所需环境与依赖。
- 容器(Container):镜像的运行实例,可读写,有生命周期(启动/停止/删除)。
- 分层存储:镜像分层可复用,容器在其上追加可写层。
四、Dockerfile:把应用打包成镜像
示例:Node.js 应用
复制代码
# 1. 选择基础镜像
FROM node:20-alpine AS deps
# 2. 安装依赖
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# 3. 复制源码并构建
FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
要点:
- 多阶段构建减小体积;alpine 体积小但有时需额外依赖(如 glibc)。
- 尽量固定基础镜像与依赖版本,构建更可重复。
五、数据与网络:卷与端口
- 端口映射:-p 8080:80(本机:容器)
- 挂载卷:-v /host/data:/container/data 持久化数据或热更新代码
- 网络:默认 bridge;可用自定义网络让多个容器互相通过名字发现
复制代码
# 创建网络
docker network create mynet
# 启动两个容器并加入网络
docker run -d --name redis --network mynet redis:7
docker run -d --name api --network mynet -p 3000:3000 my-api:latest
六、Docker Compose:一键拉起多容器
docker-compose.yml 示例:
复制代码
version: "3.9"
services:
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
api:
build: .
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://postgres:example@db:5432/postgres
depends_on:
- db
volumes:
pgdata:
使用:docker compose up -d,停止:docker compose down
七、常见场景清单
- 本地开发:数据库、缓存、消息队列一键拉起;代码挂载热更新。
- 前后端联调:Nginx 反向代理 + 后端容器,模拟生产入口。
- 任务作业:定时/队列消费者容器化,统一运行环境。
八、最佳实践(性能与安全)
- 镜像体积优化:选择精简基础镜像,多阶段构建,清理构建产物与缓存。
- 最小权限:容器内使用非 root 用户;只开放必要端口与能力。
- 资源限制:–cpus、–memory 控制资源占用;合理健康检查与重启策略。
- 机密管理:避免把密钥写进镜像;用环境变量、Secrets 或配置中心。
- 日志与排错:docker logs、docker inspect、docker exec,配合 Compose 的 depends_on 与健康检查定位问题。
九、排错速查
- 端口被占用:更换宿主端口或停止冲突服务。
- 网络不通:检查容器网络/服务名;docker exec 进容器 curl。
- 无法连接数据库:确认环境变量、网络名、端口映射与权限。
十、实践清单(建议)
- 把一个 Node/Java/Python 小项目容器化并用 Compose 搭配数据库跑起来。
- 给 Dockerfile 做体积优化,比较构建前后镜像大小与启动时间。
- 编写健康检查与重启策略,模拟异常恢复。
彩蛋:梗版总结(轻松读法)
- Docker 就像“外卖盒”:镜像是菜谱+做好的菜型,容器是端上桌的一份;
- -p 8080:80 是“窗口号”,别拿错窗口喊老板;
- Compose 是“套餐一键下单”,开会不耽误吃饭(开发环境一键拉起);
- 多阶段构建像“做完就洗锅”,既干净又清爽;
- 记得用非 root,别让“外卖员有店里所有钥匙”。