Skip to content

这是我学习 Docker 时整理的核心笔记。之前转载的《Docker 是什么》讲了"是什么",这篇讲"怎么用"——核心概念 + Dockerfile 基础 + 一次完整的构建/运行。

一、Docker 在解决什么问题

"在我电脑上能跑"——经典扯皮。开发/测试/生产环境不一致,依赖版本不同,应用就崩。Docker 把应用 + 依赖 + 配置打包成一个标准化的镜像,在任何装了 Docker 的机器上运行结果完全一致

二、Docker 架构(Client/Daemon/Registry)

Docker 核心架构

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)。