Docker 知识点全面总结

一、Docker 基础概念

(一)Docker 定义

Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项(如库、配置文件等)打包到一个标准化的单元 —— 容器中。容器能够确保应用在任何环境(开发、测试、生产)中都能以相同的方式运行,从根本上解决了 “开发环境能跑,生产环境跑不起来” 的痛点。

(二)Docker 核心优势

  1. 轻量级:容器与宿主机共享操作系统内核,无需为每个容器单独安装操作系统,相比虚拟机,占用资源更少、启动速度更快(秒级启动)。

  2. 一致性:通过容器打包,应用及依赖被完整封装,消除了环境差异导致的兼容性问题。

  3. 可移植性:容器可以在任何支持 Docker 的平台上运行,包括本地机器、云服务器、数据中心等。

  4. 可扩展性:借助 Docker Swarm 或 Kubernetes 等编排工具,可轻松实现容器的大规模部署和弹性伸缩。

  5. 隔离性:容器之间通过命名空间(Namespace)和控制组(Cgroups)实现资源隔离,互不干扰,保障应用运行的稳定性。

(三)Docker 与虚拟机的区别

特性Docker 容器虚拟机(VM)
操作系统依赖共享宿主机 OS 内核每个 VM 有独立 OS
资源占用低(MB 级)高(GB 级)
启动速度秒级分钟级
隔离性进程级隔离(中等)完全隔离(强)
可移植性高(跨平台兼容)较低(依赖虚拟化平台)

二、Docker 核心组件

(一)Docker 架构

Docker 采用C/S(客户端 - 服务器)架构,主要包含以下部分:

  1. Docker Client:Docker 的命令行工具,是用户与 Docker 交互的入口。用户通过执行docker rundocker build等命令,将请求发送给 Docker Daemon。

  2. Docker Daemon(dockerd):运行在宿主机上的后台进程,负责监听 Docker Client 的请求,并管理 Docker 的核心对象(镜像、容器、网络、数据卷等)。

  3. Docker Registry:用于存储 Docker 镜像的仓库。分为公有仓库(如 Docker Hub,官方默认仓库)和私有仓库(企业或个人搭建,用于存储内部镜像)。

  4. Docker Objects:Docker 操作和管理的核心实体,包括镜像、容器、网络、数据卷、配置等。

(二)核心对象详解

  1. 镜像(Image)
  • 定义:镜像是一个只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。它是创建容器的基础,类似于虚拟机的 “快照” 或 “安装光盘”。

  • 特性:只读性(镜像一旦创建,无法修改,若需变更需构建新镜像)、分层存储(基于 Union FS,将镜像分为多个层,不同镜像可共享相同层,节省存储空间)。

  • 常见操作:拉取(docker pull)、构建(docker build)、查看(docker images)、删除(docker rmi)。

  1. 容器(Container)
  • 定义:容器是镜像的运行实例,是一个可执行的包,包含了应用及其运行环境。可以将容器理解为 “动态的镜像”,镜像通过 “运行” 操作转化为容器。

  • 特性:可写层(容器在镜像只读层之上添加了一层可写层,所有对容器内文件的修改都发生在这一层)、独立进程(容器内的应用运行在独立的进程空间,与宿主机及其他容器隔离)。

  • 生命周期:创建(docker create)→ 启动(docker start)→ 运行 → 停止(docker stop)→ 删除(docker rm),也可通过docker run直接完成创建并启动。

  1. 数据卷(Volume)
  • 定义:数据卷是宿主机上的一个目录或文件,与容器内的目录或文件关联,用于实现容器与宿主机之间的数据共享,以及容器之间的数据共享。

  • 作用:解决容器数据持久化问题(容器删除后,数据卷中的数据不会丢失);避免容器内可写层膨胀,提升性能。

  • 类型:匿名卷(创建时未指定名称,由 Docker 自动生成)、具名卷(创建时指定名称,便于管理)、绑定挂载(将宿主机指定路径直接挂载到容器内,灵活性高)。

  • 常见操作:创建(docker volume create)、查看(docker volume ls)、挂载(docker run -v 卷名:容器路径)、删除(docker volume rm)。

  1. 网络(Network)
  • 定义:Docker 网络用于实现容器之间、容器与宿主机之间、容器与外部网络之间的通信。

  • 默认网络驱动:

    • bridge:默认网络模式,容器通过网桥连接到宿主机,可通过端口映射与外部通信。

    • host:容器直接使用宿主机的网络命名空间,容器与宿主机共享 IP 和端口,性能最高但隔离性差。

    • none:容器没有网络配置,完全隔离,需手动配置网络。

    • overlay:用于连接多个 Docker 守护进程,实现跨主机的容器通信(常用于 Swarm 集群)。

  • 常见操作:创建网络(docker network create)、查看网络(docker network ls)、连接容器到网络(docker network connect)、删除网络(docker network rm)。

三、Docker 核心技术

(一)Linux 命名空间(Namespace)

命名空间是 Linux 内核提供的一种资源隔离技术,Docker 通过它实现容器的隔离性,主要包含以下 6 种命名空间:

  1. PID Namespace:隔离进程 ID,使容器内的进程 ID 与宿主机及其他容器独立(容器内的第一个进程 ID 为 1)。

  2. Mount Namespace:隔离文件系统挂载点,容器内看到的文件系统与宿主机不同。

  3. Network Namespace:隔离网络设备、IP 地址、端口等网络资源,每个容器有独立的网络栈。

  4. UTS Namespace:隔离主机名和域名,容器可以有自己的主机名。

  5. User Namespace:隔离用户和组 ID,容器内的 root 用户在宿主机上可能是普通用户,提升安全性。

  6. IPC Namespace:隔离进程间通信(如信号量、消息队列),防止容器间未授权的 IPC 通信。

(二)Linux 控制组(Cgroups)

Cgroups(Control Groups)是 Linux 内核的另一个核心功能,用于限制、记录和隔离进程组使用的物理资源(CPU、内存、磁盘 I/O、网络带宽等)。Docker 通过 Cgroups 确保每个容器不会占用过多宿主机资源,避免 “资源争抢” 问题。例如:

  • 限制容器的 CPU 使用率不超过 50%;

  • 限制容器的最大内存使用量为 1GB;

  • 限制容器的磁盘写入速率。

(三)联合文件系统(Union FS)

联合文件系统是一种分层、轻量级且高性能的文件系统,它支持将多个目录(称为 “层”)以只读或读写的方式叠加在一起,形成一个统一的文件系统视图。Docker 利用 Union FS 实现镜像的分层存储和容器的可写层,常见的 Union FS 实现包括 Overlay2(Docker 默认推荐)、AUFS、Device Mapper 等。

四、Docker 常用命令

(一)镜像相关命令

  1. 拉取镜像:docker pull [镜像名]:[标签](如docker pull nginx:latest

  2. 查看本地镜像:docker imagesdocker image ls

  3. 构建镜像:docker build -t [镜像名]:[标签] [Dockerfile路径](如docker build -t myapp:v1 ..表示当前目录的 Dockerfile)

  4. 删除镜像:docker rmi [镜像ID/镜像名](删除前需确保无容器使用该镜像)

  5. 推送镜像到仓库:docker push [仓库地址/镜像名]:[标签]

(二)容器相关命令

  1. 创建并启动容器:docker run [选项] [镜像名] [容器内命令]
  • 常用选项:

    • -d:后台运行容器(守护态)

    • -p [宿主机端口]:[容器端口]:端口映射(如-p 8080:80将宿主机 8080 端口映射到容器 80 端口)

    • -v [卷名/宿主机路径]:[容器路径]:挂载数据卷或绑定目录

    • --name [容器名]:指定容器名称

    • -it:交互式运行(分配终端,可直接进入容器)

  • 示例:docker run -d -p 8080:80 --name mynginx nginx

  1. 查看运行中的容器:docker ps-a选项查看所有容器,包括已停止的)

  2. 启动 / 停止 / 重启容器:docker start [容器ID/容器名]docker stop [容器ID/容器名]docker restart [容器ID/容器名]

  3. 进入容器:docker exec -it [容器ID/容器名] [shell命令](如docker exec -it mynginx /bin/bash

  4. 查看容器日志:docker logs [选项] [容器ID/容器名]-f选项实时跟踪日志)

  5. 删除容器:docker rm [容器ID/容器名]-f选项强制删除运行中的容器)

(三)数据卷相关命令

  1. 创建数据卷:docker volume create [卷名]

  2. 查看数据卷:docker volume ls

  3. 查看数据卷详情:docker volume inspect [卷名](可查看卷在宿主机的实际路径)

  4. 删除数据卷:docker volume rm [卷名]

  5. 清理未使用的数据卷:docker volume prune

(四)网络相关命令

  1. 查看网络:docker network ls

  2. 创建网络:docker network create [选项] [网络名](如docker network create --driver bridge mynetwork

  3. 查看网络详情:docker network inspect [网络名]

  4. 连接容器到网络:docker network connect [网络名] [容器名]

  5. 删除网络:docker network rm [网络名]

五、Dockerfile 详解

(一)Dockerfile 定义

Dockerfile 是一个包含一系列指令的文本文件,用于自动化构建 Docker 镜像。通过执行docker build命令,Docker 会按照 Dockerfile 中的指令逐步构建出镜像,相比手动创建容器并提交为镜像,更高效、可重复且易于维护。

(二)常用指令

  1. FROM:指定基础镜像,是 Dockerfile 的第一个指令(除注释外)。
  • 示例:FROM ubuntu:22.04(基于 Ubuntu 22.04 镜像构建)
  1. WORKDIR:设置后续指令的工作目录(相当于cd命令),建议使用绝对路径。
  • 示例:WORKDIR /app(后续指令在 /app 目录下执行)
  1. COPY/ADD:将宿主机文件或目录复制到镜像中。
  • COPY:仅复制文件 / 目录,语法:COPY [源路径] [目标路径]

  • ADD:除复制外,还支持解压压缩包(如.tar、.zip)和下载 URL 文件,语法:ADD [源路径] [目标路径]

  • 示例:COPY package.json /app/ADD app.tar.gz /app/

  1. RUN:在构建镜像过程中执行命令,常用于安装依赖、配置环境等。
  • 语法:RUN [命令](shell 形式)或RUN ["可执行文件", "参数1", "参数2"](exec 形式)

  • 示例:RUN apt update && apt install -y nginx(安装 Nginx)

  1. ENV:设置环境变量,可在构建过程和容器运行时使用。
  • 示例:ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
  1. EXPOSE:声明容器运行时监听的端口(仅为文档说明,不实际映射端口,需通过docker run -p实现)。
  • 示例:EXPOSE 80 443(声明容器监听 80 和 443 端口)
  1. CMD:指定容器启动时执行的命令,一个 Dockerfile 只能有一个 CMD 指令(多个则最后一个生效)。
  • 语法:CMD [命令](shell 形式)或CMD ["可执行文件", "参数1", "参数2"](exec 形式)

  • 示例:CMD ["nginx", "-g", "daemon off;"](启动 Nginx 并前台运行)

  1. ENTRYPOINT:与 CMD 类似,用于指定容器启动的入口命令,但 ENTRYPOINT 的命令不会被docker run后的命令覆盖(CMD 的命令会被覆盖)。
  • 示例:ENTRYPOINT ["echo"],若执行docker run myimage "hello",则输出hello

(三)构建优化技巧

  1. 合并 RUN 指令:通过&&合并多个命令,减少镜像层数(如RUN apt update && apt install -y nginx && rm -rf /var/lib/apt/lists/*)。

  2. 使用.dockerignore 文件:排除不需要复制到镜像中的文件(如 node_modules、日志文件),减小镜像体积。

  3. 选择轻量级基础镜像:如使用 Alpine Linux(体积仅几 MB)替代 Ubuntu(体积数百 MB),或使用官方精简镜像(如 nginx:alpine)。

  4. 利用构建缓存:Docker 构建时会缓存每一层的结果,若指令未变更,直接使用缓存。因此,应将变更频率低的指令(如安装依赖)放在前面,变更频率高的指令(如复制应用代码)放在后面。

六、Docker Compose

(一)Docker Compose 定义

Docker Compose 是 Docker 官方提供的容器编排工具,用于定义和运行多个 Docker 容器组成的应用。通过一个 YAML 文件(默认名为 docker-compose.yml)配置应用的所有服务,然后执行一条命令即可创建并启动所有服务,无需手动逐个管理容器。

(二)安装与基本使用

  1. 安装:在 Linux 系统中,可通过curl命令下载二进制文件并安装(具体命令参考 Docker 官方文档);Windows 和 Mac 版 Docker Desktop 已内置 Docker Compose。

  2. 基本命令:

  • 构建并启动服务:docker-compose up-d选项后台运行)

  • 停止并删除服务、网络、容器:docker-compose down

  • 查看服务状态:docker-compose ps

  • 查看服务日志:docker-compose logs [服务名]

  • 进入服务容器:docker-compose exec [服务名] [shell命令]

(三)docker-compose.yml 核心配置

version: '3.8'  # Compose文件版本(需与Docker版本匹配)

services:  # 定义服务列表

  web:  # 服务名(自定义)

    build: .  # 构建镜像的Dockerfile路径

    image: mywebapp:v1  # 服务使用的镜像(若指定build,可省略)

    ports:  # 端口映射

      \- "8080:80"

    volumes:  # 数据卷挂载

      \- appdata:/app/data

      \- ./config:/app/config

    environment:  # 环境变量

      \- DB\_HOST=db

      \- DB\_PORT=3306

    depends\_on:  # 服务依赖(web服务依赖db服务,启动时先启动db)

      \- db

  db:  # 另一个服务(数据库)

    image: mysql:8.0

    volumes:

      \- dbdata:/var/lib/mysql

    environment:

      \- MYSQL\_ROOT\_PASSWORD=123456

      \- MYSQL\_DATABASE=mydb

volumes:  # 定义数据卷(与services同级)

  appdata:

  dbdata:
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐