docker基础详解
2026-02-14
运维
00
请注意,本文编写于 49 天前,最后修改于 5 天前,其中某些信息可能已经过时。

目录

一、Docker 是什么?容器化技术的革命
1.1 从物理机到容器的演进
1.2 Docker 的诞生与里程碑
1.3 为什么选择 Docker?
二、Docker 核心架构与原理
2.1 整体架构图
2.2 核心技术:Namespace 隔离
2.3 核心技术:Cgroups 资源限制
2.4 镜像分层存储:UnionFS
三、Docker 生态体系
3.1 核心组件演进
3.2 云原生生态关联
3.3 Docker vs Kubernetes 定位
四、Docker 镜像管理详解
4.1 镜像生命周期管理
4.2 镜像导出与迁移
方案一:save/load(完整镜像,含历史和元数据)
方案二:export/import(仅文件系统,无历史和配置)
五、Docker 容器生命周期管理
5.1 创建与启动
5.2 重启策略详解
5.3 容器状态管理
5.4 进入运行中的容器
5.5 日志与监控
5.6 容器清理与维护
六、数据持久化与文件传输
6.1 容器与宿主机文件拷贝
6.2 卷(Volume)管理(推荐的数据持久化)
6.3 绑定挂载 vs 卷 vs tmpfs
七、镜像加速器与生产配置
7.1 国内镜像加速器配置
7.2 生产环境守护进程调优
八、Docker 安全最佳实践
九、命令速查表
十、总结与演进方向

一、Docker 是什么?容器化技术的革命

1.1 从物理机到容器的演进

展开代码
┌────────────────────────────────────────────────────────────────┐ │ 时代一:物理机时代(2000年前) │ │ ├── 一台服务器运行一个应用 │ │ ├── 资源利用率 < 10% │ │ └── 部署周期:数周(采购→上架→装系统→配置环境) │ ├────────────────────────────────────────────────────────────────┤ │ 时代二:虚拟机时代(2000-2013) │ │ ├── 一台物理机运行多个 VM(VMware/KVM/Xen) │ │ ├── 资源利用率提升至 30-50% │ │ ├── 每个 VM 需完整操作系统(GB级镜像) │ │ └── 启动时间:分钟级 │ ├──────────────────────────────────────────────────────────────────┤ │ 时代三:容器时代(2013至今) │ │ ├── 一台物理机运行数百容器,共享宿主机内核 │ │ ├── 资源利用率 > 80% │ │ ├── 镜像仅包含应用+依赖(MB级),秒级启动 │ │ └── 部署周期:秒级,DevOps 成为可能 │ └───────────────────────────────────────────────────────────────────┘

1.2 Docker 的诞生与里程碑

时间事件意义
2008LXC(Linux Containers)发布内核级容器技术雏形
2013.3Docker 0.1 发布(DotCloud公司)首次封装易用工具链
2013.10Docker 0.6 支持非 LXC 驱动解耦底层实现
2014.6Docker 1.0 正式发布生产就绪声明
2015.6OCI(Open Container Initiative)成立容器标准化
2016containerd 捐赠给 CNCF运行时与编排分离
2017Moby 项目拆分社区版 vs 企业版架构
2019Docker Desktop 企业化开发者体验优先

关键人物:Solomon Hykes(Docker 创始人)在 2013 年 PyCon 的 5 分钟闪电演讲,展示了"Build, Ship, Run"理念,引爆容器革命。

1.3 为什么选择 Docker?

对比维度传统虚拟机Docker 容器
启动速度分钟级(需引导完整 OS)秒级(进程级启动)
镜像大小GB 级(完整系统盘)MB 级(仅应用+依赖)
性能损耗10-20%(虚拟化层)< 5%(内核原生支持)
密度单台 10-50 个 VM单台 100-1000 个容器
隔离级别强隔离(硬件虚拟化)进程级隔离(Namespace/Cgroups)
可移植性依赖特定虚拟化平台一次构建,到处运行
版本管理快照笨重分层镜像,版本控制如 Git

二、Docker 核心架构与原理

2.1 整体架构图

展开代码
┌─────────────────────────────────────────────────────────────────┐ │ Docker Client(CLI/GUI) │ │ docker build / run / ps / exec / logs ... │ └─────────────────────────────────────────────────────────────────┘ ↓ HTTP/Unix Socket ┌─────────────────────────────────────────────────────────────────┐ │ Docker Daemon(dockerd) │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │ │ │ Image │ │ Container │ │ Network/Volume/Plugin │ │ │ │ Management │ │ Runtime │ │ Management │ │ │ └─────────────┘ └─────────────┘ └─────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ↓ containerd gRPC ┌─────────────────────────────────────────────────────────────────┐ │ containerd(容器运行时) │ │ 镜像拉取/存储管理 → 解包 → 传递给 runc 执行 │ └─────────────────────────────────────────────────────────────────┘ ↓ OCI Runtime Spec ┌─────────────────────────────────────────────────────────────────┐ │ runc(低层运行时) │ │ 创建 Namespace → 配置 Cgroups → 启动进程 │ └─────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────┐ │ Linux Kernel(Namespace/Cgroups) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ PID NS │ │ NET NS │ │ IPC NS │ │ MNT NS │ 隔离 │ │ │ 进程树 │ │ 网络栈 │ │ 信号量 │ │ 文件系统 │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ Cgroups v1/v2(资源限制) │ │ │ │ CPU/内存/IO/网络带宽/PID 数量限制 │ │ │ └─────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘

2.2 核心技术:Namespace 隔离

Namespace隔离资源系统调用用途
PID进程 IDCLONE_NEWPID容器内 PID 1 是独立进程树
NET网络设备、端口、路由CLONE_NEWNET每个容器独立 IP/网卡
IPC信号量、消息队列、共享内存CLONE_NEWIPC容器间 IPC 隔离
MNT挂载点CLONE_NEWNS容器根文件系统独立
UTS主机名/域名CLONE_NEWUTS容器可设独立 hostname
USER用户/组 IDCLONE_NEWUSERroot 映射为非特权用户
CGROUP控制组信息CLONE_NEWCGROUP隐藏宿主机 cgroup 层级
展开代码
# 查看容器的 Namespace ls -la /proc/$(docker inspect -f '{{.State.Pid}}' container_name)/ns/ # 输出:ipc mnt net pid user uts # 对比宿主机 Namespace ls -la /proc/self/ns/

2.3 核心技术:Cgroups 资源限制

展开代码
# 查看容器 cgroup 配置 docker run -d --name test --memory 512m --cpus 1.5 nginx # 宿主机查看对应 cgroup cat /sys/fs/cgroup/memory/docker/$(docker inspect -f '{{.Id}}' test)/memory.limit_in_bytes # 536870912 = 512MB cat /sys/fs/cgroup/cpu/docker/$(docker inspect -f '{{.Id}}' test)/cpu.cfs_quota_us # 150000 = 1.5 核(每 100ms 周期内可用 150ms)

2.4 镜像分层存储:UnionFS

展开代码
镜像分层结构(以 nginx 为例): ┌─────────────────────────────────────┐ ← 可写层(容器层) │ 容器运行时修改(新增/删除/修改文件) │ Copy-on-Write ├─────────────────────────────────────┤ │ Layer 5: EXPOSE 80 │ 元数据层 ├─────────────────────────────────────┤ │ Layer 4: COPY nginx.conf │ 配置层 ├─────────────────────────────────────┤ │ Layer 3: RUN apt-get install nginx │ 应用层 ├─────────────────────────────────────┤ │ Layer 2: FROM debian:bullseye │ 基础系统层 ├─────────────────────────────────────┤ │ Layer 1: 基础镜像层(scratch) │ 根文件系统 └─────────────────────────────────────┘ 优势: - 分层复用:多个镜像共享基础层,节省磁盘 - 版本控制:每层有唯一哈希,可追溯 - 快速部署:只需拉取变更层

三、Docker 生态体系

3.1 核心组件演进

展开代码
2013-2016: Docker 单体架构 Docker Daemon 包揽所有(构建、运行、网络、卷) 2016-至今: 标准化拆分(OCI 规范) ┌─────────────────────────────────────────┐ │ Docker Desktop / Docker Engine │ ← 用户体验层 ├─────────────────────────────────────────┤ │ Docker CLI + Docker Compose │ ← 客户端工具 ├─────────────────────────────────────────┤ │ Docker Daemon (dockerd) │ ← 守护进程 ├─────────────────────────────────────────┤ │ containerd(CNCF 毕业项目) │ ← 容器运行时管理 ├─────────────────────────────────────────┤ │ runc(OCI 标准实现) │ ← 低层容器创建 ├─────────────────────────────────────────┤ │ Linux Kernel(Namespace/Cgroups) │ ← 系统支持 └─────────────────────────────────────────┘

3.2 云原生生态关联

项目组织与 Docker 关系用途
KubernetesCNCF替代 Docker Swarm 成为编排标准大规模容器编排
containerdCNCFDocker 捐赠,成为 K8s 默认运行时容器生命周期管理
runcOCIDocker 主导开发低层容器创建
BuildKitDocker/MobyDocker 18.09+ 默认构建引擎高效并行镜像构建
PodmanRedHatDocker 兼容替代品无守护进程、rootless
cri-oCNCFKubernetes 专用运行时轻量,仅支持 OCI

3.3 Docker vs Kubernetes 定位

展开代码
┌─────────────────────────────────────────────────────────────┐ │ 开发者视角 │ │ Docker: "我把应用打包成镜像,能在笔记本上跑" │ │ └── Dockerfile → docker build → docker run │ ├─────────────────────────────────────────────────────────────┤ │ 运维视角 │ │ Kubernetes: "我管理1000个容器,自动扩缩容、自愈、灰度发布" │ │ └── Deployment → Service → Ingress → HPA │ ├─────────────────────────────────────────────────────────────┤ │ 关系:Docker 是 K8s 的"运行时"之一(通过 containerd 对接) │ │ K8s 1.24+ 移除 dockershim,直接使用 containerd/CRI-O │ └─────────────────────────────────────────────────────────────┘

四、Docker 镜像管理详解

4.1 镜像生命周期管理

展开代码
# 搜索镜像(Docker Hub 官方仓库) docker search nginx # NAME DESCRIPTION STARS OFFICIAL AUTOMATED # nginx Official build of Nginx. 18000 [OK] # bitnami/nginx Bitnami nginx Docker Image 100 [OK] # 拉取镜像(推荐明确版本标签,避免 latest 陷阱) docker pull nginx:1.24.0-alpine # Alpine 版:轻量、安全,仅 5MB 基础 docker pull nginx:1.24.0 # Debian 版:兼容性好,约 50MB docker pull nginx@sha256:abc123... # 按摘要拉取,确保不可变 # 查看本地镜像 docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" # REPOSITORY TAG SIZE CREATED AT # nginx 1.24.0 52.1MB 2023-10-25 08:23:45 +0000 UTC # mysql 8.0.35 632MB 2023-11-02 14:15:22 +0000 UTC # 查看镜像历史(分析构建过程,排查安全问题) docker history --no-trunc nginx:1.24.0 # IMAGE CREATED BY SIZE COMMENT # 605c77e624dd /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B 元数据层 # <missing> /bin/sh -c #(nop) EXPOSE 80 0B 暴露端口 # <missing> /bin/sh -c #(nop) COPY file:xxx in /etc/nginx 4.2kB 拷贝配置 # <missing> /bin/sh -c apt-get update && apt-get install… 45.6MB 安装软件 # <missing> /bin/sh -c #(nop) FROM debian:bullseye-slim 45.2MB 基础镜像 # 删除镜像(需无容器引用) docker rmi nginx:1.24.0 docker rmi -f nginx:1.24.0 # 强制删除(有容器时也删) # 清理悬空镜像(无标签、无容器引用) docker image prune -f # 清理全部未使用镜像(谨慎!) docker image prune -a -f --filter "until=240h" # 保留10天内使用的

4.2 镜像导出与迁移

方案一:save/load(完整镜像,含历史和元数据)

展开代码
# 导出镜像为 tar 包(适合完整备份、跨平台迁移) docker save mysql:8.0.35 | gzip > mysql-8.0.35.tar.gz # 或保留未压缩格式(更快,但更大) docker save mysql:8.0.35 -o mysql-8.0.35.tar # 查看 tar 包信息 tar -tf mysql-8.0.35.tar | head -20 # manifest.json repositories 各层 tar 文件... # 传输到其他机器后导入 gunzip -c mysql-8.0.35.tar.gz | docker load # 或 docker load -i mysql-8.0.35.tar # 验证导入成功 docker images mysql:8.0.35

方案二:export/import(仅文件系统,无历史和配置)

展开代码
# 从运行容器导出(当前状态的快照) docker run -d --name temp-ubuntu ubuntu:22.04 sleep 3600 docker exec temp-ubuntu apt update docker exec temp-ubuntu apt install -y vim curl # 导出容器当前状态(扁平化) docker export temp-ubuntu -o ubuntu-dev-environment.tar # 仅 180MB,而原镜像+安装层可能 250MB+ # 导入为镜像(注意:会丢失 ENTRYPOINT/CMD/EXPOSE 等元数据!) cat ubuntu-dev-environment.tar | docker import - ubuntu:dev-v1 # 查看导入的镜像(单层,无历史) docker history ubuntu:dev-v1 # IMAGE CREATED CREATED BY SIZE # abc123def456 30 seconds ago 185MB ← 单层,无构建历史 # 必须手动指定启动命令 docker run -it ubuntu:dev-v1 /bin/bash # 或创建新镜像时补充元数据 docker import --change "CMD [\"/bin/bash\"]" --change "EXPOSE 8080" \ ubuntu-dev-environment.tar ubuntu:dev-v2
对比项docker save/loaddocker export/import
导出对象镜像(Image)容器(Container)
包含内容完整分层历史、元数据、配置仅扁平化文件系统
体积较大(保留多层)较小(单层压缩)
元数据保留✅ ENTRYPOINT/CMD/EXPOSE/ENV❌ 需手动指定或重建
使用场景镜像分发、版本归档、合规审计容器迁移、系统模板、取证
安全性可验证每层签名需信任导出时无恶意软件

五、Docker 容器生命周期管理

5.1 创建与启动

展开代码
# 基础运行(前台阻塞,Ctrl+C 停止) docker run nginx:1.24 # 生产标准用法(后台守护 + 命名 + 端口映射 + 卷挂载 + 资源限制) docker run -d \ --name web-nginx \ --hostname nginx-server \ -p 8080:80 \ -p 8443:443 \ -v /host/html:/usr/share/nginx/html:ro \ -v /host/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /host/certs:/etc/nginx/certs:ro \ -e NGINX_WORKER_PROCESSES=auto \ -e TZ=Asia/Shanghai \ --memory 512m \ --memory-swap 512m \ --cpus 1.0 \ --pids-limit 100 \ --restart unless-stopped \ --health-cmd="curl -f http://localhost/ || exit 1" \ --health-interval=30s \ --health-retries=3 \ --security-opt no-new-privileges:true \ --cap-drop ALL \ --cap-add NET_BIND_SERVICE \ nginx:1.24-alpine # 参数详解: # -d, --detach 后台运行(daemon模式) # --name 指定容器名(否则随机生成如:vigilant_babbage) # --hostname 容器内主机名 # -p 宿主机:容器 端口映射(可多次 -p,支持 UDP:-p 53:53/udp) # -v 宿主机:容器[:ro] 卷挂载(ro=只读,rw=读写默认) # -e KEY=VALUE 环境变量 # --memory 内存硬限制(含 --memory-swap 控制交换) # --cpus CPU 核心数限制(1.5 = 1核半) # --restart 重启策略:no|on-failure[:max-retries]|always|unless-stopped # --health-cmd 健康检查命令(支持 HTTP/TCP/自定义) # --security-opt 安全选项(禁止提权、只读根文件系统等) # --cap-drop/add 精简 Linux Capabilities(降权)

5.2 重启策略详解

策略说明使用场景注意事项
no不自动重启(默认)一次性任务、批处理作业需手动管理失败
on-failure退出码非0时重启可能崩溃的应用、依赖外部服务可设最大重试次数
always总是重启关键服务维护时会反复重启,慎用
unless-stopped总是重启,除非手动停止推荐生产使用维护时停止,宿主机重启后恢复
展开代码
# 查看容器重启次数 docker inspect -f '{{.RestartCount}}' web-nginx # 查看最后停止原因 docker inspect -f '{{.State.Error}}' web-nginx

5.3 容器状态管理

展开代码
# 查看运行中容器 docker ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES # a1b2c3d4e5f6 nginx:1.24 "/docker-entrypoint.…" 2 hours ago Up 2 hours (healthy) 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp web-nginx # 查看全部容器(包括已停止) docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # NAMES STATUS PORTS # web-nginx Up 2 hours (healthy) 0.0.0.0:8080->80/tcp # db-mysql Exited (137) 3 hours ago # cache-redis Restarting (1) 5 seconds ago # 启动/停止/重启 docker start web-nginx docker stop web-nginx # 优雅停止:SIGTERM → 10秒 → SIGKILL docker stop -t 60 web-nginx # 延长优雅期到60秒(数据库等需清理场景) docker restart web-nginx # 强制停止(相当于 kill -9,数据可能损坏) docker kill web-nginx docker kill -s SIGTERM web-nginx # 发送特定信号 # 暂停/恢复(冻结进程,内存不释放,用于临时资源让渡) docker pause web-nginx # 所有进程挂起 docker unpause web-nginx # 恢复运行 # 等待容器退出并获取状态码 docker wait web-nginx # 阻塞直到停止,输出退出码

5.4 进入运行中的容器

展开代码
# 方案一:exec 启动新进程(推荐!不影响主进程,随时进入) docker exec -it web-nginx /bin/bash # -i, --interactive 保持 STDIN 打开 # -t, --tty 分配伪终端(支持命令行交互) # 退出方式:exit 或 Ctrl+D → 仅退出 exec 进程,容器继续运行 # 以特定用户身份进入 docker exec -u www-data -it web-nginx /bin/sh # 在容器内执行单条命令(无需交互) docker exec web-nginx nginx -t # 测试配置语法 docker exec web-nginx ps aux # 查看进程 docker exec web-nginx kill -HUP 1 # 发送信号重载配置 # 方案二:attach 附加到主进程(慎用!) docker attach web-nginx # 退出方式: # Ctrl+P,Q 分离(容器继续运行) # Ctrl+C 发送 SIGINT,容器主进程可能退出! # 方案三:nsenter(无需 Docker 客户端,底层调试) # 进入容器的网络命名空间(排查网络问题) nsenter -t $(docker inspect -f '{{.State.Pid}}' web-nginx) -n /bin/bash # 进入容器的所有命名空间(完全等同于容器内) nsenter --target $(docker inspect -f '{{.State.Pid}}' web-nginx) \ --mount --uts --ipc --net --pid -- /bin/bash

5.5 日志与监控

展开代码
# 查看容器日志 docker logs web-nginx docker logs -f web-nginx # 实时跟踪(tail -f 效果) docker logs --tail 100 web-nginx # 最后100行 docker logs --since 10m web-nginx # 最近10分钟 docker logs -t web-nginx # 显示时间戳 docker logs --until 2023-11-01T10:00:00 web-nginx # 直到指定时间 # 清理日志(避免占满磁盘) echo "" | sudo tee $(docker inspect -f '{{.LogPath}}' web-nginx) # 查看容器底层信息(JSON格式,含IP、挂载、环境变量等) docker inspect web-nginx docker inspect -f '{{.NetworkSettings.IPAddress}}' web-nginx # 提取IP docker inspect -f '{{range .Mounts}}{{.Source}} -> {{.Destination}}{{printf "\n"}}{{end}}' web-nginx # 挂载点 docker inspect -f '{{.Config.Env}}' web-nginx # 环境变量 # 实时资源监控 docker stats web-nginx # 实时 CPU/内存/网络/IO docker stats --no-stream # 只输出一次(脚本用) # 容器内进程列表 docker top web-nginx docker top web-nginx -aux # 完整格式

5.6 容器清理与维护

展开代码
# 删除单个容器(需先停止) docker rm web-nginx docker rm -f web-nginx # 强制删除(运行中也删) # 批量删除已停止容器 docker container prune -f # 或旧写法 docker rm $(docker ps -aq -f status=exited) # 删除停止+指定标签的容器 docker ps -aq -f status=exited -f label=env=test | xargs docker rm # 一键清理系统(危险!会删除:) # - 所有停止的容器 # - 所有悬空镜像(无标签) # - 所有未使用卷 # - 所有未使用网络 docker system prune -f # 彻底清理(包括所有未使用镜像,不仅仅是悬空的) docker system prune -a -f --volumes # 查看空间占用详情 docker system df -v # TYPE TOTAL ACTIVE SIZE RECLAIMABLE # Images 15 5 4.234GB 2.891GB (68%) # Containers 8 3 1.234GB 890.5MB (72%) # Local Volumes 12 4 2.456GB 1.789GB (72%) # Build Cache 20 0 1.123GB 1.123GB (100%)

六、数据持久化与文件传输

6.1 容器与宿主机文件拷贝

展开代码
# 宿主机 → 容器(文件或目录) docker cp /host/app.conf web-nginx:/etc/nginx/conf.d/default.conf docker cp ./static-html/ web-nginx:/usr/share/nginx/html/ # 拷贝目录 # 容器 → 宿主机(即使容器已停止也可拷贝!) docker cp web-nginx:/etc/nginx/nginx.conf ./backup/nginx-$(date +%Y%m%d).conf docker cp web-nginx:/var/log/nginx/ ./logs/ # 从已停止容器恢复数据(救命技巧) docker ps -a -f exited=1 -f name=db # 找到崩溃的数据库容器 docker cp $(docker ps -aq -f exited=1 -f name=db):/var/lib/mysql ./recovered-db/ # 通过 tar 流式传输(适合大文件,显示进度) tar -cf - ./data | docker exec -i web-nginx tar -xf - -C /app/data

6.2 卷(Volume)管理(推荐的数据持久化)

展开代码
# 创建命名卷 docker volume create mysql-data docker volume create --driver local \ --opt type=nfs \ --opt o=addr=192.168.1.100,rw \ --opt device=:/path/to/dir \ nfs-volume # NFS 远程卷 # 查看卷详情 docker volume inspect mysql-data # [ # { # "CreatedAt": "2023-11-15T10:30:00Z", # "Driver": "local", # "Labels": null, # "Mountpoint": "/var/lib/docker/volumes/mysql-data/_data", # "Name": "mysql-data", # "Options": null, # "Scope": "local" # } # ] # 使用卷运行容器 docker run -d \ --name mysql-prod \ -v mysql-data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-root \ -e MYSQL_DATABASE=app \ mysql:8.0 \ --default-authentication-plugin=mysql_native_password # 卷备份(方法一:tar 打包) docker run --rm \ -v mysql-data:/data \ -v $(pwd):/backup \ alpine tar czf /backup/mysql-$(date +%Y%m%d).tar.gz -C /data . # 卷备份(方法二:使用卷驱动快照,如 LVM/ceph) docker volume create --driver vieux/sshfs \ -o sshcmd=user@host:/path \ -o password=secret \ ssh-volume # 恢复卷数据 docker run --rm \ -v mysql-data:/data \ -v $(pwd):/backup \ alpine sh -c "cd /data && tar xzf /backup/mysql-20231115.tar.gz" # 清理未使用卷 docker volume ls -f dangling=true docker volume prune -f

6.3 绑定挂载 vs 卷 vs tmpfs

特性绑定挂载(Bind Mount)命名卷(Volume)tmpfs 挂载
语法-v /host/path:/container/path-v vol-name:/path--tmpfs /path
存储位置宿主机任意路径Docker 管理目录(/var/lib/docker/volumes/)宿主机内存
生命周期独立于容器容器删除后保留,需手动删容器停止即消失
备份迁移直接操作文件需 docker cp 或卷插件无需备份
性能依赖宿主机文件系统原生性能,支持驱动扩展内存速度,无磁盘IO
适用场景开发环境代码挂载生产数据持久化敏感数据、临时缓存

七、镜像加速器与生产配置

7.1 国内镜像加速器配置

展开代码
# 创建/编辑配置文件 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json << 'EOF' { "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com", "https://docker.m.daocloud.io" ], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3", "labels": "production_status,environment", "env": "OS_VERSION,CUDA_VERSION" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "live-restore": true, "userland-proxy": false, "no-new-privileges": true, "seccomp-profile": "/etc/docker/seccomp-default.json" } EOF # 重载配置并重启 sudo systemctl daemon-reload sudo systemctl restart docker # 验证加速器生效 docker info | grep -A 10 "Registry Mirrors"

7.2 生产环境守护进程调优

配置项建议值说明
live-restoretrueDocker 重启时容器不停止
userland-proxyfalse减少端口映射性能损耗
no-new-privilegestrue全局禁止容器提权
seccomp-profile自定义系统调用过滤
log-opts.max-size100m防止日志占满磁盘
storage-driveroverlay2当前最佳存储驱动

八、Docker 安全最佳实践

展开代码
# 1. 以非 root 用户运行容器 docker run -d --user 1000:1000 nginx # 2. 只读根文件系统 + 临时可写层 docker run -d --read-only --tmpfs /tmp --tmpfs /var/run nginx # 3. 资源限制防止 DoS docker run -d \ --memory 512m \ --memory-swap 512m \ --cpus 1.0 \ --pids-limit 100 \ --no-new-privileges \ app # 4. 网络隔离(自定义桥接,非默认 bridge) docker network create --driver bridge --subnet 172.28.0.0/16 isolated-net docker run -d --network isolated-net app # 5. 镜像安全扫描 docker scan myimage:latest # 集成 Snyk trivy image myimage:latest # 更全面的开源扫描

九、命令速查表

操作类别命令
镜像管理
搜索docker search nginx
拉取docker pull nginx:1.24
构建docker build -t myapp:v1 .
查看docker images
删除docker rmi nginx:1.24
导出docker save nginx -o nginx.tar
导入docker load -i nginx.tar
容器生命周期
运行docker run -d -p 80:80 --name web nginx
查看运行docker ps
查看全部docker ps -a
进入docker exec -it web /bin/bash
日志docker logs -f web
停止/启动docker stop/start web
删除docker rm web / docker rm -f web
文件与数据
拷贝docker cp web:/etc/nginx/nginx.conf ./
卷创建docker volume create myvol
卷使用docker run -v myvol:/data app
系统维护
清理容器docker container prune -f
清理镜像docker image prune -a -f
全盘清理docker system prune -a --volumes
磁盘使用docker system df -v

十、总结与演进方向

Docker 作为容器化技术的开创者,核心价值在于标准化交付(Build, Ship, Run)。掌握以下关键点,可应对绝大多数生产场景:

  1. 镜像分层:理解 UnionFS,优化 Dockerfile 层缓存
  2. 资源隔离:Namespace + Cgroups 是容器安全的根基
  3. 数据持久化:卷(Volume)优于绑定挂载,生产必备
  4. 健康检查:--health-cmd 实现自 healing
  5. 安全降权:非 root、只读文件系统、Capability 裁剪

未来演进

  • Podman:无守护进程、rootless 容器,逐渐替代 Docker CLI
  • WebAssembly:更轻量的运行时,启动速度比容器快 100x
  • eBPF:内核级可观测性和安全策略,增强容器边界

但无论如何演进,Docker 奠定的容器化思维OCI 标准将持续影响云原生生态十年以上。

本文作者:zzz

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!