在单台Linux服务器上部署Docker时,遵循最佳实践可以提升系统安全性、性能和可维护性。以下是关键的最佳实践建议:
1. 选择合适的Linux发行版
- 推荐使用长期支持(LTS)版本,如:
- Ubuntu 20.04/22.04 LTS
- CentOS Stream / Rocky Linux / AlmaLinux
- Debian 11/12
- 确保系统稳定、更新及时,并有良好的社区或企业支持。
2. 保持系统更新
# 更新系统包
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo yum update -y # CentOS/RHEL
定期更新内核和安全补丁,防止已知漏洞。
3. 使用官方源安装 Docker
避免使用过时的系统包管理器中的 Docker(如 docker.io),应使用官方 Docker CE 源:
# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
4. 配置非 root 用户使用 Docker
避免直接使用 root 用户操作 Docker:
# 将当前用户加入 docker 组
sudo usermod -aG docker $USER
# 重新登录或执行 newgrp docker
newgrp docker
⚠️ 注意:
docker组等同于 root 权限,仅授予可信用户。
5. 启用并配置 systemd 启动
确保 Docker 开机自启:
sudo systemctl enable docker
sudo systemctl start docker
6. 优化 Docker 存储驱动和目录
- 默认使用
overlay2驱动,通常最优。 - 可更改数据目录以避免根分区占满:
// /etc/docker/daemon.json
{
"data-root": "/opt/docker",
"storage-driver": "overlay2"
}
然后重启 Docker:
sudo systemctl restart docker
7. 限制容器资源
防止某个容器耗尽系统资源:
docker run -d
--memory=512m
--cpus=1.0
--restart=unless-stopped
nginx
在 docker-compose.yml 中也可设置:
services:
app:
mem_limit: 512m
cpus: 1.0
8. 使用 Docker Compose 管理多服务应用
便于管理多个容器和服务依赖关系:
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "80:80"
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: example
启动:docker-compose up -d
9. 加强安全配置
- 启用内容信任(Content Trust):
export DOCKER_CONTENT_TRUST=1 - 扫描镜像漏洞:
docker scan nginx:latest - 使用可信基础镜像(如
alpine,distroless),避免latest标签用于生产。 - 不以
--privileged运行容器,除非必要。 - 避免挂载宿主机敏感目录(如
/,/etc)。
10. 日志管理
配置日志轮转,防止日志文件无限增长:
// /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
11. 监控与维护
- 使用
docker stats实时查看资源使用。 - 配置监控工具(如 Prometheus + cAdvisor)。
- 定期清理无用镜像、容器、卷:
docker system prune -f docker volume prune -f
12. 备份关键数据
- 容器本身是临时的,重要数据应通过 命名卷(named volumes) 或 绑定挂载(bind mounts) 持久化。
- 定期备份数据库卷和配置文件。
示例:
docker run -d
-v db-data:/var/lib/mysql
--name mysql-server
mysql:8.0
13. 防火墙与网络配置
- 使用
ufw或firewalld控制端口访问。 - 仅暴露必要的端口(如 80, 443),避免开放 Docker 默认网桥到公网。
- 考虑使用自定义网络隔离服务:
docker network create myapp-network
14. 使用 .env 和 secrets 管理敏感信息
避免在 docker-compose.yml 中硬编码密码:
# .env
MYSQL_ROOT_PASSWORD=securepassword123
# docker-compose.yml
services:
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
生产环境建议使用 Docker Secrets 或外部密钥管理工具(如 Hashicorp Vault)。
15. 定期审计与更新
- 定期检查:
docker images查看是否有旧镜像。docker ps -a清理停止的容器。
- 升级 Docker 引擎至稳定新版本。
总结:关键原则
| 类别 | 最佳实践 |
|---|---|
| 安全 | 非 root 用户、最小权限、镜像扫描 |
| 性能 | 资源限制、优化存储 |
| 可维护性 | 使用 Compose、日志轮转、定期清理 |
| 可靠性 | 数据持久化、自动重启策略 |
| 监控 | 日志、资源监控、告警机制 |
遵循这些实践,可以在单台 Linux 服务器上高效、安全地运行 Docker 工作负载,适合开发、测试或中小型生产环境。
CLOUD技术笔记