Linux系统中Docker配置最佳实践:第2篇
·
本文为 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安装手册
更多推荐


所有评论(0)