Docker 核心知识点总结
Docker 是一款开源的容器化平台,核心目标是 **"一次构建,到处运行"**,通过隔离应用及其依赖,解决环境一致性、部署复杂等问题。以下是 Docker 核心知识点的系统梳理,涵盖基础概念、核心操作、进阶特性及最佳实践。
一、核心概念
1. 三大核心组件
| 组件 | 定义 | 核心特点 |
|---|---|---|
| 镜像(Image) | 容器的 "模板",包含运行应用所需的代码、依赖、环境变量、配置文件等(只读) | 分层存储(UnionFS)、不可修改、可通过 Dockerfile 构建或从仓库拉取 |
| 容器(Container) | 镜像的 "运行实例",是独立运行的应用单元(可读写层 + 镜像只读层) | 轻量级(共享宿主机内核)、隔离性(PID / 网络 / 文件系统)、可启停 / 删除 / 提交 |
| 仓库(Registry) | 存储和分发镜像的平台(类似代码仓库 Git) | 公开仓库(Docker Hub)、私有仓库(企业内部搭建)、支持镜像版本标签管理 |
2. 其他关键概念
- Docker Daemon:Docker 后台守护进程,负责管理镜像、容器、网络等资源(客户端通过 Docker CLI 与之通信)。
- Docker Client :命令行工具(
docker命令),是用户与 Docker Daemon 交互的入口。 - Docker Compose :多容器编排工具,通过
docker-compose.yml定义多个容器的依赖关系、网络、卷等,一键启停。 - Docker Swarm:Docker 原生的容器集群编排工具(轻量级,适用于中小型集群,与 Kubernetes 互补)。
- 卷(Volume):持久化存储容器数据的机制,独立于容器生命周期(容器删除后数据不丢失)。
- 网络(Network):Docker 提供的网络隔离能力,支持容器间、容器与宿主机 / 外部网络的通信。
二、基础操作(Docker CLI 核心命令)
1. 镜像操作
| 功能 | 命令 |
|---|---|
| 拉取镜像 | docker pull [镜像名]:[标签](例:docker pull nginx:1.24) |
| 查看本地镜像 | docker images 或 docker image ls |
| 构建镜像(从 Dockerfile) | docker build -t [镜像名]:[标签] [Dockerfile 所在目录](例:docker build -t myapp:v1 .) |
| 推送镜像到仓库 | docker push [仓库地址/镜像名]:[标签](例:docker push username/myapp:v1) |
| 删除本地镜像 | docker rmi [镜像ID/镜像名](需先删除依赖该镜像的容器) |
| 导出 / 导入镜像 | 导出:docker save -o [文件名.tar] [镜像名];导入:docker load -i [文件名.tar] |
2. 容器操作
| 功能 | 命令 |
|---|---|
| 新建并启动容器 | docker run [选项] [镜像名] [命令](核心选项见下文) |
| 查看运行中的容器 | docker ps;查看所有容器(含停止):docker ps -a |
| 启动 / 停止 / 重启容器 | docker start [容器ID/名称]、docker stop [容器ID/名称]、docker restart [容器ID/名称] |
| 进入运行中的容器 | 交互模式:docker exec -it [容器ID] /bin/bash(-it:交互式 + 终端) |
| 查看容器日志 | docker logs [容器ID](-f:实时跟踪,--tail 100:查看最后 100 行) |
| 查看容器详情 | docker inspect [容器ID/名称](网络、存储、环境变量等) |
| 删除容器 | docker rm [容器ID](强制删除运行中容器:docker rm -f [容器ID]) |
| 容器提交为镜像 | docker commit [容器ID] [新镜像名]:[标签](适用于临时定制镜像) |
docker run 核心选项
-d:后台运行(守护模式)。-p 主机端口:容器端口:端口映射(例:-p 8080:80映射 nginx 端口)。-v 主机目录:容器目录:挂载数据卷(持久化数据,例:-v /host/data:/container/data)。-e KEY=VALUE:设置环境变量(例:-e MYSQL_ROOT_PASSWORD=123456)。--name 容器名:指定容器名称(例:--name mynginx)。--link 其他容器名:容器间网络关联(已过时,推荐用自定义网络)。
三、镜像构建:Dockerfile 详解
Dockerfile 是构建镜像的 "脚本文件",通过指令定义镜像的分层结构,推荐优先使用 Dockerfile 而非 docker commit(可复用、可版本控制)。
1. 核心指令(按执行顺序)
| 指令 | 功能说明 | 示例 |
|---|---|---|
FROM |
指定基础镜像(必须是第一个指令) | FROM ubuntu:22.04 或 FROM nginx:alpine |
WORKDIR |
设置容器启动后的工作目录(后续指令在此目录执行) | WORKDIR /app |
COPY |
从宿主机复制文件 / 目录到镜像中(仅复制文件,不解析变量) | COPY ./app.jar /app/app.jar |
ADD |
类似 COPY,支持解压压缩包、拉取网络文件(慎用网络文件) |
ADD ./app.tar.gz /app |
RUN |
构建镜像时执行的命令(每一条 RUN 生成一层镜像) |
RUN apt update && apt install -y curl |
ENV |
设置环境变量(全局生效,可被后续指令和容器运行时使用) | ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk |
EXPOSE |
声明容器对外暴露的端口(仅文档说明,不实际映射,需配合 docker run -p) |
EXPOSE 8080 |
CMD |
容器启动时执行的命令(仅最后一条生效,可被 docker run 命令覆盖) |
CMD ["java", "-jar", "app.jar"](JSON 格式推荐) |
ENTRYPOINT |
容器启动时的 "入口命令"(不可被覆盖,docker run 后续参数作为其参数) |
ENTRYPOINT ["java", "-jar"] + CMD ["app.jar"] |
VOLUME |
声明数据卷(指定容器内需要持久化的目录,运行时自动创建匿名卷) | VOLUME ["/data"] |
USER |
指定镜像运行时的用户(非 root 用户更安全) | USER appuser |
2. Dockerfile 最佳实践
- 基础镜像优先选择 Alpine 版本 (体积小,例:
nginx:alpine仅 5MB 左右)。 - 合并
RUN指令(减少镜像层数),例:RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/*(清理缓存减少体积)。 - 避免在镜像中存储敏感信息(如密码、密钥),通过
ENV或外部挂载传入。 - 使用
.dockerignore文件排除不需要复制到镜像的文件(如node_modules、.git)。 - 尽量使用
COPY而非ADD(功能更明确,避免意外解压)。
四、数据持久化:Volume 与 Bind Mount
容器默认存储在 "可写层",容器删除后数据丢失,需通过以下方式持久化:
1. 三种存储方式对比
| 类型 | 特点 | 适用场景 |
|---|---|---|
| Bind Mount(绑定挂载) | 直接挂载宿主机目录到容器,路径需手动指定 | 开发环境(共享代码)、配置文件 |
| Volume(数据卷) | Docker 管理的存储目录(/var/lib/docker/volumes/),与容器解耦 |
生产环境(数据库数据、应用日志) |
| tmpfs Mount(临时文件系统) | 数据存储在宿主机内存,容器停止后数据丢失 | 临时缓存、敏感数据(不持久化) |
2. 核心操作
- 创建数据卷:
docker volume create myvolume - 挂载数据卷运行容器:
docker run -v myvolume:/container/data [镜像名] - 查看数据卷详情:
docker volume inspect myvolume - 删除数据卷:
docker volume rm myvolume(需先停止使用该卷的容器)
五、网络配置
Docker 提供多种网络模式,实现容器间、容器与外部的通信隔离。
1. 四种网络模式
| 模式 | 特点 | 适用场景 |
|---|---|---|
| bridge(默认) | 容器连接到 Docker 虚拟网桥,通过端口映射与宿主机通信 | 大多数单机场景(容器间可通过 IP 通信) |
| host | 容器共享宿主机网络命名空间(无端口映射,直接使用宿主机端口) | 性能优先场景(需避免端口冲突) |
| none | 容器无网络配置(完全隔离) | 无需网络的离线任务 |
| container | 共享其他容器的网络命名空间(与目标容器共用 IP 和端口) | 多容器协同(如应用 + Sidecar) |
2. 自定义网络(推荐)
默认 bridge 网络需通过 --link 关联容器,自定义网络支持容器名直接通信:
- 创建自定义桥接网络:
docker network create mynet - 运行容器时加入网络:
docker run --network mynet --name app1 [镜像名] - 同一网络下的容器可通过名称 ping 通(例:
ping app1)
六、Docker Compose 多容器编排
当应用依赖多个服务(如前端、后端、数据库、缓存)时,用 Docker Compose 简化部署:
1. 核心文件:docker-compose.yml(YAML 格式)
示例(SpringBoot + MySQL + Redis):
yaml
version: '3.8' # Compose 文件版本(需与 Docker 版本兼容)
services:
app: # 服务名(容器间可通过该名称通信)
build: ./app # 本地 Dockerfile 目录(或用 image 指定镜像)
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
- SPRING_REDIS_HOST=redis
depends_on: # 依赖顺序(先启动 db 和 redis,再启动 app)
- db
- redis
db:
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=mydb
volumes:
- mysql-data:/var/lib/mysql # 数据卷持久化
redis:
image: redis:alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
volumes: # 声明数据卷(自动创建)
mysql-data:
redis-data:
2. Compose 核心命令
- 启动所有服务:
docker-compose up -d(-d后台运行) - 查看服务状态:
docker-compose ps - 查看日志:
docker-compose logs -f [服务名](例:docker-compose logs -f app) - 停止并删除容器 / 网络:
docker-compose down(保留数据卷) - 停止并删除所有(含数据卷):
docker-compose down -v
七、进阶特性与最佳实践
1. 镜像优化
-
分层构建(Multi-stage Build):仅保留运行时必需的文件,减少镜像体积。示例: dockerfile
# 构建阶段(编译Java代码) FROM maven:3.8-openjdk-17 AS builder WORKDIR /app COPY pom.xml . COPY src ./src RUN mvn package -DskipTests # 运行阶段(仅保留jar包) FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=builder /app/target/app.jar ./app.jar CMD ["java", "-jar", "app.jar"] -
清理无用文件:
RUN指令末尾删除缓存(如apt clean、npm cache clean)。
2. 安全最佳实践
- 非 root 用户运行容器:在 Dockerfile 中创建普通用户并切换(
USER指令)。 - 限制容器权限:
docker run --privileged=false(禁用特权模式)、添加--read-only(只读文件系统,仅数据卷可写)。 - 扫描镜像漏洞:使用
docker scan [镜像名](需安装 Docker Scout)或第三方工具(如 Trivy)。 - 避免在镜像中存储敏感信息:通过环境变量、Docker Secrets(Swarm 模式)或外部配置中心传入。
3. 生产环境部署要点
- 镜像版本固定:避免使用
latest标签(可能导致版本不一致),指定具体版本(如nginx:1.24.0)。 - 资源限制:
docker run --memory=2g --cpus=1(限制容器最大内存和 CPU 核心)。 - 健康检查:Dockerfile 中添加
HEALTHCHECK指令,或docker run --health-cmd,监控容器状态。 - 日志收集:将容器日志挂载到宿主机,或集成 ELK、Prometheus 等日志监控系统。
八、常见问题排查
- 容器启动失败 :查看日志
docker logs [容器ID],检查端口占用(netstat -tulpn | grep 端口)、挂载目录权限。 - 镜像构建缓慢:更换国内镜像源(如 Docker Hub 镜像加速器、Maven 阿里云仓库)。
- 容器间无法通信:确认容器在同一网络(自定义网络优先),检查防火墙规则。
- 数据丢失 :确认使用
Volume而非Bind Mount(避免宿主机目录误删),定期备份数据卷。 - 镜像体积过大:使用分层构建、清理缓存、选择 Alpine 基础镜像。
九、总结
Docker 的核心价值是 **"隔离" 与 "一致"**,通过镜像打包环境,容器运行应用,解决了 "开发环境能跑,生产环境报错" 的经典问题。核心知识点可归纳为:
- 三大组件:镜像(模板)、容器(实例)、仓库(分发)。
- 核心工具:Docker CLI(基础操作)、Dockerfile(镜像构建)、Docker Compose(多容器编排)。
- 关键能力:数据持久化(Volume)、网络隔离(自定义网络)、镜像优化(分层构建)。
实际使用中,需结合场景选择合适的存储、网络模式,遵循安全和优化最佳实践,才能充分发挥 Docker 的优势。