目录
基本概念
一、Docker技术原理
1. 操作系统级虚拟化
2. 联合文件系统(UnionFS)
3. 客户端-服务端架构
二、Docker核心特性
1. 轻量高效
2. 标准化交付
3. 隔离与安全
4. 生态集成
三、Docker的战略意义
1. 技术变革
2. 经济价值
3. 行业标准
四、典型应用场景
基本部署
一、核心组件安装
1. Ubuntu 22.04 安装 46
2. CentOS 8 安装 6
二、核心操作命令解析
1. 镜像管理 25
2. 容器生命周期 15
3. 存储卷管理 78
4. 网络配置 7
三、生产级部署案例:Nginx 集群 45
四、关键配置调优
1. 守护进程配置 /etc/docker/daemon.json 6
2. 安全增强 8
五、部署验证与监控
基本命令解析
一、容器生命周期管理
1. docker run 容器创建与启动 14
2. docker exec 容器内执行命令 56
二、镜像管理
1. docker build 镜像构建 23
2. docker push 镜像发布 27
三、网络与存储
1. docker network 网络配置 79
2. docker volume 数据卷管理 78
四、运维监控
1. docker logs 日志查看 58
2. docker stats 资源监控 68
五、组合命令示例
批量清理无用容器 38
扩展
一、容器全生命周期管理
1. 高级容器启动 (docker run)
2. 容器热更新流程
二、镜像构建深度解析
1. 多阶段构建 (Multi-stage Build)
2. 构建缓存控制
三、网络拓扑实战
1. 自定义Overlay网络
2. 容器网络诊断
四、存储卷高级用法
1. 数据卷备份恢复
2. 存储驱动选择
五、安全加固命令
1. 用户命名空间隔离
2. 安全扫描
六、编排预处理命令
1. Docker Compose部署
2. Kubernetes准备
选项解析
一、容器生命周期管理
1. docker run 关键选项
2. docker exec 高级用法
二、镜像构建与维护
1. docker build 进阶参数
2. docker push 认证控制
三、网络与存储配置
1. 网络驱动选项
2. 存储卷高级参数
四、系统级管理命令
1. docker system 维护工具
2. 日志驱动配置
基本概念
一、Docker技术原理
1. 操作系统级虚拟化
Docker基于Linux内核的cgroups
(控制组)和namespaces
(命名空间)实现资源隔离,通过共享宿主机内核避免完整操作系统虚拟化开销。其架构分为:
- 容器运行时:
runc
遵循OCI标准创建容器进程 - 容器管理层:
containerd
管理镜像与容器生命周期 - 镜像构建层:
BuildKit
解析Dockerfile构建镜像
2. 联合文件系统(UnionFS)
采用写时复制(Copy-on-Write)机制,多层镜像通过AUFS/Overlay2叠加为单一视图,实现高效存储。
3. 客户端-服务端架构
graph LR CLI-->|REST API|Daemon-->Containers Daemon-->Images Daemon-->Network
二、Docker核心特性
1. 轻量高效
指标 | Docker容器 | 传统虚拟机 |
---|
启动时间 | 秒级 | 分钟级 |
内存占用 | MB级 | GB级 |
性能损耗 | <5% | 15%-20% |
2. 标准化交付
- 镜像封装:包含应用代码、运行时、库文件及配置,形成不可变交付单元
- Dockerfile:声明式构建脚本,支持版本控制与自动化构建
3. 隔离与安全
- 命名空间隔离:PID/Network/Mount等6种命名空间实现资源隔离
- 安全增强:Seccomp限制系统调用,AppArmor/SELinux提供强制访问控制
4. 生态集成
- 编排工具:Kubernetes/Swarm实现容器集群管理
- CI/CD流水线:与Jenkins/GitLab CI深度集成
三、Docker的战略意义
1. 技术变革
- 解决环境一致性:消除"开发-生产"环境差异,故障率降低70%
- 推动云原生:成为微服务/Serverless的基础运行时,支撑K8s等平台
2. 经济价值
场景 | 效益 | 典型案例 |
---|
企业私有云 | 硬件利用率提升3-5倍 | 沃尔玛年省$4000万许可费 |
边缘计算 | 部署成本降低60% | 特斯拉车载应用更新 |
3. 行业标准
- OCI开放标准:主导容器运行时与镜像格式规范化
- 混合云桥梁:实现跨公有云/私有云的无缝应用迁移
四、典型应用场景
- 微服务架构:每个服务独立容器化,如Netflix万级容器集群
- 持续交付:Git提交触发自动构建→测试→部署流水线
- 高密度部署:单物理机运行数百容器(如阿里云Serverless)
数据验证:2025年全球83%的企业已采用容器技术,其中Docker占比达76%(来源:Gartner)
基本部署
一、核心组件安装
1. Ubuntu 22.04 安装
# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg
# 添加官方GPG密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 设置仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2. CentOS 8 安装
# 添加yum仓库
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装核心组件
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 启动服务
sudo systemctl enable --now docker
二、核心操作命令解析
1. 镜像管理
命令 | 功能说明 | 示例 |
---|
docker pull | 拉取镜像 | docker pull nginx:1.25-alpine |
docker build | 构建镜像 | docker build -t myapp:v1 . |
docker images | 列出本地镜像 | docker images --format "table {{.ID}}\t{{.Repository}}" |
docker rmi | 删除镜像 | docker rmi $(docker images -q) |
2. 容器生命周期
# 启动容器 (-d: 后台运行, -p: 端口映射)
docker run -d --name web -p 8080:80 nginx:alpine
# 查看运行中容器
docker ps --format "ID: {{.ID}}\tImage: {{.Image}}\tPorts: {{.Ports}}"
# 进入容器终端
docker exec -it web /bin/sh
# 停止与删除
docker stop web && docker rm web
3. 存储卷管理
# 创建命名卷
docker volume create app_data
# 挂载至容器
docker run -d -v app_data:/var/lib/mysql mysql:8.0
# 备份卷数据
docker run --rm -v app_data:/source -v $(pwd):/backup busybox tar czf /backup/db_$(date +%F).tar.gz /source
4. 网络配置
# 创建自定义网络
docker network create --driver bridge my_net
# 连接容器到网络
docker network connect my_net web
# 查看网络详情
docker network inspect my_net
三、生产级部署案例:Nginx 集群
# 1. 创建自定义网络
docker network create nginx_net
# 2. 启动Nginx容器集群
for i in {1..3}; do
docker run -d --name nginx-$i \
--network nginx_net \
-v nginx_conf:/etc/nginx \
nginx:alpine
done
# 3. 验证集群连通性
docker run --rm --network nginx_net busybox ping -c 2 nginx-1
四、关键配置调优
1. 守护进程配置 /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"},
"storage-driver": "overlay2",
"data-root": "/mnt/docker-data"
}
2. 安全增强
# 禁止容器权限提升
docker run --security-opt=no-new-privileges nginx
# 启用AppArmor防护
docker run --security-opt="apparmor=docker-nginx" nginx
五、部署验证与监控
# 检查Docker版本兼容性
docker version --format 'Server: {{.Server.Version}}\nClient: {{.Client.Version}}'
# 查看资源使用
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 日志实时追踪
docker logs -f --tail 100 web
部署要点总结:
- 镜像标签需明确版本号避免
latest
风险 - 生产环境必须配置日志轮转和存储驱动
- 网络隔离是容器安全的核心防线
- 数据持久化必须通过卷挂载实现
- Kubernetes 已弃用 Docker 作为运行时(需改用 containerd)
基本命令解析
一、容器生命周期管理
1. docker run
容器创建与启动
docker run -d --name web -p 8080:80 -v /data:/usr/share/nginx/html nginx:alpine
参数 | 作用解析 |
---|
-d | 后台运行容器(detached mode) |
--name web | 指定容器名称为web ,替代默认随机命名 |
-p 8080:80 | 将宿主机8080端口映射到容器80端口(格式:主机端口:容器端口 ) |
-v /data:... | 挂载宿主机/data 目录到容器内指定路径(数据持久化) |
nginx:alpine | 指定镜像名称及标签(未显式指定标签时默认使用latest ) |
2. docker exec
容器内执行命令
docker exec -it web sh -c "ls /usr/share/nginx/html"
参数 | 作用解析 |
---|
-it | 分配交互式终端(-i 保持STDIN打开,-t 分配伪终端) |
sh -c "..." | 在容器内启动shell并执行命令(支持管道操作等复杂命令) |
二、镜像管理
1. docker build
镜像构建
docker build -t myapp:v1 --build-arg ENV=prod -f ./Dockerfile .
参数 | 作用解析 |
---|
-t myapp:v1 | 指定镜像名称及版本标签(推荐语义化版本号) |
--build-arg | 传递构建参数到Dockerfile(对应ARG ENV 指令) |
-f ./Dockerfile | 显式指定Dockerfile路径(默认查找当前目录下Dockerfile 文件) |
. | 构建上下文路径(决定COPY 指令可访问的文件范围) |
2. docker push
镜像发布
docker tag myapp:v1 registry.example.com/prod/myapp:v1 && docker push registry.example.com/prod/myapp:v1
命令分段 | 作用解析 |
---|
docker tag | 为本地镜像添加仓库前缀(私有仓库需包含域名/项目路径) |
docker push | 推送镜像到远程仓库(需先执行docker login 认证) |
三、网络与存储
1. docker network
网络配置
docker network create --driver bridge --subnet 172.28.0.0/16 my_net && docker network connect my_net web
参数 | 作用解析 |
---|
--driver bridge | 指定网络驱动类型(可选host /none /overlay ) |
--subnet 172.28.0.0/16 | 自定义子网地址(避免与默认网络冲突) |
docker network connect | 将已有容器接入指定网络(支持多网络隔离) |
2. docker volume
数据卷管理
docker volume create app_data && docker run -v app_data:/var/lib/mysql mysql
操作 | 作用解析 |
---|
docker volume create | 创建命名卷(自动管理存储位置,优于绑定挂载) |
-v app_data:... | 挂载命名卷到容器路径(数据生命周期独立于容器) |
四、运维监控
1. docker logs
日志查看
docker logs --since 1h -f --tail 100 web
参数 | 作用解析 |
---|
--since 1h | 仅显示最近1小时的日志 |
-f | 实时跟踪日志输出(类似tail -f ) |
--tail 100 | 仅显示最后100行日志(避免刷屏) |
2. docker stats
资源监控
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}" web
参数 | 作用解析 |
---|
--format | 自定义输出格式(支持Go模板语法) |
{{.MemUsage}} | 显示内存使用量(含实际使用量/限制值) |
五、组合命令示例
批量清理无用容器
docker ps -aq --filter status=exited | xargs docker rm -v
命令链 | 作用解析 |
---|
docker ps -aq | 静默模式(-q )列出所有容器ID(-a ) |
--filter status=exited | 过滤已退出的容器 |
xargs docker rm -v | 批量删除容器并关联卷(-v 防止卷残留) |
命令使用原则:
- 生产环境避免使用
latest
标签,需明确版本号 - 关键操作前使用
docker inspect
验证配置详情 - 优先使用命名卷而非绑定挂载保证数据可移植性
扩展
一、容器全生命周期管理
1. 高级容器启动 (docker run
)
docker run --rm \
--name api-server \
--hostname node1 \
--cpus 1.5 \
--memory 2g \
--publish 8080:8080 \
--volume /etc/localtime:/etc/localtime:ro \
--env-file .env \
--restart unless-stopped \
--log-driver json-file \
--log-opt max-size=10m \
myapp:prod
参数 | 技术解析 |
---|
--rm | 容器退出时自动删除(测试环境常用) |
--hostname | 设置容器内主机名(影响网络标识) |
--cpus 1.5 | 限制CPU使用为1.5核(基于CFS调度器) |
--memory 2g | 硬性内存限制(超过会被OOM Killer终止) |
--volume :ro | 只读挂载(防止容器篡改宿主机文件) |
--env-file | 从文件加载环境变量(避免敏感信息暴露在命令历史) |
--restart | 重启策略(生产环境推荐unless-stopped ) |
--log-driver | 日志驱动(json-file便于ELK采集) |
2. 容器热更新流程
# 1. 拉取新镜像
docker pull myapp:v2
# 2. 停止旧容器(发送SIGTERM信号)
docker stop api-server
# 3. 启动新容器(保持相同配置)
docker run -d --name api-server ... myapp:v2
# 4. 清理旧镜像
docker image prune -f
二、镜像构建深度解析
1. 多阶段构建 (Multi-stage Build)
# 阶段1:构建环境
FROM golang:1.20 as builder
WORKDIR /app
COPY . .
RUN go build -o server .
# 阶段2:运行环境
FROM alpine:3.18
COPY --from=builder /app/server /usr/local/bin/
CMD ["server"]
指令 | 优化作用 |
---|
as builder | 声明构建阶段别名 |
COPY --from | 跨阶段复制文件(最终镜像不包含编译工具链) |
alpine 基础镜像 | 减小镜像体积(约5MB vs Ubuntu的72MB) |
2. 构建缓存控制
docker build \
--no-cache \ # 禁用缓存
--build-arg HTTP_PROXY=http://proxy.example.com \ # 构建时变量
--target builder \ # 指定构建阶段
-t myapp:ci .
三、网络拓扑实战
1. 自定义Overlay网络
# 创建跨主机通信网络
docker network create \
--driver overlay \
--subnet 10.1.0.0/24 \
--attachable \ # 允许手动连接容器
my-overlay-net
2. 容器网络诊断
# 查看容器网络详情
docker inspect \
--format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
# 测试网络连通性
docker run --rm --network my-overlay-net busybox ping -c 3 web
四、存储卷高级用法
1. 数据卷备份恢复
# 备份PostgreSQL卷
docker run --rm \
--volumes-from db \
-v $(pwd):/backup \
alpine tar cvf /backup/db_$(date +%F).tar /var/lib/postgresql/data
# 恢复数据
docker run --rm \
-v pg_data:/target \
-v $(pwd):/backup \
alpine tar xvf /backup/db_2025-06-20.tar -C /target
2. 存储驱动选择
# 查看当前存储驱动
docker info --format '{{.Driver}}'
# 修改为性能更好的驱动(需在daemon.json配置)
"storage-driver": "overlay2",
"storage-opts":
[
"overlay2.override_kernel_check=true"
]
五、安全加固命令
1. 用户命名空间隔离
# 启用userns-remap(需修改/etc/docker/daemon.json)
"userns-remap": "default"
# 验证映射效果
docker run --rm alpine id # 显示非root用户
2. 安全扫描
# 使用Snyk扫描镜像漏洞
docker scan myapp:latest
# 最小化容器权限
docker run \
--read-only \ # 只读文件系统
--cap-drop ALL \ # 移除所有特权
--security-opt no-new-privileges \
alpine sh
六、编排预处理命令
1. Docker Compose部署
services:
redis:
image: redis:7
deploy:
resources:
limits:
cpus: '0.5'
memory: 256M
healthcheck:
test: ["CMD", "redis-cli", "ping"]
2. Kubernetes准备
# 生成K8s部署模板
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
kompose convert \
-f docker-compose.yml
关键原理补充:
--publish
实际通过iptables DNAT规则实现端口转发- Overlay网络依赖VXLAN封装实现跨主机通信
- 卷(volume)本质是主机上的
/var/lib/docker/volumes/
目录 - 容器进程隔离通过Linux namespaces + cgroups实现
选项解析
一、容器生命周期管理
1. docker run
关键选项
docker run \
--cap-add NET_ADMIN \ # 添加Linux能力
--device /dev/video0 \ # 挂载宿主设备
--ulimit nofile=1024 \ # 限制文件描述符数量
--health-cmd "curl -f http://localhost" \ # 健康检查
--tmpfs /run:size=100m \ # 内存文件系统
--security-opt seccomp=unconfined \ # 安全策略
nginx
选项 | 技术解析 |
---|
--cap-add | 授予容器特定Linux能力(默认已drop所有非必要能力) |
--device | 允许容器直接访问宿主机物理设备(需谨慎使用) |
--ulimit | 设置容器资源限制(覆盖宿主机默认值) |
--health-cmd | 定义健康检查命令(影响docker ps 状态显示) |
--tmpfs | 创建内存临时文件系统(避免磁盘IO) |
--security-opt | 自定义安全配置(可禁用seccomp或AppArmor) |
2. docker exec
高级用法
docker exec \
--user www-data \ # 指定执行用户
--workdir /var/www/html \ # 设置工作目录
-e DEBUG=true \ # 传递环境变量
web \ bash -c "ls -la"
选项 | 作用说明 |
---|
--user | 以非root用户执行命令(提升安全性) |
--workdir | 设置命令执行的工作目录(默认使用容器WORKDIR) |
-e | 临时注入环境变量(仅本次命令有效) |
二、镜像构建与维护
1. docker build
进阶参数
docker build \
--platform linux/arm64 \ # 跨平台构建
--progress plain \ # 输出详细日志
--secret id=ssh,src=$HOME/.ssh/id_rsa \ # 安全传输密钥
--no-cache \ # 禁用缓存
-t myapp:cross-platform .
参数 | 深层原理 |
---|
--platform | 指定目标平台(需开启buildkit支持多架构) |
--progress | 控制日志输出格式(可选auto/plain/tty) |
--secret | 安全传递敏感文件(不会保留在最终镜像中) |
2. docker push
认证控制
docker push \
--disable-content-trust \ # 跳过镜像签名验证
registry.private.com/app:v1
选项 | 安全影响 |
---|
--disable-content-trust | 关闭Docker Content Trust验证(降低安全性) |
三、网络与存储配置
1. 网络驱动选项
docker network create \
--driver macvlan \ # 使用MACVLAN驱动
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
--ip-range 192.168.1.32/28 \
macvlan-net
参数 | 网络特性 |
---|
--driver | 指定网络模式(bridge/overlay/macvlan等) |
--ip-range | 限制容器IP分配范围(防止IP冲突) |
2. 存储卷高级参数
docker volume create \
--driver local \ # 使用本地驱动
--opt type=nfs \ # 指定存储类型
--opt device=:/nfs/data \
--opt o=addr=192.168.1.100 \
nfs-volume
选项 | 存储架构 |
---|
--opt type | 支持nfs/btrfs/zfs等文件系统 |
--opt o | 传递挂载选项(类似mount -o参数) |
四、系统级管理命令
1. docker system
维护工具
docker system prune \
--all \ # 删除所有未使用对象
--volumes \ # 包括数据卷
--force # 跳过确认提示
选项 | 清理范围 |
---|
--all | 清除所有悬空镜像(不仅是临时层) |
--volumes | 同时删除未被容器引用的数据卷(高危操作) |
2. 日志驱动配置
docker run \
--log-driver fluentd \ # 使用Fluentd收集
--log-opt fluentd-address=myfluentd:24224 \
--log-opt tag="docker.web" \
nginx
参数 | 日志管理 |
---|
--log-driver | 支持json-file/syslog/fluentd等驱动 |
--log-opt tag | 自定义日志标签(便于检索) |
核心设计原则:
- 最小权限原则:默认禁用所有非必要Linux能力
- 显式声明依赖:所有资源必须明确申请(CPU/内存/设备等)
- 不可变基础设施:容器运行后不应修改内部文件
- 声明式配置:优先使用Dockerfile/docker-compose.yml定义环境