单台Linux服务器部署Docker的最佳实践有哪些?

在单台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. 防火墙与网络配置

  • 使用 ufwfirewalld 控制端口访问。
  • 仅暴露必要的端口(如 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 工作负载,适合开发、测试或中小型生产环境。