这是我学习 Docker 时整理的核心笔记。之前转载的《Docker 是什么》讲了"是什么",这篇讲"怎么用"——核心概念 + Dockerfile 基础 + 一次完整的构建/运行。
一、Docker 在解决什么问题
"在我电脑上能跑"——经典扯皮。开发/测试/生产环境不一致,依赖版本不同,应用就崩。Docker 把应用 + 依赖 + 配置打包成一个标准化的镜像,在任何装了 Docker 的机器上运行结果完全一致。
二、Docker 架构(Client/Daemon/Registry)
Docker 是个 C/S 架构:
| 组件 | 作用 | 常见对应 |
|---|---|---|
| Client(客户端) | 你打 docker build/run 命令,只发指令 | docker 命令行、CI 脚本 |
| Daemon(守护进程) | 真正干活的一层,管镜像/容器/网络/卷 | dockerd 后台服务 |
| Registry(镜像仓库) | 存镜像的"应用商店" | Docker Hub、私有 Harbor |
一次完整流程(pull 镜像):docker pull nginx → client 把指令发给 daemon → daemon 去 Docker Hub 下载镜像 → 存到本地 → 返回结果给你。
三、镜像 vs 容器(最重要的概念)
| Image 镜像 | Container 容器 | |
|---|---|---|
| 类比 | 类(Class) | 实例(Object) |
| 性质 | 只读模板 | 镜像 + 可写层 |
| 数量 | 1 个镜像可起 N 个容器 | 每个容器独立 |
| 删除 | 不会丢数据(数据在容器里) | 删除容器 = 丢容器内数据(除非挂载卷) |
镜像分层:镜像由多层只读层叠加(App 层 / Runtime 层 / OS 层),容器在镜像之上加一层可写层。所有容器共享同一个镜像的只读层(节省磁盘),各自独立写。
四、Dockerfile 基础
Dockerfile 是构建镜像的脚本——一段一行构建指令:
dockerfile
# 基础镜像(先有 JDK)
FROM eclipse-temurin:17-jdk
# 维护人
LABEL maintainer="BinMaker"
# 把本地 jar 拷进镜像
COPY target/myapp.jar /app.jar
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "/app.jar"]核心指令:
| 指令 | 作用 |
|---|---|
FROM | 基础镜像(所有 Dockerfile 第一个) |
COPY / ADD | 把本地文件拷进镜像 |
RUN | 镜像构建时执行的命令(装依赖) |
ENV | 设置环境变量 |
EXPOSE | 声明容器监听的端口(文档作用) |
CMD / ENTRYPOINT | 容器启动时执行的命令 |
CMD vs ENTRYPOINT:CMD 可被 docker run 覆盖,ENTRYPOINT 不易被覆盖(除非 --entrypoint)。
五、构建 + 运行(一次完整流程)
bash
# 1. 构建镜像(Dockerfile 当前目录)
docker build -t myapp:1.0 .
# 2. 看镜像
docker images
# 3. 运行容器
docker run -d -p 8080:8080 --name myapp myapp:1.0
# -d: 后台运行
# -p 8080:8080: 主机8080映射容器8080
# --name: 容器起个名字
# 4. 看运行中容器
docker ps
# 5. 看容器日志
docker logs myapp
# 6. 进容器内调试
docker exec -it myapp bash
# 7. 停 + 删容器
docker stop myapp
docker rm myapp六、镜像分层和缓存
Docker 构建镜像时每行 Dockerfile 是一层。如果某行没变,下次构建直接复用这层的缓存——所以:
- 改动的行越靠下,重建越快(前面的层都缓存)
- 把不常变的层放前面(装依赖),常变的层放最后(拷代码):
dockerfile
# 好:依赖装在前面(除非 pom.xml 变,否则不重装)
FROM eclipse-temurin:17-jdk
COPY pom.xml .
RUN ./mvnw dependency:go-offline # 依赖装好缓存起来
COPY src ./src # 代码改动只会重 build 这一层
RUN ./mvnw package -DskipTests小结
- Docker 解决"环境一致性问题"——应用 + 依赖打包成镜像
- 架构:Client 发指令 / Daemon 干活 / Registry 存镜像
- 镜像(类) vs 容器(实例),容器是镜像的运行实例
- Dockerfile = 构建脚本,核心指令 FROM/COPY/RUN/EXPOSE/ENTRYPOINT
- 镜像分层 + 缓存:不常变放前、常变放后
下一篇可以看《Docker 常用命令速查》(build/run/exec/logs/network/卷 等命令大全)、《Docker Compose 多容器编排》(docker-compose.yml)。
