Docker容器技术核心知识点精要
学海无涯,志当存远。燃心砺志,奋进不辍。
愿诸君得此鸡汤,如沐春风,事业有成。
若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌!
1. 什么是 Docker 容器?
Docker容器是轻量级、可移植的软件单元,基于Docker镜像创建。它在隔离的进程空间中运行应用程序,包含代码、运行时环境、系统工具和依赖库。容器共享主机操作系统内核,启动快、资源占用低。
2. Docker的应用场景
-
✅ 微服务部署:独立部署/扩展单个服务
-
✅ 持续集成/交付 (CI/CD):标准化构建、测试环境
-
✅ 开发环境统一:解决“在我机器上能运行”问题
-
✅ 云原生应用:Kubernetes等平台的基础单元
-
✅ 快速搭建复杂环境(如数据库、中间件集群)
3. Docker 架构
Docker采用客户端-服务端 (C/S) 架构:
-
Docker Client:用户命令行工具 (
docker) -
Docker Daemon (服务端):管理容器、镜像、网络等核心服务
-
Registry:镜像仓库(如Docker Hub)
-
Containers & Images:容器运行实例及其静态模板
4. Docker 核心组件
| 组件 | 作用 |
|---|---|
| Docker Daemon | 常驻后台进程,管理容器生命周期、镜像存储、网络等 |
| Docker Client | 用户与Daemon交互的接口(CLI或API) |
| Images | 只读模板,包含应用和运行环境(分层存储) |
| Containers | 镜像的运行实例(可读写的容器层) |
| Registry | 镜像仓库(公共如Docker Hub,私有如Harbor) |
| Dockerfile | 定义镜像构建步骤的脚本文件 |
5. 如何调整Docker镜像仓库?
修改镜像源为国内仓库(加速下载):
6. 如何查看Docker相关进程?
7. 虚拟化 vs 容器化区别
| 特性 | 虚拟化 (VM) | 容器化 (Docker) |
|---|---|---|
| 隔离级别 | 硬件级虚拟化 (Hypervisor) | 进程级隔离 (cgroups/namespaces) |
| Guest OS | 每个VM需独立OS内核 | 共享主机OS内核 |
| 启动速度 | 慢(分钟级) | 快(秒级) |
| 资源占用 | 高(内存、CPU冗余) | 低(按需分配) |
| 镜像大小 | GB级 | MB级 |
8. 什么是 Docker Swarm?
Docker Swarm是Docker官方提供的轻量级容器编排工具,用于管理多主机Docker集群。支持:
-
集群节点管理(Manager/Worker)
-
服务部署、滚动更新
-
负载均衡与服务发现
-
故障恢复(自动重启容器)
9. Docker镜像加载原理
-
分层存储 (Layer):
镜像由多层只读文件系统叠加而成(每层对应Dockerfile的一条指令)。 -
联合挂载 (UnionFS):
启动容器时,在镜像层之上添加一个可写层(容器层),所有修改在此层进行。 -
写时复制 (Copy-on-Write):
当修改文件时,从镜像层复制到容器层进行修改,保证底层只读性。
10. 构建Dockerfile流程
-
编写 Dockerfile:
-
构建镜像:
-
运行容器:
11. Docker执行Dockerfile的大致流程
-
解析Dockerfile:逐行读取指令
-
初始化构建环境:创建临时构建上下文
-
执行指令序列:
-
FROM:拉取基础镜像(如未本地存在) -
RUN/COPY/ADD:创建新镜像层执行操作 -
ENV/WORKDIR:设置元数据
-
-
缓存机制:检查指令是否匹配缓存(若相同指令且上下文未变则复用层)
-
生成最终镜像:合并所有层并添加镜像配置(CMD/ENTRYPOINT等)
12. 推送镜像到Registry的命令
需先通过
docker login认证仓库权限
13. Docker镜像是什么?
-
只读模板:包含应用程序代码、依赖库、环境变量和配置文件
-
分层结构:由多个只读层(Layer)叠加组成
-
静态定义:提供容器运行所需的基础文件系统快照
14. 获取镜像的常规操作
标签省略时默认使用
:latest
15. 什么是base镜像?
-
基础镜像:Dockerfile中
FROM指定的初始层 -
最小化OS:通常为精简版操作系统(如
alpine、ubuntu) -
不依赖父镜像:其Dockerfile以
FROM scratch开头(空镜像)
16. Docker镜像分层
-
层级堆叠:每个Dockerfile指令(RUN/COPY等)生成新的只读层
-
联合挂载:启动容器时所有层按顺序挂载为单一文件系统视图
-
唯一ID:每层有独立的哈希标识(内容变更则ID改变)
17. 分层结构的优势
-
存储效率:相同层可被多个镜像/容器共享
-
快速构建:仅重建变更层(利用缓存机制)
-
减小体积:基础层(如OS)只需存储一次
-
版本追踪:层哈希值天然支持镜像版本控制
18. Copy-on-Write (COW)
-
写时复制机制:当容器需要修改文件时:
-
定位文件所在镜像层
-
复制该文件到容器可写层
-
所有修改作用于副本(原始镜像层保持不变)
-
-
关键特性:保证镜像层不可变性,提升资源利用率
19. 请简述Docker中可写的容器层的概念
-
位于镜像层之上:容器启动时创建的空白读写层
-
生命周期:
-
所有文件修改存储于此层(增删改)
-
容器删除时该层销毁(数据不持久化)
-
-
临时性:需通过卷(Volume)或绑定挂载实现数据持久化
20. Commit镜像操作
选项:
-m:提交信息(类似Git commit)
-a:指定作者
21. 使用docker commit手动构建镜像
⚠️ 注意:生产环境推荐使用可复现的Dockerfile而非
commit
22. 什么是Docker引擎?
Docker引擎是核心运行时组件,采用C/S架构:
-
Docker Daemon:常驻后台进程,管理容器生命周期、镜像、网络等
-
Docker Client:用户交互接口(CLI/REST API)
-
containerd:容器运行时(管理容器执行、镜像分发)
-
runc:底层容器运行时(遵循OCI标准创建容器)
23. 访问正在运行的容器
docker exec -it <容器ID或名称> <命令> # 示例:进入容器的bash终端 docker exec -it nginx-container /bin/bash
-i:保持标准输入打开,-t:分配伪终端
24. 列出所有运行中容器
docker ps # 仅显示运行中的容器 docker ps -a # 显示所有容器(包括已停止的)
25. Docker容器生命周期
-
Created:
docker create创建容器(文件系统初始化) -
Running:
docker start/run启动进程 -
Paused:
docker pause暂停进程(CPU/内存冻结) -
Stopped:
docker stop发送SIGTERM优雅终止 -
Restarted:
docker restart重新启动 -
Destroyed:
docker rm删除容器及存储层
26. Docker对象标签(Labels)
-
键值对元数据:附加到镜像/容器/网络等对象
-
作用:
-
分类管理(如
env=prod,team=devops) -
自动化策略(配合监控/日志工具过滤)
-
-
设置方式:
Dockerfile
27. docker create 命令作用
创建容器但不立即启动:
docker create --name temp-container nginx:alpine
-
预分配文件系统(初始化可写层)
-
配置网络/卷等参数
-
需手动执行
docker start启动
28. 查看容器的文件目录
docker exec <容器ID> ls /app # 查看特定目录 docker diff <容器ID> # 查看文件系统变更(A添加/D删除/C修改) # 或进入容器交互终端: docker exec -it <容器ID> /bin/sh
29. 容器与主机间数据拷贝
# 主机 → 容器 docker cp /host/file.txt <容器ID>:/container/path/ # 容器 → 主机 docker cp <容器ID>:/container/logs/ /host/backup/
30. 启动Nginx容器命令
docker run -d --name nginx-server \ -p 8080:80 \ # 指定端口映射(主机8080→容器80) -v $(pwd)/html:/usr/share/nginx/html \ # 挂载本地html目录 nginx:latest
随机端口映射:使用
-P代替-p 8080:80(自动绑定主机随机端口到容器80)
31. Dockerfile常见指令
| 指令 | 用途 |
|---|---|
FROM |
指定基础镜像 |
RUN |
执行命令并创建新层 |
COPY/ADD |
复制文件到镜像 |
CMD |
容器启动默认命令 |
ENTRYPOINT |
容器入口点(可执行文件) |
ENV |
设置环境变量 |
WORKDIR |
设置工作目录 |
EXPOSE |
声明监听端口 |
VOLUME |
定义匿名卷 |
32. Dockerfile指令详解
-
FROM:必须为首条指令,指定构建起点(如ubuntu:22.04) -
RUN:在镜像层执行命令(如RUN apt install -y python3) -
COPY:复制主机文件到镜像(不支持URL解压) -
ADD:类似COPY,但支持URL和自动解压tar包 -
CMD:容器启动时执行的默认命令(可被docker run覆盖) -
ENTRYPOINT:容器的主进程(与CMD配合使用) -
ENV:设置持久化环境变量(如ENV APP_HOME=/app) -
WORKDIR:设置后续指令的工作路径(类似cd)
33. Docker构建流程
-
读取Dockerfile:解析指令序列
-
初始化构建上下文:发送当前目录文件到Daemon
-
逐层构建:
-
检查指令缓存(未命中则执行)
-
RUN/COPY等指令生成新镜像层
-
-
生成最终镜像:添加元数据(CMD/ENV等)并输出镜像ID
34. COPY vs ADD
| 特性 | COPY | ADD |
|---|---|---|
| 复制本地文件 | ✅ | ✅ |
| URL下载 | ❌ | ✅(自动下载到镜像) |
| 自动解压 | ❌ | ✅(支持tar/gzip/bzip2/xz) |
| 最佳实践 | 推荐用于普通文件复制 | 仅需自动解压或远程下载时使用 |
35. Docker Daemon原理
-
常驻进程:
dockerd监听UNIX套接字(/var/run/docker.sock) -
核心功能:
-
镜像管理(构建/拉取/存储)
-
容器生命周期管理(create/start/stop)
-
网络驱动(bridge/host/none等)
-
存储驱动(overlay2、aufs等管理分层)
-
-
依赖组件:将容器操作委托给
containerd和runc
36. Docker vs 传统虚拟机
| 维度 | Docker容器 | 传统虚拟机 |
|---|---|---|
| 虚拟化目标 | 进程级隔离 | 硬件级虚拟化 |
| Guest OS | 共享主机内核 | 独立OS内核(每VM一份) |
| 启动速度 | 秒级 | 分钟级 |
| 资源开销 | 低(无Hypervisor层) | 高(需预留资源) |
| 隔离性 | 较弱(内核共享) | 强(完全隔离) |
37. Docker vs LXC
| 特性 | Docker | LXC (原生Linux容器) |
|---|---|---|
| 核心能力 | 基于LXC改进 | 直接使用cgroups/namespaces |
| 镜像格式 | 分层镜像(UnionFS) | 完整文件系统模板 |
| 可移植性 | 强(跨环境一致) | 弱(依赖主机环境) |
| 生态系统 | 丰富(Hub/K8s集成) | 较简单 |
| 部署单元 | 单进程模型(推荐) | 可运行完整系统 |
38. Docker本地镜像存储位置
-
默认路径:
-
Linux:
/var/lib/docker/image/<存储驱动>/ -
Windows:
C:\ProgramData\docker\windowsfilter\
-
-
关键目录:
-
overlay2/:镜像分层文件(使用overlay2驱动时) -
imagedb/:镜像元数据数据库
-
-
查看命令:
docker info | grep "Docker Root Dir"
39. 启动容器提示"exec format error"的解决方法
原因:
-
镜像架构与宿主机不匹配(如ARM镜像运行在x86主机)
-
Dockerfile中ENTRYPOINT/CMD指向不存在的二进制文件
-
启动脚本格式错误(如Windows换行符在Linux容器运行)
解决步骤:
-
检查镜像架构:
docker inspect --format='{{.Architecture}}' <镜像> -
显式指定平台:
docker run --platform linux/amd64 ... -
验证启动命令:
docker run --entrypoint sh <镜像>进入容器检查 -
转换脚本格式:
dos2unix startup.sh
40. 退出容器bash而不终止容器
使用 分离快捷键:
# 在容器交互终端中按顺序按下 Ctrl + P 然后 Ctrl + Q
直接输入
exit或Ctrl+D会终止容器进程
41. 批量清理临时镜像文件
42. 查看镜像环境变量
43. 容器退出后数据是否丢失?
-
不会立即丢失:
-
停止的容器文件系统仍存在(通过
docker ps -a可见) -
数据存储在容器可写层,直到容器被删除(
docker rm)
-
-
持久化建议:
-
重要数据使用
-v挂载卷(Volume)或绑定目录 -
数据库等有状态服务必须使用持久化存储
-
44. 快速停止所有运行中容器
45. 清理已停止的容器
46. 什么是Docker Hub?
Docker官方的公共镜像仓库:
-
存储海量官方/社区镜像(如nginx, mysql等)
-
提供镜像托管、自动构建、漏洞扫描服务
-
支持免费账户创建私有仓库(1个私有库)
-
访问地址:
47. Docker容器隔离机制
利用Linux内核特性实现隔离:
| 隔离类型 | 技术实现 |
|---|---|
| 进程隔离 | PID Namespace |
| 网络隔离 | Network Namespace |
| 文件系统 | Mount Namespace |
| 用户权限 | User Namespace |
| 资源限制 | cgroups (CPU/内存/IO) |
48. Docker镜像仓库(Repository)
-
逻辑概念:同一镜像的不同版本集合(如
ubuntu仓库包含20.04/22.04等) -
命名规范:
[registry_host]/[namespace]/repository_name:tag -
示例:
docker.io/library/nginx:latest
49. Docker注册服务器(Registry)
-
服务实体:存储和分发镜像的服务器程序
-
类型:
-
公有Registry:Docker Hub, Quay.io
-
私有Registry:Harbor, Docker Registry
-
-
核心功能:处理
docker push/pull请求
50. 什么是Harbor?
VMware开源的企业级私有镜像仓库:
-
核心功能:镜像存储、RBAC权限控制、漏洞扫描
-
扩展特性:镜像复制、Web UI管理、审计日志
-
适用场景:企业CI/CD流水线、合规安全要求高的环境
51. Harbor的特性
-
多租户支持:项目级权限管理
-
漏洞扫描:集成Clair/Trivy
-
镜像签名:Notary组件保障完整性
-
跨仓库复制:多数据中心同步
-
GC机制:自动清理过期镜像
-
LDAP/AD集成:统一身份认证
52. Harbor的构成
| 组件 | 功能 |
|---|---|
| Core | API/UI服务 |
| Registry | 镜像存储(Docker Registry) |
| Job Service | 镜像复制/扫描任务调度 |
| Portal | Web管理界面 |
| Database | 元数据存储(PostgreSQL) |
| Redis | 缓存会话/任务队列 |
53. 给镜像打标签
54. 镜像导入导出
导出镜像:
导入镜像:
55. export/import vs save/load区别
| 命令 | 对象 | 保留信息 | 用途 |
|---|---|---|---|
docker export |
容器 | 仅文件系统(无元数据) | 迁移容器当前状态 |
docker import |
容器→镜像 | 生成新镜像(丢失历史层) | |
docker save |
镜像 | 完整镜像(含所有层和元数据) | 备份/迁移完整镜像 |
docker load |
镜像 | 恢复完整镜像结构 |
56. 非Linux系统运行容器
-
macOS/Windows:
使用Docker Desktop(底层创建Linux虚拟机)-
macOS:HyperKit虚拟化
-
Windows:Hyper-V/WSL2
-
-
关键限制:
只能运行与虚拟机内核兼容的Linux容器
57. docker port映射报错解决
错误原因:
容器未暴露端口或映射配置错误
解决步骤:
-
检查容器是否监听端口:
docker exec <容器> netstat -tuln -
运行容器时显式映射端口:
docker run -p 8080:80 ... -
若使用
-P随机映射,确认Dockerfile有EXPOSE 80
58. 单容器运行多进程
-
可行但违反最佳实践:
-
可通过Supervisor/Systemd管理多进程
-
-
生产环境不推荐:
-
违背单一职责原则
-
日志收集困难
-
故障隔离性差
-
资源限制不精确
-
应拆分为多个容器通过网络通信
59. 控制CPU份额
使用--cpu-shares设置相对权重(默认1024):
60. 控制内存份额
61. 控制磁盘配额
限制容器磁盘空间:
需底层文件系统支持:
-
Devicemapper:直接配置
dm.basesize -
Btrfs/ZFS:原生支持配额
62. "Invalid registry endpoint"错误解决
原因:私有仓库未正确配置
解决:
-
检查仓库地址格式:
http(s)://host:port -
对于非HTTPS仓库,在
/etc/docker/daemon.json添加: -
重启Docker:
systemctl restart docker
63. Docker配置文件
-
主配置文件:
/etc/docker/daemon.json -
修改步骤:
-
编辑配置文件
-
重载配置:
systemctl reload docker -
或重启:
systemctl restart docker
-
-
关键配置项:
64. 更改默认存储路径
-
停止Docker:
systemctl stop docker -
迁移数据:
rsync -av /var/lib/docker/ /new/path -
修改配置:
// /etc/docker/daemon.json { "data-root": "/new/path" } -
重启:
systemctl start docker
65. UnionFS (联合文件系统)
核心机制:
-
将多个目录(层)挂载到单一虚拟文件系统
-
写时复制(CoW):
修改文件时从只读层复制到可写层 -
驱劢实现:
Overlay2(推荐)、AUFS、DeviceMapper
66. 无状态 vs 有状态应用容器化
| 类型 | 适合度 | 示例 | 原因 |
|---|---|---|---|
| 无状态 | ★★★★★ | Web服务、API网关 | 易扩展、无持久化数据依赖 |
| 有状态 | ★★★☆☆ | 数据库、消息队列 | 需持久化存储+稳定网络标识 |
| 最佳实践: |
-
有状态服务需配合持久卷和StatefulSet(K8s)
67. 退出容器时自动删除
运行容器时添加 --rm 参数:
docker run -it --rm ubuntu bash # 容器退出后自动删除
68. 容器退出时数据丢失问题
-
临时容器层数据丢失:默认容器层(可写层)在容器删除后销毁
-
持久化方案:
-
挂载卷(Volume):
-v my_volume:/data -
绑定主机目录:
-v /host/path:/container/path -
共享数据容器:通过
--volumes-from复用
-
69. Docker部署Java服务完整步骤
-
编写Dockerfile:
-
构建镜像:(后面有个点,
.是 Linux/Unix 系统中表示“当前目录”的符号:从当前目录作为构建上下文,读取Dockerfile并构建镜像) -
运行容器:
-
验证:
curl http://localhost:8080/health
70. Docker的CMD指令
-
定义容器默认启动命令:
-
可被覆盖:
docker run <镜像> <新命令> -
与ENTRYPOINT协作:
-
ENTRYPOINT定义固定可执行文件 -
CMD提供默认参数
-
71. Docker Compose
多容器应用编排工具:
-
通过YAML文件定义服务/网络/卷
-
一键启动/停止整个应用栈
-
支持服务依赖、环境变量、扩缩容
-
典型文件:
docker-compose.yml
72. Docker Compose安装
-
Linux安装:
-
验证:
docker-compose --version
73. 修改Docker容器IP范围
-
修改默认网络配置:
-
重启Docker:
systemctl start docker
74. 自定义Docker网络配置
75. 私有仓库开启2375端口(⚠️不安全)
-
修改配置(不推荐暴露端口):
-
重启Docker:
systemctl restart docker
生产环境必须使用TLS加密(端口2376)
76. Docker挂载的三种方式
| 方式 | 命令示例 | 特点 |
|---|---|---|
| 绑定挂载 | -v /host/path:/container/path |
主机目录直接映射(可读写) |
| 卷挂载 | -v my_volume:/container/path |
Docker管理生命周期(推荐) |
| 临时文件系统 | --tmpfs /container/path |
内存存储(重启丢失) |
77. Docker Pull慢的解决
-
配置镜像加速器:
-
重启Docker:
systemctl restart docker
78. Docker中配置Hosts
-
运行时注入:
docker run --add-host db:192.168.1.100 nginx
-
修改容器内部文件:
docker exec -it my-container sh -c "echo '192.168.1.100 db' >> /etc/hosts"
79. 私有仓库自定义端口
启动Registry容器时指定端口:
docker run -d -p 5000:5000 --name registry registry:2
客户端拉取镜像:
docker pull myhost:5000/myimage:tag
80. 容器网络更改
-
断开旧网络:
docker network disconnect bridge my-container
-
连接新网络:
docker network connect my-custom-net my-container
81. 查看容器日志
docker logs my-container # 查看历史日志 docker logs -f my-container # 实时追踪日志 docker logs --tail 100 my-container # 查看最后100行
82. 容器内缺少命令的解决
-
进入容器安装:
-
构建新镜像:
dockerfile
83. 容器文件拷贝与挂载
| 操作 | 命令 |
|---|---|
| 主机→容器拷贝 | docker cp file.txt my-container:/path |
| 容器→主机拷贝 | docker cp my-container:/log.txt ./ |
| 目录挂载 | -v /host/path:/container/path |
84. Docker Compose核心语法
85. 查询镜像版本信息
-
Docker Hub网页搜索
-
API查询:
curl "https://registry.hub.docker.com/v2/repositories/library/nginx/tags/" | jq
-
命令行工具:
docker search nginx --limit 10 # 查看可用版本
86. CMD vs ENTRYPOINT
| 指令 | 是否可覆盖 | 典型用途 |
|---|---|---|
CMD |
✅ (run命令覆盖) | 定义默认参数 |
ENTRYPOINT |
❌ (需--entrypoint覆盖) | 定义容器主程序 |
| 组合使用: |
dockerfile
87. Docker网络模式
| 模式 | 命令参数 | 特点 |
|---|---|---|
| bridge | --net=bridge (默认) |
容器通过网桥连接 |
| host | --net=host |
共享主机网络栈 |
| none | --net=none |
无网络接口 |
| container | --net=container:ID |
共享其他容器网络 |
88. 容器中文乱码解决
-
安装中文字体:dockerfile
RUN apt update && apt install -y fonts-wqy-zenhei
-
设置环境变量:dockerfile
ENV LANG C.UTF-8
-
启动容器时指定:
docker run -e LANG=C.UTF-8 my-image
89. Dockerfile构建异常排查
-
定位失败指令:查看日志中最后执行的步骤
-
进入中间层调试:
docker run -it <失败前镜像ID> sh # 手动执行命令
-
分阶段构建:复杂操作拆分为多个RUN
-
清理缓存重建:
docker build --no-cache .
示例:
RUN apt install失败可尝试先apt update
学海无涯,志当存远。燃心砺志,奋进不辍。
愿诸君得此鸡汤,如沐春风,事业有成。
若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌!
浙公网安备 33010602011771号