
一、Docker核心概念与架构
1.1 Docker技术栈
Docker客户端 Docker守护进程 镜像仓库 容器运行时 Linux内核命名空间 控制组cgroups 联合文件系统
1.2 容器与虚拟机对比
特性 | 容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
资源占用 | MB级 | GB级 |
隔离性 | 进程级 | 系统级 |
镜像大小 | 10-100MB | 1-10GB |
运行性能 | 接近原生 | 有损耗 |
二、Docker全生命周期管理
2.1 容器操作核心命令
bash
# 容器全生命周期管理
docker create # 创建容器但不启动
docker start # 启动已停止的容器
docker stop # 优雅停止容器(发送SIGTERM)
docker kill # 强制停止容器(发送SIGKILL)
docker pause # 冻结容器进程
docker unpause # 恢复容器运行
# 高级日志管理(支持JSON日志驱动)
docker logs --tail 100 -f --since 10m container_id
# 容器资源监控
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
2.2 镜像深度管理
bash
# 镜像构建全流程
docker build -t myapp:v1 --build-arg ENV=prod --no-cache .
# 多阶段构建示例(减少最终镜像大小)
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
FROM alpine:latest
COPY --from=builder /app/myapp .
CMD ["./myapp"]
# 镜像安全扫描
docker scan myapp:v1
2.3 存储与卷管理
bash
# 创建持久化卷
docker volume create db_data
# 卷深度检查
docker volume inspect db_data | grep Mountpoint
# 绑定挂载与卷挂载对比
docker run -v /host/path:/container/path # 绑定挂载
docker run -v db_data:/container/path # 卷挂载(推荐)
三、生产级容器部署指南
3.1 Redis高可用部署
bash
# 使用自定义配置文件(重要安全配置)
docker run -d --name redis \
-p 6379:6379 \
-v /data/redis/redis.conf:/usr/local/etc/redis/redis.conf \
-v redis_data:/data \
--sysctl net.core.somaxconn=1024 \
--memory 1g \
--cpus 2 \
redis:7.0 redis-server /usr/local/etc/redis/redis.conf
# redis.conf关键配置:
requirepass YourStrongPassword
maxmemory 2gb
maxmemory-policy allkeys-lru
appendonly yes
3.2 MySQL生产配置
bash
# 带性能调优参数的启动
docker run -d --name mysql \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
-v /etc/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=ComplexPassw0rd! \
-e MYSQL_DATABASE=app_db \
-e MYSQL_USER=app_user \
-e MYSQL_PASSWORD=UserPassword123 \
--innodb_buffer_pool_size=1G \
--innodb_log_file_size=256M \
mysql:8.0.23 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
3.3 Elasticsearch集群部署
yaml
# docker-compose-cluster.yml
version: '3.8'
services:
es01:
image: elasticsearch:7.14.0
container_name: es01
environment:
- node.name=es01
- cluster.name=es-docker-cluster
- discovery.seed_hosts=es02,es03
- cluster.initial_master_nodes=es01,es02,es03
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms4g -Xmx4g"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- es_data01:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
# es02, es03配置类似...
volumes:
es_data01, es_data02, es_data03
networks:
elastic:
driver: bridge
四、高级网络与安全
4.1 网络模式对比
网络模式 | 特点 | 适用场景 |
---|---|---|
bridge | 默认NAT网络 | 单机多容器通信 |
host | 直接使用宿主机网络 | 高性能网络应用 |
overlay | 跨主机容器网络 | Swarm/K8s集群 |
macvlan | 容器具有MAC地址 | 传统网络集成 |
none | 无网络 | 特殊安全场景 |
4.2 安全加固实践
bash
# 1. 使用非root用户运行容器
docker run -u 1000:1000 myapp
# 2. 启用AppArmor配置文件
docker run --security-opt apparmor=my_profile
# 3. 只读文件系统(除必要目录)
docker run --read-only -v /tmp:/tmp
# 4. 禁用特权模式
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE
# 5. 定期更新镜像
docker pull official_image:latest
五、容器编排基础
5.1 Docker Compose全栈部署
yaml
# docker-compose-fullstack.yml
version: '3.8'
services:
frontend:
image: nginx:1.22.0
ports:
- "80:80"
volumes:
- ./frontend:/usr/share/nginx/html
depends_on:
- backend
backend:
build: ./backend
environment:
- DB_HOST=db
- REDIS_HOST=redis
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
db:
image: postgres:13
volumes:
- pg_data:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: dbpassword
redis:
image: redis:7.0
command: redis-server --requirepass redispass
volumes:
pg_data:
六、企业级应用部署
6.1 Nexus私有仓库集群
bash
# 启动Nexus主节点
docker run -d -p 8081:8081 \
--name nexus-primary \
-v nexus-data:/nexus-data \
-e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx2g" \
sonatype/nexus3
# 配置集群节点
docker run -d -p 8082:8081 \
--name nexus-replica \
-v nexus-data-replica:/nexus-data \
-e NEXUS_CLUSTER_NODE_ID=replica01 \
-e NEXUS_CLUSTER_PRIMARY_NODE_URL=http://primary-ip:8081 \
sonatype/nexus3
6.2 Jenkins CI/CD流水线容器
Dockerfile
# Jenkins Dockerfile with pre-installed tools
FROM jenkins/jenkins:lts-jdk11
USER root
RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - && \
apt-get install -y nodejs python3 docker-ce-cli
USER jenkins
COPY plugins.txt /usr/share/jenkins/ref/
RUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt
七、监控与排错体系
7.1 容器监控方案
bash
# Prometheus + cAdvisor + Grafana 部署
docker run -d \
--name=cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--publish=8080:8080 \
google/cadvisor
# 日志集中管理
docker run -d \
--name logspout \
--volume=/var/run/docker.sock:/var/run/docker.sock \
gliderlabs/logspout \
syslog+tls://logs.example.com:514
7.2 故障诊断工具箱
工具 | 用途 | 安装方式 |
---|---|---|
nsenter | 进入容器命名空间 | apt-get install util-linux |
weave scope | 容器拓扑可视化 | docker run -d --name scope |
ctop | 容器资源监控 | docker run --rm -ti quay.io/vektorlab/ctop |
dive | 镜像层分析 | docker run --rm -ti wagoodman/dive |
八、容器安全合规
8.1 Docker安全扫描
bash
# 使用Trivy进行漏洞扫描
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image myapp:latest
# CIS基准检测
docker run -it --net host --pid host \
--cap-add audit_control \
-v /var/lib:/var/lib \
-v /var/run/docker.sock:/var/run/docker.sock \
docker/docker-bench-security
8.2 合规性配置
-
禁止特权容器
docker run --privileged
→ 禁止使用 -
文件系统保护
bashdocker run \ --read-only \ --tmpfs /tmp:rw,size=50m \ myapp
-
网络隔离
bashdocker network create --internal private_net docker run --net private_net --rm alpine
九、附录:企业级最佳实践
9.1 镜像构建原则
-
最小化基础镜像
Alpine (5MB) > Distroless > Ubuntu (72MB)
-
多阶段构建
分离编译环境和运行环境
-
单进程原则
每个容器只运行一个主进程
9.2 资源配额管理
bash
# 内存限制(含OOM优先级)
docker run -m 512m --oom-kill-disable --oom-score-adj 500
# CPU限制(CFS调度器)
docker run --cpus=1.5 --cpu-shares=512
# 块I/O限制
docker run --device-read-bps /dev/sda:1mb
9.3 零信任网络策略
bash
# 默认拒绝所有流量
docker network create --driver bridge \
--opt com.docker.network.bridge.enable_icc=false \
isolated_net
# 按需开放端口
docker run -p 8080:8080/tcp --publish 53:53/udp
更新日期 :2025年7月8日
适用版本:Docker CE 25.0+ / Engine 26.0+
如需PDF版本或容器安全自查清单,请联系作者获取。