一、docker

核心定位:兼顾理论与实操的 Docker 入门到进阶教程,覆盖容器技术从基础到实战的全场景,适合零基础学习者快速掌握容器核心能力。

1. 核心理论体系
  • 容器生态架构:明确容器生态的三层结构(核心技术、平台技术、支持技术),梳理各组件(容器规范、runtime、管理工具等)的定位与关联,帮助学习者建立全局认知。
  • 核心概念解析:深入讲解镜像(只读模板)、容器(镜像运行实例)、仓库(镜像存储场所)三大核心概念,通过与虚拟机的对比,突出容器轻量、高效、可移植的优势。
  • 底层技术原理:揭秘容器实现的核心技术,包括 cgroup(资源限额)与 namespace(资源隔离),解释容器如何实现 CPU、内存等资源控制及独立运行环境隔离。
2. 实操核心流程
  • 环境搭建:详细讲解 CentOS 系统下 Docker 的安装步骤,包括依赖工具安装、镜像源配置(阿里云 / 华为云加速器)、服务启停与验证,解决新手安装痛点。
  • 镜像操作全流程:涵盖镜像的拉取、构建(Dockerfile 指令详解,如 FROM、RUN、COPY 等)、标签管理、本地保存与导入、仓库分发(Docker Hub / 华为云 / 私有仓库 Harbor 部署与使用)。
  • 容器操作实战:包括容器的创建、启动、进入(attach/exec 两种方式对比)、停止、删除、资源限制(CPU / 内存配额)、生命周期管理,结合实操案例讲解容器状态转换逻辑。
  • 网络与存储配置:详解 Docker 三种原生网络(none/host/bridge)的适用场景,自定义网络创建与容器通信配置;深入讲解数据卷(bind mount/docker managed volume)的使用,包括容器与主机、容器间的数据共享,以及数据备份与迁移。
3. 进阶应用与工具
  • 监控与日志:介绍 Docker 自带监控命令(ps/top/stats)、cAdvisor 监控工具,以及容器日志查看(docker logs)与集中式日志管理思路。
  • Docker Compose 编排:讲解多容器应用的定义与运行,通过 docker-compose.yml 配置文件示例,实现 WordPress+MySQL 等多服务协同部署。
  • 图形化管理工具:提供 DockerUI 与 Portainer 的安装与使用步骤,降低可视化管理容器的门槛。
  • 实战案例:包含 WordPress、Ghost 内容管理系统、MySQL 数据库等容器化部署案例,覆盖镜像构建、网络配置、数据持久化等核心场景。

一、Docker 核心命令(高频 + 重点)

Docker 命令核心围绕「镜像管理」「容器操作」「仓库交互」,以下是高频且关键的命令,附场景说明:

命令分类 核心命令 功能说明 实操案例
镜像管理 docker pull 从远程仓库拉取镜像 docker pull nginx:1.24(拉取 nginx 1.24 版本,不指定标签默认 latest)
docker images/docker image ls 查看本地镜像列表(两者等价,推荐后者) docker image ls -a(查看所有镜像,包括临时镜像)
docker rmi/docker image rm 删除本地镜像(需先删除依赖该镜像的容器) docker image rm nginx:1.24docker rmi 镜像ID前3位(ID 可简写)
docker save -o 镜像本地化导出(打包为 tar 文件,用于离线传输) docker save -o nginx1.24.tar nginx:1.24(导出为当前目录的 nginx1.24.tar)
docker load -i 导入本地 tar 包镜像(对应 save 命令,离线部署核心) docker load -i nginx1.24.tar(导入 tar 包,自动恢复镜像名称和标签)
docker tag 为镜像打标签(用于仓库推送、版本管理) docker tag nginx:1.24 192.168.1.100/harbor/nginx:v1(适配 Harbor 仓库路径)
容器操作 docker run 创建并启动容器(最核心命令,参数复杂需重点掌握) docker run -d -p 80:80 --name mynginx nginx:1.24(后台运行、端口映射、命名)
docker ps 查看容器状态(运行中 / 所有) docker ps(运行中容器)、docker ps -a(所有容器,包括停止的)
docker start/stop/restart 启动 / 停止 / 重启容器 docker restart mynginx(按容器名操作,也可使用容器 ID)
docker exec -it 进入运行中的容器(交互模式,用于调试 / 操作容器内文件) docker exec -it mynginx /bin/bash(进入 nginx 容器,执行 bash 命令)
docker rm 删除容器(需先停止容器,强制删除加 -f docker stop mynginx && docker rm mynginxdocker rm -f mynginx(强制删除运行中容器)
docker logs 查看容器日志(排查故障核心) docker logs -f --tail 100 mynginx(实时查看最后 100 行日志)
仓库交互 docker login 登录远程仓库(Docker Hub/Harbor/ 私有仓库) 登录 Harbor:docker login 192.168.1.100 -u 用户名 -p 密码
docker push 推送本地镜像到远程仓库(需先打对应仓库标签) docker push 192.168.1.100/harbor/nginx:v1(推送到 Harbor 的 harbor 项目下)
docker logout 退出远程仓库登录 docker logout 192.168.1.100(退出 Harbor,不指定地址则退出 Docker Hub)
关键命令补充说明:
  1. docker run 核心参数拆解(实操必懂):
    • -d:后台运行( detached 模式,避免占用终端);
    • -p 主机端口:容器端口:端口映射(如 -p 8080:80,外部访问主机 8080 端口即转发到容器 80 端口);
    • --name:指定容器名称(避免自动生成随机名称,方便后续操作);
    • -v 主机目录:容器目录:数据卷挂载(持久化数据,如 -v /data/nginx:/usr/share/nginx/html);
    • --restart=always:容器开机自启(生产环境必备)。
  2. docker save vs docker export(易混淆点):
    • docker save:导出镜像(含完整历史、标签,可导入后直接运行);
    • docker export:导出容器(快照形式,仅保留当前容器状态,导入后为无标签镜像,需重新打标签);
    • 推荐场景:镜像离线传输用 save,容器状态备份用 export

二、镜像本地化与仓库管理(Harbor 核心)

镜像本地化的核心需求是「离线部署」「私有镜像管理」,结合 Harbor 仓库可实现企业级镜像管控,流程如下:

1. 镜像本地化(docker save/load 实操)

场景:无网络环境部署 Docker 镜像,或跨环境传输镜像。

步骤

  1. 有网络环境下拉取并导出镜像:

    docker pull nginx:1.24  # 拉取官方镜像
    docker save -o nginx1.24.tar nginx:1.24  # 导出为tar包
    
  2. 离线环境导入镜像:

    # 复制 tar 包到目标服务器,执行导入
    docker load -i nginx1.24.tar
    # 验证导入结果
    docker image ls | grep nginx  # 应显示 nginx:1.24
    
2. Harbor 私有仓库使用(企业级重点)

Harbor 是 VMware 开源的企业级 Docker 仓库,支持镜像权限控制、漏洞扫描、高可用,核心操作如下:

(1) Harbor 准备
  • 已部署 Harbor 仓库(地址示例:192.168.1.100),创建项目(如 harbor-project,公开 / 私有均可)。
(2) Docker 登录 Harbor
# 登录命令(需输入 Harbor 用户名和密码)
docker login 192.168.1.100
# 成功提示:Login Succeeded

注意:若 Harbor 未配置 HTTPS(测试环境),需修改 Docker 配置文件 /etc/docker/daemon.json,添加信任:

{
  "insecure-registries": ["192.168.1.100"]  # 允许非HTTPS仓库访问
}

修改后重启 Docker:systemctl restart docker

(3) 镜像推送到 Harbor
# 1. 为本地镜像打 Harbor 标签(格式:仓库地址/项目名/镜像名:标签)
docker tag nginx:1.24 192.168.1.100/harbor-project/nginx:v1
# 2. 推送镜像到 Harbor
docker push 192.168.1.100/harbor-project/nginx:v1
(4) 从 Harbor 拉取镜像
# 其他服务器登录 Harbor 后,直接拉取
docker pull 192.168.1.100/harbor-project/nginx:v1

三、Dockerfile 镜像制作(重点 + 实操案例)

Dockerfile 是「镜像构建脚本」,通过指令定义镜像的基础环境、依赖安装、配置文件、启动命令等,是自定义镜像的核心,必须掌握

1. Dockerfile 核心指令(按执行顺序排序)
指令 功能说明 注意事项
FROM 指定基础镜像(必须是 Dockerfile 第一条指令,如 centos、ubuntu、nginx) 推荐使用官方精简镜像(如 alpine 版本,体积小),例:FROM centos:7
WORKDIR 设置容器工作目录(后续命令如 RUN、CMD 均在此目录执行) 避免使用 cd 命令,例:WORKDIR /usr/local/app
COPY/ADD 复制本地文件到镜像中(COPY 仅复制文件,ADD 支持解压压缩包、下载 URL) 例:COPY app.jar /usr/local/app/(复制本地 jar 到镜像)
RUN 构建镜像时执行的命令(如安装依赖、编译代码),每一条 RUN 生成一层镜像 推荐合并命令减少层数,例:RUN yum install -y gcc && make && yum clean all
ENV 设置环境变量(如 JAVA_HOME、端口号) 例:ENV JAVA_HOME /usr/local/jdk1.8
EXPOSE 声明容器暴露的端口(仅文档说明,不实际映射,需 docker run -p 生效) 例:EXPOSE 8080
CMD 容器启动时执行的命令(仅能有一条,多条则最后一条生效,可被 docker run 命令覆盖) 例:CMD ["java", "-jar", "app.jar"](JSON 格式,推荐)
ENTRYPOINT 容器启动入口命令(不可被 docker run 命令覆盖,仅能通过 --entrypoint 参数修改) 例:ENTRYPOINT ["java", "-jar"],启动时可追加参数:docker run 镜像名 app.jar
2. Dockerfile 实操案例(构建 Java 应用镜像)

场景:将 Spring Boot 应用(app.jar)打包为 Docker 镜像,步骤如下:

(1) 目录结构
/app
├── app.jar  # Spring Boot 应用包
└── Dockerfile  # 镜像构建脚本
(2) Dockerfile 内容
# 基础镜像(官方JDK 8精简版,体积小)
FROM openjdk:8-jre-alpine

# 设置工作目录
WORKDIR /usr/local/app

# 复制本地app.jar到镜像中
COPY app.jar ./

# 声明暴露端口(应用端口8080)
EXPOSE 8080

# 容器启动命令(运行Java应用)
CMD ["java", "-jar", "app.jar"]
(3) 构建镜像
# 进入/app目录,执行构建命令
docker build -t my-springboot:v1 .
# 说明:-t 指定镜像名和标签,. 表示Dockerfile所在当前目录
(4) 验证与运行
# 查看构建后的镜像
docker image ls | grep my-springboot

# 启动容器
docker run -d -p 8080:8080 --name myapp my-springboot:v1
3. Dockerfile 优化技巧(生产环境必备)
  • 减少镜像层数:合并 RUN 命令(用 && 连接,末尾清理缓存如 yum clean all);
  • 选择精简基础镜像:优先使用 alpine 版本(如 openjdk:8-jre-alpineopenjdk:8 体积小 90%);
  • 合理使用 .dockerignore:排除不需要复制到镜像的文件(如 .gittarget/*),减少镜像体积;
  • 避免在镜像中存储敏感信息:如密码、密钥,通过 ENV 或数据卷挂载传入。

四、Docker Compose 多容器部署(YAML 配置 + 实操)

Docker Compose 是 Docker 官方的多容器编排工具,通过 docker-compose.yml 文件定义多个容器的依赖关系、网络、数据卷等,实现「一键启动 / 停止」多服务(如前端 + 后端 + 数据库)。

1. Docker Compose 核心流程
  1. 安装 Docker Compose(已集成在 Docker Desktop 中,Linux 需手动安装);
  2. 编写 docker-compose.yml 文件;
  3. 执行 docker-compose up -d 启动所有服务;
  4. 执行 docker-compose down 停止并删除所有服务。
2. docker-compose.yml 核心配置项(分层说明)

docker-compose.yml 采用 YAML 语法,缩进敏感(2 空格),核心配置项如下:

配置层级 关键字 功能说明
顶层 version 指定 Compose 文件版本(需与 Docker 版本兼容,推荐 3.8
services 定义所有服务(每个服务对应一个容器)
services 子层 image 服务使用的镜像(本地或远程)
build 本地构建镜像(指定 Dockerfile 路径,与 image 二选一)
container_name 容器名称
ports 端口映射(格式:主机端口:容器端口
volumes 数据卷挂载(持久化数据,格式:主机目录:容器目录命名卷:容器目录
environment 环境变量(数组或字典格式)
depends_on 服务依赖关系(如 backend 依赖 db,先启动 db 再启动 backend)
networks 配置容器网络(实现服务间通信)
顶层 volumes 定义命名数据卷(全局复用,方便管理)
顶层 networks 定义自定义网络(隔离不同环境的服务)
3. docker-compose.yml 实操案例(前端 + 后端 + MySQL)

场景:部署 Web 应用(Nginx 前端 + Spring Boot 后端 + MySQL 数据库),docker-compose.yml 内容如下:

version: '3.8'

# 定义命名数据卷(持久化MySQL数据)
volumes:
  mysql-data:  # 卷名,后续挂载使用

# 定义自定义网络(服务间通信)
networks:
  app-network:
    driver: bridge

services:
  # MySQL 服务
  mysql:
    image: mysql:8.0
    container_name: app-mysql
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql  # 挂载命名卷,持久化数据
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf  # 挂载配置文件
    environment:
      MYSQL_ROOT_PASSWORD: 123456  #  root密码
      MYSQL_DATABASE: app_db  # 初始化数据库名
    networks:
      - app-network
    restart: always  # 开机自启
    healthcheck:  # 健康检查(确保MySQL启动成功后再启动其他服务)
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-p123456"]
      interval: 10s
      timeout: 5s
      retries: 3

  # Spring Boot 后端服务
  backend:
    image: my-springboot:v1  # 之前构建的Java应用镜像
    container_name: app-backend
    ports:
      - "8080:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/app_db  # 连接MySQL(用服务名作为主机名)
      SPRING_DATASOURCE_USERNAME: root
      SPRING_DATASOURCE_PASSWORD: 123456
    networks:
      - app-network
    restart: always
    depends_on:
      mysql:
        condition: service_healthy  # 依赖MySQL健康检查通过

  # Nginx 前端服务
  frontend:
    image: nginx:1.24
    container_name: app-frontend
    ports:
      - "80:80"
    volumes:
      - ./nginx/html:/usr/share/nginx/html  # 挂载前端静态文件
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf  # 挂载Nginx配置
    networks:
      - app-network
    restart: always
    depends_on:
      - backend  # 依赖后端服务启动
4. Docker Compose 核心命令
# 启动所有服务(后台运行,-d  detached)
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看某个服务日志(如 backend)
docker-compose logs -f backend

# 停止所有服务(保留容器和数据卷)
docker-compose stop

# 停止并删除所有服务、网络(保留数据卷)
docker-compose down

# 停止并删除所有服务、网络、数据卷(彻底清理)
docker-compose down -v

五、容器与虚拟机(VM)的核心区别

容器和虚拟机都是「资源隔离」技术,但底层实现、性能、适用场景差异极大,以下是对比总结:

对比维度 容器(Docker) 虚拟机(VMware/KVM)
底层架构 基于「操作系统级虚拟化」,共享宿主机内核 基于「硬件级虚拟化」,每个 VM 有独立内核、操作系统
启动速度 极快(秒级),无需启动操作系统 较慢(分钟级),需完整启动 OS
资源占用 轻量(MB 级),共享宿主机资源,利用率高 重量级(GB 级),每个 VM 分配独立 CPU、内存、存储
隔离性 弱隔离(共享内核,仅隔离进程、网络、文件系统) 强隔离(完全独立的 OS 环境,安全性更高)
镜像 / 模板 镜像体积小(精简基础镜像),分发、部署高效 虚拟机模板体积大(包含完整 OS),分发耗时
兼容性 受宿主机内核限制(如 Linux 容器不能在 Windows 宿主机运行原生 Linux 内核) 兼容性强(跨内核,Windows VM 可在 Linux 宿主机运行)
适用场景 微服务部署、持续集成 / 持续部署(CI/CD)、应用打包分发 传统应用迁移、需要强隔离的环境(如生产环境数据库)、跨内核场景
核心总结:
  • 容器的核心优势是「轻量、高效、易分发」,适合现代化微服务架构;
  • 虚拟机的核心优势是「强隔离、高兼容」,适合传统应用、需要独立环境的场景;
  • 实际应用中常结合使用:虚拟机作为宿主机,容器在 VM 内部署微服务(兼顾隔离性和灵活性)。

最终总结

Docker 生态的核心围绕「镜像」和「容器」展开,关键知识点可归纳为:

  1. 镜像管理:pull/save/load/tag/push 是离线部署、私有仓库管理的核心;
  2. 镜像制作:Dockerfile 是自定义镜像的基础,掌握核心指令和优化技巧可大幅提升镜像质量;
  3. 多容器编排:Docker Compose 简化多服务部署,docker-compose.yml 配置是重点;
  4. 核心差异:容器与虚拟机的本质区别是「共享内核 vs 独立内核」,决定了两者的适用场景。

二、docker swarm

核心定位:聚焦 Docker 原生集群编排工具 Swarm 的部署与应用,专注解决多主机容器的集群化管理、高可用与弹性伸缩需求。

1. 核心概念与架构
  • 集群核心术语:明确 swarm(Docker 主机集群)、node(集群节点,分 manager/worker 角色)、service(集群中运行的应用服务,定义容器运行规则)的概念与职责。
  • Swarm Mode 特性:说明 Swarm 与 Docker Engine 深度集成的优势,无需额外安装软件,原生支持服务发现、负载均衡、故障自愈等核心能力。
2. 集群部署与运维
  • 集群搭建流程:详细讲解三节点集群(1 个 manager 节点 + 2 个 worker 节点)的搭建步骤,包括 manager 节点初始化、worker 节点加入集群、防火墙配置(信任 zone 设置)。
  • 节点管理操作:涵盖节点状态查看(docker node ls)、节点角色配置(设置 manager 节点为 drain 模式,避免运行服务)、节点故障处理等。
3. 服务部署与核心能力
  • 服务生命周期管理:包括服务创建(docker service create)、副本伸缩(docker service scale)、服务更新(端口映射添加)、服务删除(docker service rm)等操作。
  • 高可用与故障切换:通过模拟 worker 节点宕机场景,验证 Swarm 自动将故障节点上的服务副本调度到其他可用节点的能力,保障服务始终处于期望状态。
  • 服务访问机制:讲解 routing mesh 特性,实现外部网络通过集群中任意节点的映射端口访问服务,结合 ingress 网络(overlay 类型)实现跨主机容器通信。

三、容器管理工具 Containerd

核心定位:深入解析容器运行时工具 Containerd 的技术背景、生态角色与核心价值,聚焦其在云原生生态中的底层支撑作用。

1. 技术背景与演进历程
  • 起源与独立:Containerd 最初是 Docker Engine 的内置组件,2017 年独立开源后捐赠给 CNCF 基金会,成为中立的容器运行时标准组件。
  • 演进动因:为避免 Docker 在容器市场一家独大,适配 Kubernetes 等编排系统的标准化需求,专注于底层容器运行时管理,与 Docker Engine 分工明确(Docker 聚焦开发者体验,Containerd 聚焦底层运行时)。
2. 核心功能与生态定位
  • 核心职责:专注容器运行时的核心操作,包括镜像拉取、容器启停、网络配置、存储管理,依赖 runC 执行容器运行,完全兼容 OCI 规范。
  • 生态角色:不直接面向终端用户,而是作为上层编排系统(Kubernetes、Swarm 等)的底层依赖,通过 gRPC API 提供容器管理能力。
  • 关键优势:轻量稳定、资源占用低,无缝对接 Kubernetes(无需额外垫片 shim 即可适配 CRI 接口),成为云原生生态中容器运行时的主流选择。
3. 与 Docker 的关系
  • 功能拆分:Docker Engine 剥离 Containerd 后,聚焦镜像构建、开发者工具链等上层能力;Containerd 专注底层运行时,负责容器生命周期的核心管理。
  • Kubernetes 适配:由于 Containerd 原生支持 CRI 接口,成为 Kubernetes 推荐的容器运行时,替代了早期依赖垫片对接 Docker 的方案,提升了运行效率与稳定性
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐