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

在单台 Linux 服务器上部署 Docker,最佳实践应围绕安全性、可维护性、资源隔离与监控展开。以下是经过验证的核心建议:


✅ 一、基础环境与安装规范

  1. 使用官方推荐方式安装

    # 移除旧版本(如有)
    sudo yum remove docker 
                    docker-client 
                    docker-client-latest 
                    docker-common 
                    docker-latest 
                    docker-latest-logrotate 
                    docker-logrotate 
                    docker-engine
    
    # 安装依赖
    sudo yum install -y yum-utils
    
    # 添加 Docker 官方仓库(以 CentOS/RHEL 为例)
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    # 安装最新稳定版
    sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    💡 避免从第三方源或 apt-get install docker.io(Debian 默认包可能非最新版)。

  2. 启用 systemd 管理 + 开机自启

    sudo systemctl enable --now docker
    sudo systemctl status docker
  3. 配置镜像提速(国内用户必做)
    编辑 /etc/docker/daemon.json

    {
     "registry-mirrors": [
       "https://docker.m.daocloud.io",
       "https://huecker.io"
     ],
     "insecure-registries": [],
     "log-driver": "json-file",
     "log-opts": {
       "max-size": "10m",
       "max-file": "3"
     }
    }

    ⚠️ 重启 Docker:sudo systemctl daemon-reload && sudo systemctl restart docker


🔒 二、安全加固(关键!)

措施 说明
非 root 运行容器 默认禁止 --privileged;应用层用 USER 指令指定非 root 用户
限制 capabilities 如:docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE ...
只读根文件系统 --read-only --tmpfs /tmp:rw,size=100M
网络隔离 创建自定义 bridge 网络;避免 --network host
禁用 TCP 监听暴露 除非必要,不绑定 -p 0.0.0.0:xxx,改用 -p 127.0.0.1:xxx 或反向X_X
定期更新 & 漏洞扫描 结合 docker scan(需 Docker Scout)或 Trivy 扫描镜像

示例安全启动命令:

docker run -d 
  --name myapp 
  --read-only 
  --cap-drop=ALL 
  --cap-add=NET_BIND_SERVICE 
  --security-opt=no-new-privileges:true 
  -p 127.0.0.1:8080:80 
  --user 1000:1000 
  myapp-image

📦 三、项目组织与生命周期管理

  • 统一目录结构(推荐):
    ~/docker/
    ├── projects/
    │   └── myapp/
    │       ├── docker-compose.yml
    │       ├── .env
    │       └── data/          # 持久化数据挂载点
    ├── logs/                  # 集中日志(可选)
    └── backup/                # 备份策略
  • 使用 Compose 编排:避免手动 docker run,用 docker compose up -d 管理多服务。
  • 标签规范:镜像打语义化标签(如 myapp:v1.2.3),避免 latest 用于生产。
  • 清理机制
    # 定期清理悬空镜像、停止容器、未使用卷
    docker system prune -a --volumes

📊 四、监控与日志

  • 日志驱动:默认 json-file 已合理;若量大可切换为 fluentdsyslog
  • 内置监控
    docker stats            # 实时资源占用
    docker inspect <id>     # 详细配置查看
  • 推荐集成 Prometheus + Grafana:通过 cAdvisornode-exporter 采集指标。
  • 告警设置:对 CPU/内存/磁盘使用率设置阈值告警(如使用 Alertmanager)。

🛡️ 五、备份与灾难恢复

  • 数据持久化:始终将 /data, /var/lib/postgresql 等挂载到宿主机目录或 volume。
  • 备份策略
    # 示例:备份所有 volumes
    tar czf ~/backup/volumes-backup-$(date +%F).tar.gz 
    $(docker volume ls -q)
  • 测试恢复流程:每季度验证一次备份可用性。

❌ 常见反模式(避免!)

  • 直接 docker run -it 长期运行服务(无守护进程管理)
  • 大量使用 --privileged--net=host
  • 将敏感信息(密码、密钥)硬编码进镜像或环境变量明文
  • 忽略磁盘空间监控 → 导致 /var/lib/docker 爆满使系统崩溃

需要我针对你的具体场景(如:Web 服务、数据库、CI/CD 节点)提供定制化配置模板吗?