..

什么是Docker

一、引言

Docker 是一款基于 Linux 内核 cgroup、namespace、UnionFS 等技术构建的开源容器化引擎,能够将应用程序及其依赖环境、配置、运行时库进行标准化封装,实现应用在不同环境之间的一致性交付。

Docker 彻底解决了“开发环境正常、测试环境异常、生产环境故障”的环境一致性问题,已成为云原生、微服务架构、DevOps 与 CI/CD 流程的基础设施。


二、核心架构

Docker 采用经典的 C/S 架构:

  • Docker Client:用户交互入口,支持 CLI、API、SDK 等方式
  • Docker Daemon:后台守护进程,负责镜像构建、容器生命周期管理、网络与存储调度
  • Docker Registry:镜像存储与分发中心
  • Docker Objects:镜像、容器、数据卷、网络、插件等核心资源
Client ── REST API ──→ Docker Daemon ──→ Images / Containers / Volumes / Networks

三、核心概念

3.1 镜像(Image)

Docker 镜像是一个只读分层文件系统模板,包含应用运行所需的全部环境。

  • 分层存储,共享基础层,节省空间。
  • 写时复制(Copy-on-Write)机制。
  • 不可变、可复用、可版本化。
  • 可通过 Dockerfile 自动化构建。

3.2 容器(Container)

容器是镜像的运行时实例,本质是一个受隔离的 Linux 进程。

  • PID、网络、挂载、用户等多维度 namespace 隔离。
  • cgroup 限制 CPU、内存、磁盘 I/O 等资源。
  • 独立可写层,生命周期与镜像分离。
  • 支持创建、启动、停止、重启、删除等操作。

3.3 仓库(Registry)

用于集中存储、管理、分发 Docker 镜像。

  • 公有仓库:Docker Hub、阿里云 ACR、腾讯云 TCR。
  • 私有仓库:Harbor、Docker Distribution、Nexus。

3.4 数据卷(Volume)

Docker 提供的数据持久化方案,独立于容器生命周期。

  • 命名卷(Named Volume)。
  • 绑定挂载(Bind Mount)。
  • tmpfs 临时文件系统。

3.5 网络(Network)

Docker 内置网络模型,用于容器间通信与外部访问。

  • bridge:默认网桥模式。
  • host:共享宿主机网络。
  • none:无网络。
  • overlay:跨主机容器网络。

四、基础操作命令

4.1 镜像管理

# 拉取镜像
docker pull nginx:stable

# 查看本地镜像
docker images

# 删除镜像
docker rmi <IMAGE_ID/NAME>

# 构建镜像
docker build -t myapp:v1 .

# 推送镜像
docker push myrepo/myapp:v1

4.2 容器管理

# 创建并后台运行容器
docker run -d --name mynginx -p 8080:80 -v html:/usr/share/nginx/html nginx:stable

# 查看运行中容器
docker ps

# 查看所有容器
docker ps -a

# 进入容器交互终端
docker exec -it mynginx /bin/bash

# 启停容器
docker start mynginx
docker stop mynginx
docker restart mynginx

# 删除容器
docker rm mynginx

4.3 数据卷与网络

# 数据卷
docker volume create mydata
docker volume ls
docker volume inspect mydata

# 网络
docker network create app-net
docker network ls
docker network connect app-net mycontainer

五、Dockerfile 规范(生产级)

# 构建阶段
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt

# 运行阶段
FROM python:3.11-slim
WORKDIR /app

COPY --from=builder /wheels /wheels
COPY --from=builder /app/requirements.txt .

RUN pip install --no-cache-dir --no-index --find-links=/wheels -r requirements.txt \
    && rm -rf /wheels

COPY . .

USER nobody
EXPOSE 8000

HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://127.0.0.1:8000/health || exit 1

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

六、Docker Compose 编排示例

version: '3.8'

volumes:
  redis-data:
  mysql-data:

networks:
  app-network:
    driver: bridge

services:
  app:
    build: .
    restart: always
    ports:
      - "8000:8000"
    depends_on:
      - mysql
      - redis
    networks:
      - app-network

  redis:
    image: redis:alpine
    restart: always
    volumes:
      - redis-data:/data
    networks:
      - app-network

  mysql:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root123
      MYSQL_DATABASE: appdb
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

常用命令:

docker-compose up -d
docker-compose ps
docker-compose logs -f
docker-compose down

七、生产环境最佳实践

  • 镜像轻量化:优先使用 Alpine 基础镜像,采用多阶段构建,剔除编译依赖,合并 RUN 指令,减少镜像层数。
  • 安全加固:禁止使用 root 用户运行容器,限制容器 CAP 权限,设置只读文件系统,做镜像漏洞扫描(Trivy/Clair)。
  • 资源管控:配置 CPU/内存限制,避免容器无限制资源占用,使用健康检查实现自动自愈。
  • 数据持久化:所有持久化数据使用 Volume,定期备份数据卷,生产环境使用外部存储(NAS/云盘)。
  • 日志与监控:日志输出至 stdout/stderr,接入 ELK/PLG 日志系统,使用 Prometheus + Grafana 监控容器指标。

八、Docker 与虚拟机对比

对比项 Docker 容器 传统虚拟机 VM
启动速度 秒级 分钟级
资源占用 极低(共享内核) 高(独立操作系统)
隔离级别 进程隔离 硬件级系统隔离
性能损耗 几乎无损耗 较高损耗
移植性 跨平台、跨云厂商 受虚拟化平台限制

九、常见问题与排障

  • 容器启动后立即退出:docker logs <container>
  • 端口冲突无法启动:修改宿主机映射端口或关闭占用端口的进程。
  • 镜像拉取速度慢:配置国内镜像加速器(阿里云、网易、中科大)。
  • 容器之间无法通信:确保容器在同一网络,使用服务名作为域名访问。
  • 容器内文件权限问题:调整挂载目录权限或使用正确用户运行。

十、总结

Docker 作为容器化标准工具,通过轻量级、可移植、隔离性强的特性,大幅提升应用交付效率与环境一致性。它是微服务、DevOps、云原生架构的核心支撑,广泛应用于开发、测试、生产、CI/CD 全流程。

掌握 Docker 已成为现代后端、运维、开发工程师的必备技能。