本文为 Docker配置最佳实践系列第 2 篇,聚焦:资源限制策略、日志管理方案、安全加固配置。


资源限制策略

CPU限制最佳实践

# 限制CPU核心数(推荐)
docker run --cpus="1.5" nginx

# 限制CPU份额(相对值)
docker run --cpu-shares=512 nginx

# 绑定CPU核心
docker run --cpuset-cpus="0,1" nginx
# 运行时动态调整
docker update --cpus="2.0" container_name

内存限制最佳实践

docker run \
  -m 512m \
  --memory-swap 1g \
  --memory-reservation 256m \
  --oom-kill-disable \
  nginx
# Nginx
docker run -m 128m --memory-swap 256m nginx

# Node.js
docker run -m 512m --memory-swap 1g node-app

# Java
docker run -m 2g --memory-swap 4g \
  -e JAVA_OPTS="-Xmx1536m -Xms1536m" \
  java-app

# MySQL
docker run -m 4g --memory-swap 4g \
  -e MYSQL_INNODB_BUFFER_POOL_SIZE=2G \
  mysql:8.0
#!/bin/bash
docker stats --no-stream --format \
  "table {{.Container}}\t{{.MemUsage}}\t{{.MemPerc}}" | \
  awk 'NR>1 && $3 > 80 {print "警告: "$1" 内存使用率 "$3}'

IO限制(防止磁盘打满)

docker run \
  --device-read-bps /dev/sda:10mb \
  --device-write-bps /dev/sda:10mb \
  --device-read-iops /dev/sda:1000 \
  --device-write-iops /dev/sda:1000 \
  myapp

docker-compose资源限制

version: '3.8'

services:
  web:
    image: nginx
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M
    restart: unless-stopped

  api:
    image: myapi
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2G
        reservations:
          cpus: '1.0'
          memory: 1G
    restart: unless-stopped

  db:
    image: mysql:8.0
    deploy:
      resources:
        limits:
          cpus: '4.0'
          memory: 4G
        reservations:
          cpus: '2.0'
          memory: 2G
    restart: unless-stopped

日志管理方案

日志驱动选择

驱动优点缺点适用场景
json-file简单,默认容易占满磁盘开发环境
syslog集中管理性能一般小规模生产
journald系统集成查询不便systemd系统
fluentd功能强大配置复杂大规模生产
none无日志无法排查问题不推荐

集中式日志方案

version: '3.8'

services:
  fluentd:
    image: fluent/fluentd:latest
    volumes:
      - ./fluentd/conf:/fluentd/etc
    ports:
      - "24224:24224"
    logging:
      driver: "json-file"
      options:
        max-size: "100m"
        max-file: "3"

  app:
    image: myapp
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: "docker.{{.Name}}"
<source>
  @type forward
  port 24224
</source>

<match docker.**>
  @type elasticsearch
  host elasticsearch
  port 9200
  logstash_format true
  logstash_prefix docker
  flush_interval 5s
</match>
version: '3.8'

services:
  loki:
    image: grafana/loki:latest
    ports:
      - "3100:3100"

  promtail:
    image: grafana/promtail:latest
    volumes:
      - /var/log:/var/log
      - /var/lib/docker/containers:/var/lib/docker/containers

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"

日志查询技巧

docker logs -f container_name
docker logs --tail 100 container_name
docker logs -t container_name
docker logs --since "2026-02-15T10:00:00" container_name
docker logs --until "2026-02-15T12:00:00" container_name
docker logs -f --tail 50 --since "10m" container_name
docker logs container_name 2>&1 | grep ERROR
docker logs container_name 2>&1 | grep -c ERROR
docker logs container_name 2>&1 | grep -i "timeout"
docker logs container_name 2>&1 | grep -E "ERROR|WARN|FATAL"

安全加固配置

用户权限管理

FROM ubuntu:20.04
RUN groupadd -r appuser && useradd -r -g appuser appuser
WORKDIR /app
COPY --chown=appuser:appuser . .
USER appuser
CMD ["./app"]
docker run -u 1000:1000 myapp
docker run -u appuser myapp

只读文件系统

docker run --read-only \
  --tmpfs /tmp \
  --tmpfs /var/run \
  nginx

docker run -v /data:/data:ro myapp

能力限制(Capabilities)

docker run \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  nginx
services:
  web:
    image: nginx
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
      - CHOWN
      - SETUID
      - SETGID
    security_opt:
      - no-new-privileges:true
      - apparmor=docker-default

Seccomp安全配置

{
  "defaultAction": "SCMP_ACT_ERRNO",
  "architectures": ["SCMP_ARCH_X86_64"],
  "syscalls": [
    {
      "names": [
        "accept",
        "bind",
        "connect",
        "read",
        "write",
        "open",
        "close"
      ],
      "action": "SCMP_ACT_ALLOW"
    }
  ]
}
docker run --security-opt seccomp=seccomp-profile.json myapp

镜像安全扫描

curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh -s -- -b /usr/local/bin
trivy image nginx:latest
trivy image --severity HIGH,CRITICAL nginx:latest
trivy image myapp:1.0
trivy image --format json -o report.json nginx:latest
security_scan:
  stage: test
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

下篇预告

第 3 篇将继续:监控告警体系、生产环境检查清单、故障排查手册、备份与恢复与最终总结。

更详细内容

个人博客:https://itinstall.dev
公众号:IT安装手册

更多推荐