Docker知识点全面总结
Docker 知识点全面总结
一、Docker 基础概念
(一)Docker 定义
Docker 是一个开源的容器化平台,它允许开发者将应用程序及其所有依赖项(如库、配置文件等)打包到一个标准化的单元 —— 容器中。容器能够确保应用在任何环境(开发、测试、生产)中都能以相同的方式运行,从根本上解决了 “开发环境能跑,生产环境跑不起来” 的痛点。
(二)Docker 核心优势
-
轻量级:容器与宿主机共享操作系统内核,无需为每个容器单独安装操作系统,相比虚拟机,占用资源更少、启动速度更快(秒级启动)。
-
一致性:通过容器打包,应用及依赖被完整封装,消除了环境差异导致的兼容性问题。
-
可移植性:容器可以在任何支持 Docker 的平台上运行,包括本地机器、云服务器、数据中心等。
-
可扩展性:借助 Docker Swarm 或 Kubernetes 等编排工具,可轻松实现容器的大规模部署和弹性伸缩。
-
隔离性:容器之间通过命名空间(Namespace)和控制组(Cgroups)实现资源隔离,互不干扰,保障应用运行的稳定性。
(三)Docker 与虚拟机的区别
| 特性 | Docker 容器 | 虚拟机(VM) |
|---|---|---|
| 操作系统依赖 | 共享宿主机 OS 内核 | 每个 VM 有独立 OS |
| 资源占用 | 低(MB 级) | 高(GB 级) |
| 启动速度 | 秒级 | 分钟级 |
| 隔离性 | 进程级隔离(中等) | 完全隔离(强) |
| 可移植性 | 高(跨平台兼容) | 较低(依赖虚拟化平台) |
二、Docker 核心组件
(一)Docker 架构
Docker 采用C/S(客户端 - 服务器)架构,主要包含以下部分:
-
Docker Client:Docker 的命令行工具,是用户与 Docker 交互的入口。用户通过执行
docker run、docker build等命令,将请求发送给 Docker Daemon。 -
Docker Daemon(dockerd):运行在宿主机上的后台进程,负责监听 Docker Client 的请求,并管理 Docker 的核心对象(镜像、容器、网络、数据卷等)。
-
Docker Registry:用于存储 Docker 镜像的仓库。分为公有仓库(如 Docker Hub,官方默认仓库)和私有仓库(企业或个人搭建,用于存储内部镜像)。
-
Docker Objects:Docker 操作和管理的核心实体,包括镜像、容器、网络、数据卷、配置等。
(二)核心对象详解
- 镜像(Image)
-
定义:镜像是一个只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。它是创建容器的基础,类似于虚拟机的 “快照” 或 “安装光盘”。
-
特性:只读性(镜像一旦创建,无法修改,若需变更需构建新镜像)、分层存储(基于 Union FS,将镜像分为多个层,不同镜像可共享相同层,节省存储空间)。
-
常见操作:拉取(
docker pull)、构建(docker build)、查看(docker images)、删除(docker rmi)。
- 容器(Container)
-
定义:容器是镜像的运行实例,是一个可执行的包,包含了应用及其运行环境。可以将容器理解为 “动态的镜像”,镜像通过 “运行” 操作转化为容器。
-
特性:可写层(容器在镜像只读层之上添加了一层可写层,所有对容器内文件的修改都发生在这一层)、独立进程(容器内的应用运行在独立的进程空间,与宿主机及其他容器隔离)。
-
生命周期:创建(
docker create)→ 启动(docker start)→ 运行 → 停止(docker stop)→ 删除(docker rm),也可通过docker run直接完成创建并启动。
- 数据卷(Volume)
-
定义:数据卷是宿主机上的一个目录或文件,与容器内的目录或文件关联,用于实现容器与宿主机之间的数据共享,以及容器之间的数据共享。
-
作用:解决容器数据持久化问题(容器删除后,数据卷中的数据不会丢失);避免容器内可写层膨胀,提升性能。
-
类型:匿名卷(创建时未指定名称,由 Docker 自动生成)、具名卷(创建时指定名称,便于管理)、绑定挂载(将宿主机指定路径直接挂载到容器内,灵活性高)。
-
常见操作:创建(
docker volume create)、查看(docker volume ls)、挂载(docker run -v 卷名:容器路径)、删除(docker volume rm)。
- 网络(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 种命名空间:
-
PID Namespace:隔离进程 ID,使容器内的进程 ID 与宿主机及其他容器独立(容器内的第一个进程 ID 为 1)。
-
Mount Namespace:隔离文件系统挂载点,容器内看到的文件系统与宿主机不同。
-
Network Namespace:隔离网络设备、IP 地址、端口等网络资源,每个容器有独立的网络栈。
-
UTS Namespace:隔离主机名和域名,容器可以有自己的主机名。
-
User Namespace:隔离用户和组 ID,容器内的 root 用户在宿主机上可能是普通用户,提升安全性。
-
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 常用命令
(一)镜像相关命令
-
拉取镜像:
docker pull [镜像名]:[标签](如docker pull nginx:latest) -
查看本地镜像:
docker images或docker image ls -
构建镜像:
docker build -t [镜像名]:[标签] [Dockerfile路径](如docker build -t myapp:v1 .,.表示当前目录的 Dockerfile) -
删除镜像:
docker rmi [镜像ID/镜像名](删除前需确保无容器使用该镜像) -
推送镜像到仓库:
docker push [仓库地址/镜像名]:[标签]
(二)容器相关命令
- 创建并启动容器:
docker run [选项] [镜像名] [容器内命令]
-
常用选项:
-
-d:后台运行容器(守护态) -
-p [宿主机端口]:[容器端口]:端口映射(如-p 8080:80将宿主机 8080 端口映射到容器 80 端口) -
-v [卷名/宿主机路径]:[容器路径]:挂载数据卷或绑定目录 -
--name [容器名]:指定容器名称 -
-it:交互式运行(分配终端,可直接进入容器)
-
-
示例:
docker run -d -p 8080:80 --name mynginx nginx
-
查看运行中的容器:
docker ps(-a选项查看所有容器,包括已停止的) -
启动 / 停止 / 重启容器:
docker start [容器ID/容器名]、docker stop [容器ID/容器名]、docker restart [容器ID/容器名] -
进入容器:
docker exec -it [容器ID/容器名] [shell命令](如docker exec -it mynginx /bin/bash) -
查看容器日志:
docker logs [选项] [容器ID/容器名](-f选项实时跟踪日志) -
删除容器:
docker rm [容器ID/容器名](-f选项强制删除运行中的容器)
(三)数据卷相关命令
-
创建数据卷:
docker volume create [卷名] -
查看数据卷:
docker volume ls -
查看数据卷详情:
docker volume inspect [卷名](可查看卷在宿主机的实际路径) -
删除数据卷:
docker volume rm [卷名] -
清理未使用的数据卷:
docker volume prune
(四)网络相关命令
-
查看网络:
docker network ls -
创建网络:
docker network create [选项] [网络名](如docker network create --driver bridge mynetwork) -
查看网络详情:
docker network inspect [网络名] -
连接容器到网络:
docker network connect [网络名] [容器名] -
删除网络:
docker network rm [网络名]
五、Dockerfile 详解
(一)Dockerfile 定义
Dockerfile 是一个包含一系列指令的文本文件,用于自动化构建 Docker 镜像。通过执行docker build命令,Docker 会按照 Dockerfile 中的指令逐步构建出镜像,相比手动创建容器并提交为镜像,更高效、可重复且易于维护。
(二)常用指令
- FROM:指定基础镜像,是 Dockerfile 的第一个指令(除注释外)。
- 示例:
FROM ubuntu:22.04(基于 Ubuntu 22.04 镜像构建)
- WORKDIR:设置后续指令的工作目录(相当于
cd命令),建议使用绝对路径。
- 示例:
WORKDIR /app(后续指令在 /app 目录下执行)
- COPY/ADD:将宿主机文件或目录复制到镜像中。
-
COPY:仅复制文件 / 目录,语法:COPY [源路径] [目标路径] -
ADD:除复制外,还支持解压压缩包(如.tar、.zip)和下载 URL 文件,语法:ADD [源路径] [目标路径] -
示例:
COPY package.json /app/、ADD app.tar.gz /app/
- RUN:在构建镜像过程中执行命令,常用于安装依赖、配置环境等。
-
语法:
RUN [命令](shell 形式)或RUN ["可执行文件", "参数1", "参数2"](exec 形式) -
示例:
RUN apt update && apt install -y nginx(安装 Nginx)
- ENV:设置环境变量,可在构建过程和容器运行时使用。
- 示例:
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64
- EXPOSE:声明容器运行时监听的端口(仅为文档说明,不实际映射端口,需通过
docker run -p实现)。
- 示例:
EXPOSE 80 443(声明容器监听 80 和 443 端口)
- CMD:指定容器启动时执行的命令,一个 Dockerfile 只能有一个 CMD 指令(多个则最后一个生效)。
-
语法:
CMD [命令](shell 形式)或CMD ["可执行文件", "参数1", "参数2"](exec 形式) -
示例:
CMD ["nginx", "-g", "daemon off;"](启动 Nginx 并前台运行)
- ENTRYPOINT:与 CMD 类似,用于指定容器启动的入口命令,但 ENTRYPOINT 的命令不会被
docker run后的命令覆盖(CMD 的命令会被覆盖)。
- 示例:
ENTRYPOINT ["echo"],若执行docker run myimage "hello",则输出hello
(三)构建优化技巧
-
合并 RUN 指令:通过
&&合并多个命令,减少镜像层数(如RUN apt update && apt install -y nginx && rm -rf /var/lib/apt/lists/*)。 -
使用.dockerignore 文件:排除不需要复制到镜像中的文件(如 node_modules、日志文件),减小镜像体积。
-
选择轻量级基础镜像:如使用 Alpine Linux(体积仅几 MB)替代 Ubuntu(体积数百 MB),或使用官方精简镜像(如 nginx:alpine)。
-
利用构建缓存:Docker 构建时会缓存每一层的结果,若指令未变更,直接使用缓存。因此,应将变更频率低的指令(如安装依赖)放在前面,变更频率高的指令(如复制应用代码)放在后面。
六、Docker Compose
(一)Docker Compose 定义
Docker Compose 是 Docker 官方提供的容器编排工具,用于定义和运行多个 Docker 容器组成的应用。通过一个 YAML 文件(默认名为 docker-compose.yml)配置应用的所有服务,然后执行一条命令即可创建并启动所有服务,无需手动逐个管理容器。
(二)安装与基本使用
-
安装:在 Linux 系统中,可通过
curl命令下载二进制文件并安装(具体命令参考 Docker 官方文档);Windows 和 Mac 版 Docker Desktop 已内置 Docker Compose。 -
基本命令:
-
构建并启动服务:
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:
更多推荐



所有评论(0)