Docker部署需兼顾可维护性、安全性与一致性:标准化镜像构建(Dockerfile+多阶段+非root)、严格运行时限制(资源/安全/网络)、无状态设计(环境变量/标准输出日志/健康检查)、统一目录命名规范。

Linux容器运维中,Docker部署不是“能跑就行”,而是要兼顾可维护性、安全性与一致性。核心在于标准化镜像构建、合理配置运行时参数、统一日志与网络策略,并通过明确的目录结构和命名约定支撑团队协作。
镜像构建:用Dockerfile而非commit,坚持分层精简
禁止通过docker commit从运行容器直接生成镜像——这会导致环境不可追溯、依赖不透明、安全基线失控。所有镜像必须源自版本受控的Dockerfile。
- 基础镜像选官方alpine或distroless(如gcr.io/distroless/java),避免使用latest标签
- 多阶段构建(multi-stage)分离编译与运行环境,最终镜像只含必要二进制和配置
- 每条RUN指令应合并操作(如apt update && apt install -y xxx && rm -rf /var/lib/apt/lists/*),减少层数并清理缓存
- 非root用户运行:添加USER指令,禁止以root身份启动应用进程
容器运行:显式声明资源限制与安全选项
不加限制的容器在生产环境中等同于裸机暴露——CPU、内存、文件描述符、挂载权限都需收敛。
- 必须设置--memory、--cpus、--pids-limit,防止单容器拖垮宿主机
- 禁用特权模式(--privileged=false),默认启用--read-only,仅对必要路径加--volume /app/config:/config:ro
- 挂载宿主机路径时使用绑定挂载(bind mount)而非volume,确保路径可审计;敏感配置用--secret或--config(Swarm)注入
- 网络使用自定义bridge网络,禁用--network host,显式声明--publish或--expose端口
部署管理:配置即代码,容器即无状态实例
Docker容器不是虚拟机,不应保存状态。所有外部依赖(数据库、缓存、对象存储)必须解耦,配置通过环境变量或挂载配置文件注入。
- 环境变量统一前缀(如APP_LOG_LEVEL、DB_HOST),避免污染全局命名空间
- 日志全部输出到stdout/stderr,禁用日志轮转(logrotate)或本地文件写入;由宿主机日志采集器(如fluentd、filebeat)统一收集
- 健康检查必须定义:HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 CMD curl -f http://localhost:8080/health || exit 1
- 重启策略设为--restart unless-stopped,避免异常退出后静默失联
目录与命名:统一结构,支撑CI/CD流水线
项目根目录下固定包含docker/子目录,内含Dockerfile、.dockerignore、docker-compose.yml(仅用于开发联调)、entrypoint.sh(如有定制初始化逻辑)。
- 镜像命名规范:registry.example.com/team/app-name:v1.2.3,禁止使用latest
- 容器名格式:app-name-env-01(如api-prod-01),便于监控识别和批量操作
- .dockerignore必须包含.git、.gitignore、README.md、*.md、node_modules(Node.js)、target(Java)等无关内容
- entrypoint.sh须有执行权限,且第一行写#!/bin/sh -e,确保失败立即退出










