• 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,别让“外卖员有店里所有钥匙”。

By Tweak