Docker知识点总结

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 imagesdocker 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.04FROM 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 cleannpm 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 等日志监控系统。

八、常见问题排查

  1. 容器启动失败 :查看日志 docker logs [容器ID],检查端口占用(netstat -tulpn | grep 端口)、挂载目录权限。
  2. 镜像构建缓慢:更换国内镜像源(如 Docker Hub 镜像加速器、Maven 阿里云仓库)。
  3. 容器间无法通信:确认容器在同一网络(自定义网络优先),检查防火墙规则。
  4. 数据丢失 :确认使用 Volume 而非 Bind Mount(避免宿主机目录误删),定期备份数据卷。
  5. 镜像体积过大:使用分层构建、清理缓存、选择 Alpine 基础镜像。

九、总结

Docker 的核心价值是 **"隔离" 与 "一致"**,通过镜像打包环境,容器运行应用,解决了 "开发环境能跑,生产环境报错" 的经典问题。核心知识点可归纳为:

  • 三大组件:镜像(模板)、容器(实例)、仓库(分发)。
  • 核心工具:Docker CLI(基础操作)、Dockerfile(镜像构建)、Docker Compose(多容器编排)。
  • 关键能力:数据持久化(Volume)、网络隔离(自定义网络)、镜像优化(分层构建)。

实际使用中,需结合场景选择合适的存储、网络模式,遵循安全和优化最佳实践,才能充分发挥 Docker 的优势。

相关推荐
m***567227 分钟前
在Nginx上配置并开启WebDAV服务的完整指南
java·运维·nginx
摸鱼仙人~28 分钟前
Ubuntu系统安装VMware Tools 完整流程(解压→安装)
linux·运维·ubuntu
www327012533 分钟前
项目管理系统打通数字化转型全链路(从需求到交付)的实践路径
运维·项目管理·项目管理系统
源梦想42 分钟前
飞车狂飙动作冒险网页小游戏Linux部署演示
linux·运维·服务器
切糕师学AI1 小时前
如何配置 Typora + PicGo 实现图片自动上传 OSS(阿里云)?
运维·阿里云·云计算
为什么要内卷,摆烂不香吗1 小时前
Linux 宝塔面板快速简单创建自己的网站
运维·服务器·nginx·阿里云
北方的流星1 小时前
华为AC+AP旁挂式三层无线局域网的配置案例
运维·网络·经验分享·华为
新手小白*2 小时前
K8S-Deployment 资源对象
云原生·容器·kubernetes
龙月2 小时前
dozzle监控多节点docker容器日志和指标
docker