..
什么是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 已成为现代后端、运维、开发工程师的必备技能。