Docker是一个开源的容器化平台,通过将应用程序及其依赖打包到轻量级、可移植的容器中,实现了"一次构建,随处运行"的目标。本文将深入解析Docker的核心原理、架构设计和最佳实践。
Docker简介
Docker是基于Linux容器技术(LXC)发展而来的容器化平台,利用Linux内核的Namespace和Cgroups特性实现进程隔离和资源限制。
Docker的核心特性:
- 轻量级:容器共享宿主机内核,启动速度快,资源占用少
- 可移植性:镜像包含完整运行环境,跨平台一致运行
- 隔离性:每个容器独立运行,互不干扰
- 版本控制:镜像分层存储,支持版本管理
- 快速部署:秒级启动,弹性伸缩
核心概念
镜像(Image)
Docker镜像是一个只读的模板,包含运行应用所需的完整文件系统。镜像采用分层存储结构,每一层都是前一层的增量修改。
# 拉取镜像
docker pull nginx:latest
# 查看镜像列表
docker images
# 删除镜像
docker rmi nginx:latest
# 构建镜像
docker build -t myapp:1.0 .
# 查看镜像历史
docker history nginx:latest
容器(Container)
容器是镜像的运行实例,在镜像的只读层上添加一个可写层。容器之间相互隔离,共享宿主机内核。
# 创建并启动容器
docker run -d --name mynginx -p 80:80 nginx:latest
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 停止容器
docker stop mynginx
# 启动容器
docker start mynginx
# 删除容器
docker rm mynginx
# 进入容器
docker exec -it mynginx bash
仓库(Registry)
Docker仓库用于存储和分发镜像,Docker Hub是官方的公共仓库。
# 登录仓库
docker login
# 推送镜像
docker push username/myapp:1.0
# 拉取私有镜像
docker pull registry.example.com/myapp:1.0
Dockerfile
基本指令
# 基础镜像
FROM ubuntu:20.04
# 维护者信息
LABEL maintainer="admin@example.com"
# 设置环境变量
ENV APP_HOME=/app APP_PORT=8080
# 设置工作目录
WORKDIR $APP_HOME
# 复制文件
COPY . .
# 执行命令(构建时)
RUN apt-get update && apt-get install -y python3 python3-pip && rm -rf /var/lib/apt/lists/*
# 安装依赖
RUN pip3 install -r requirements.txt
# 暴露端口
EXPOSE $APP_PORT
# 设置卷
VOLUME ["/data"]
# 容器启动命令
CMD ["python3", "app.py"]
多阶段构建
# 构建阶段
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
# 运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
最佳实践
- 使用官方基础镜像:减少安全风险
- 最小化层数:合并RUN命令减少镜像大小
- 使用.dockerignore:排除不必要的文件
- 非root用户运行:提高安全性
- 固定版本号:避免使用latest标签
网络
网络模式
| 模式 | 说明 | 使用场景 |
|---|---|---|
| bridge | 默认模式,容器通过虚拟网桥通信 | 单机多容器 |
| host | 容器直接使用宿主机网络 | 高性能网络 |
| none | 容器无网络 | 完全隔离 |
| overlay | 跨主机容器通信 | 集群部署 |
# 创建自定义网络
docker network create --driver bridge mynet
# 查看网络列表
docker network ls
# 连接容器到网络
docker network connect mynet mynginx
# 断开容器网络
docker network disconnect mynet mynginx
# 查看网络详情
docker network inspect mynet
存储
存储类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| Volume | Docker管理的持久化存储 | 数据库、日志 |
| Bind Mount | 宿主机目录挂载 | 开发环境 |
| tmpfs | 内存中的临时存储 | 敏感数据 |
# 创建数据卷
docker volume create mydata
# 查看数据卷
docker volume ls
# 挂载数据卷
docker run -d -v mydata:/data nginx
# 绑定挂载
docker run -d -v /host/path:/container/path nginx
# 删除数据卷
docker volume rm mydata
Docker Compose
compose文件
version: '3.8'
services:
web:
build: .
ports:
- "8080:8080"
environment:
- DB_HOST=db
- DB_PORT=5432
depends_on:
- db
networks:
- app-net
db:
image: postgres:14
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-net
redis:
image: redis:7
networks:
- app-net
networks:
app-net:
driver: bridge
volumes:
pgdata:
Compose常用命令
# 启动所有服务
docker-compose up -d
# 停止所有服务
docker-compose down
# 查看服务状态
docker-compose ps
# 查看服务日志
docker-compose logs -f web
# 重新构建
docker-compose build
# 扩展服务实例
docker-compose up -d --scale web=3
性能优化
镜像优化
- 选择轻量基础镜像:Alpine Linux(~5MB)替代Ubuntu
- 多阶段构建:分离构建环境和运行环境
- 合理利用缓存:将变化少的指令放在前面
- 清理临时文件:在同一RUN中删除安装缓存
容器优化
- 资源限制:设置CPU和内存限制防止资源耗尽
- 健康检查:配置HEALTHCHECK确保服务可用
- 日志管理:配置日志驱动和轮转策略
# 限制容器资源
docker run -d --cpus="1.5" --memory="512m" --memory-swap="1g" nginx
# 配置健康检查
docker run -d --health-cmd="curl -f http://localhost/ || exit 1" --health-interval=30s --health-timeout=10s --health-retries=3 nginx
安全
安全最佳实践
- 使用非root用户:在Dockerfile中使用USER指令
- 只读文件系统:使用--read-only标志
- 限制系统调用:使用seccomp配置文件
- 扫描镜像漏洞:使用docker scan或第三方工具
- 不存储敏感信息:使用Docker Secrets或环境变量
# 安全的Dockerfile示例
FROM node:18-alpine
# 创建非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --chown=appuser:appgroup . .
RUN npm ci --only=production
# 切换到非root用户
USER appuser
EXPOSE 3000
CMD ["node", "server.js"]
监控与日志
容器监控
# 查看容器资源使用
docker stats
# 查看容器详情
docker inspect mynginx
# 查看容器日志
docker logs -f --tail=100 mynginx
# 查看容器进程
docker top mynginx
总结
Docker通过容器化技术彻底改变了应用程序的开发、部署和运维方式。本文介绍了Docker的核心概念、Dockerfile编写、网络存储配置、Docker Compose编排以及安全最佳实践。掌握Docker是现代云原生开发的必备技能,能够显著提升开发效率和部署可靠性。