Docker的简单介绍

Docker

定义

Docker 是一个开源的容器化平台,通过操作系统级虚拟化技术将应用及其依赖打包成轻量级、可移植的容器,实现"一次构建,到处运行"的部署模式。

技术定位

Docker 位于 虚拟化 技术栈的容器层,介于传统虚拟机(VM)与裸机部署之间。它通过 Linux 内核特性(如 cgroupsnamespaces)实现资源隔离,成为现代 微服务 架构和 CI/CD 流程的基础设施标准。


核心特性 (Key Features)

  • 轻量级隔离:容器共享宿主机内核,启动时间毫秒级,资源占用远低于虚拟机
  • 镜像分层存储:采用 UnionFS 联合文件系统,通过层级复用大幅减少存储空间
  • 环境一致性:开发、测试、生产环境使用相同镜像,消除"在我机器上能跑"问题
  • 声明式配置 :通过 Dockerfiledocker-compose.yml 实现基础设施即代码
  • 生态系统完善:Docker Hub 提供数百万公共镜像,支持私有仓库部署

工作原理 (How It Works)

核心架构

Docker 采用 客户端-服务器(C/S)架构,主要组件包括:
REST API
Docker Client

docker CLI
Docker Daemon

dockerd
containerd

容器运行时
runc

OCI 运行时
Linux Kernel

cgroups + namespaces
Images

镜像管理
Containers

容器管理
Networks

网络管理
Volumes

数据卷管理

关键机制说明

  1. Namespace 隔离

    • PID namespace:进程隔离,容器内 PID 1 独立于宿主机
    • Network namespace:网络栈隔离,每个容器拥有独立 IP
    • Mount namespace:文件系统隔离,容器看到独立的根文件系统
    • UTS namespace:主机名隔离
    • IPC namespace:进程间通信隔离
    • User namespace:用户权限隔离
  2. Cgroups 资源限制

    • 限制 CPU、内存、磁盘 I/O、网络带宽
    • 防止单个容器耗尽宿主机资源
  3. 镜像分层机制

    复制代码
    [应用层] ← 可写层 (Container Layer)
    [依赖层] ← 只读层
    [运行时层] ← 只读层
    [基础镜像层] ← 只读层 (Base Image)
    • 使用 Copy-on-Write (CoW) 策略:修改文件时才复制到可写层
    • 多个容器可共享相同的只读层

快速上手 (Quick Start)

安装

Linux 安装(Ubuntu/Debian)

bash 复制代码
# 安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

# 添加 Docker 官方 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

# 添加 Docker 仓库
echo "deb [arch=$(dpkg --print-architecture) \
  signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

Windows/macOS

下载并安装 Docker Desktop

最简代码 (MVE)

bash 复制代码
# 1. 运行第一个容器(自动拉取镜像)
docker run hello-world

# 2. 运行交互式容器
docker run -it ubuntu:22.04 bash
# 在容器内执行命令后,输入 exit 退出

# 3. 后台运行 Nginx 服务器
docker run -d -p 8080:80 --name my-nginx nginx:alpine
# 访问 http://localhost:8080 查看效果

# 4. 查看运行中的容器
docker ps

# 5. 停止并删除容器
docker stop my-nginx
docker rm my-nginx

创建自定义镜像

\Dockerfile 示例

dockerfile 复制代码
# 基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件并安装(利用缓存层)
COPY package*.json ./
RUN npm ci --only=production

# 复制应用代码
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["node", "server.js"]
bash 复制代码
# 构建镜像
docker build -t my-app:1.0 .

# 运行容器
docker run -d -p 3000:3000 my-app:1.0

优缺点对比 (Trade-offs)

维度 优势 (Pros) 局限 (Cons)
性能 接近原生性能,启动秒级 不适合 GUI 应用,图形性能损耗大
资源占用 单机可运行数百容器 Windows 容器需 Hyper-V,资源开销较大
隔离性 进程级隔离,安全性优于传统部署 不如虚拟机隔离彻底,共享内核存在风险
可移植性 跨平台一致性(Linux/Windows/macOS) 架构依赖(ARM 镜像无法在 x86 上运行)
生态系统 海量公共镜像,社区活跃 镜像质量参差不齐,存在供应链安全风险
学习曲线 基础使用简单 网络、存储、编排等高级特性复杂

避坑指南与最佳实践

常见陷阱

1. 数据持久化问题

  • ❌ 错误:将数据存储在容器内,容器删除后数据丢失

  • ✅ 正确:使用 Volume 或 Bind Mount

    bash 复制代码
    docker run -v /host/data:/container/data my-app

2. 镜像体积过大

  • ❌ 错误:使用完整 OS 镜像(如 ubuntu:latest

  • ✅ 正确:使用 Alpine 或 Distroless 镜像

    dockerfile 复制代码
    FROM node:18-alpine  # 仅 40MB vs node:18 的 900MB+

3. 容器以 root 运行

  • ❌ 风险:容器逃逸后可能获得宿主机 root 权限

  • ✅ 正确:创建非特权用户

    dockerfile 复制代码
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup
    USER appuser

性能优化建议

1. 利用构建缓存

dockerfile 复制代码
# 先复制依赖文件(变化频率低)
COPY package.json package-lock.json ./
RUN npm ci

# 再复制源代码(变化频率高)
COPY . .

2. 多阶段构建减小镜像

dockerfile 复制代码
# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm ci && npm run build

# 运行阶段
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
CMD ["node", "dist/server.js"]

3. 使用 .dockerignore

复制代码
node_modules
.git
*.log
.env

常见问题

Q: Docker 和虚拟机有什么区别?

A: Docker 容器共享宿主机内核,启动快、资源占用少;虚拟机包含完整 OS,隔离性更强但开销大。

Q: 如何清理无用的镜像和容器?

A: 使用 docker system prune -a 清理所有未使用的资源(谨慎操作)。

Q: 容器内时间不对怎么办?

A: 挂载宿主机时区文件:

bash 复制代码
docker run -v /etc/localtime:/etc/localtime:ro my-app

Q: 如何限制容器资源?

A: 使用资源限制参数:

bash 复制代码
docker run --memory="512m" --cpus="1.5" my-app

进阶主题

网络模式

模式 说明 使用场景
bridge 默认模式,容器通过虚拟网桥通信 单机多容器应用
host 容器直接使用宿主机网络栈 需要高性能网络的场景
none 无网络配置 安全隔离或自定义网络
container 共享另一个容器的网络 Sidecar 模式(如服务网格)

编排工具对比

单机编排
原生集群
企业级编排
Docker Compose
开发/测试环境
Docker Swarm
中小规模生产
Kubernetes
大规模云原生

  • Docker Compose:适合本地开发,通过 YAML 定义多容器应用
  • Docker Swarm:Docker 原生集群方案,配置简单但功能有限
  • Kubernetes:事实标准,功能强大但学习曲线陡峭

相关资源

官方文档

相关推荐
fanruitian2 小时前
k8s 部署 dashboard 面板
云原生·容器·kubernetes
羱滒3 小时前
Docker Compose + Nginx + 后端服务运行环境搭建全流程指南(redis、mongdb、nginx、nacos-registry)
redis·nginx·docker·docker-compose
^ω^。3 小时前
Docker核心技术原理与数据持久化全面解析
docker
Hi202402173 小时前
使用Docker Compose搭建LibreNMS网络监控系统
运维·网络·docker·容器
zhojiew3 小时前
使用firecracker创建虚拟机和配置firecracker作为kata后端的过程
容器
mr_orange_klj4 小时前
关于K8s的Service存活探针和就绪探针的AI问答
docker·容器·kubernetes
南宫乘风4 小时前
Kubernetes 中如何避免僵尸进程:从原理到 tini 落地实践
云原生·容器·kubernetes
Zfox_4 小时前
【Docker#2】容器化虚拟化
运维·后端·docker·容器
fanruitian4 小时前
k8s 设置副本数
linux·容器·kubernetes