虚拟机是硬件层面虚拟化,会模拟整套硬件资源,每个虚拟机都要装完整独立操作系统,体积大、启动慢,资源占用高,隔离性极强但效率偏低。Docker 容器是操作系统层面虚拟化,直接共享宿主机的内核,不需要单独装 OS,只有应用和依赖库,体积小、秒级启动,资源消耗极低。简单说,虚拟机是“独立小电脑”,容器是“轻量化进程”,虚拟机适合强隔离、多系统场景,容器更适合微服务、快速部署和弹性扩缩容,日常开发运维用容器效率会高很多。
CMD 是给容器设置默认启动命令,能被 docker run 后面的参数覆盖掉,一个 Dockerfile 里多个 CMD 只有最后一个生效。ENTRYPOINT 是容器的固定入口命令,默认不会被覆盖,更适合作为容器必须执行的启动脚本。两者可以搭配用,ENTRYPOINT 定执行程序,CMD 传默认参数。比如用 ENTRYPOINT 写死启动脚本,CMD 给默认参数,运行时传参只会替换 CMD 部分,不会影响 ENTRYPOINT。简单记:想灵活替换用 CMD,想固定不被改就用 ENTRYPOINT。
镜像相当于容器的“模板、安装包”,是只读的静态文件,包含应用、依赖、配置、运行环境所有内容,能复制、分发、存储。容器是镜像运行起来后的“实例”,是动态的、可读写的进程,一个镜像能启动无数个相互隔离的容器。就像类和对象的关系,镜像是类,容器是实例。镜像负责打包环境,容器负责提供运行环境,修改容器不会影响原镜像,想保存修改可以把容器再打包成新镜像,两者是静态模板和动态运行体的关系。
Docker Compose 是用来一键管理多容器应用的工具,用一个 YAML 文件配置所有服务、网络、数据卷、依赖关系,不用一条条敲 docker run 命令。它能一次性启动、停止、重启整套微服务,自动处理容器间的启动顺序和网络互通。优点特别明显:配置可复用、可版本管理,部署效率极高,单机多容器场景下不用手动维护网络和依赖,开发、测试、生产环境能保持一致,降低环境差异导致的问题,适合前端 + 后端 + 数据库这种多组件组合的项目,上手简单还能大幅减少运维工作量。
Docker 靠 Linux 内核的网络命名空间实现网络隔离,每个容器都有独立的网络栈,包括独立网卡、IP、端口、路由表,和其他容器、宿主机互不干扰。默认会创建 docker0 网桥,容器连到网桥上,同一网桥内容器能互通,不同网桥默认不通。还能自定义桥接、host、none、overlay 等网络模式,通过 iptables 规则控制端口映射、访问权限和流量转发,从内核层面隔断容器网络,既保证容器间通信可控,又能防止一个容器的网络问题影响其他容器或宿主机。
Docker 可以在创建容器时用参数直接限制内存和 CPU,比如 --memory 设置内存上限,--memory-swap 限制交换分区,防止容器占满宿主机内存。CPU 方面,--cpus 设置能使用的核心数,--cpu-shares 设置权重,多容器竞争 CPU 时按比例分配。还能通过 --cpuset-cpus 绑定指定核心,避免资源争抢。这些限制都是基于 Linux cgroups 内核功能实现的,能精准控制容器资源使用,防止单个容器耗尽资源拖垮整个宿主机,保证多容器运行时稳定均衡。
Bind Mount 是直接把宿主机上的现有目录或文件挂载到容器里,路径固定,依赖宿主机目录结构,权限容易出问题,移植性差,性能稍高但管理不灵活。Volume 是 Docker 自己管理的数据卷,存放在 Docker 统一目录里,不用关心宿主机路径,Docker 负责权限、生命周期管理,支持数据共享、迁移、备份,跨平台移植性好,还能实现容器间数据共享。Volume 更适合生产环境,稳定安全;Bind Mount 适合开发时本地代码实时同步到容器,两者性能差异不大,生产优先用 Volume。
Docker Swarm 是 Docker 官方的容器集群管理工具,能把多台 Docker 主机组成一个集群,统一管理和调度容器。它支持服务编排、弹性扩缩容、故障自愈,内置服务发现和负载均衡,部署简单,和 Docker 生态无缝兼容,不用额外装复杂组件。特性包括去中心化设计、滚动更新、回滚、服务高可用,适合中小规模容器集群,轻量易用,学习成本低。主要用来管理跨主机的容器服务,实现集群化部署、统一运维,满足生产环境高可用、可扩展的需求。
容器日志尽量输出到 stdout 和 stderr,不要写本地文件,方便 Docker 直接采集。用 docker logs 查看临时日志,生产环境要做日志聚合,对接 ELK、Loki、Graylog 等工具统一收集、存储、查询。给日志加标签、区分服务和容器名,方便检索。设置日志滚动策略,限制日志文件大小和数量,避免占满磁盘。不要在容器里存大量日志,容器销毁日志不丢失,核心是“容器无状态化 + 集中式管理”,同时规范日志格式,方便后续排查问题和数据分析。
首先用官方或可信镜像,定期更新、扫描漏洞,不用最新标签避免意外更新。容器以非 root 用户运行,最小权限原则,不挂载不必要的宿主机目录。限制容器内存、CPU 等资源,开启安全相关内核参数。网络上用自定义网桥,默认拒绝跨网络访问,控制端口映射,不用 host 网络。镜像构建用多阶段,减少无关依赖和漏洞面。定期清理无用容器、镜像、数据卷,敏感信息不用环境变量明文存,用 Secret 管理,同时开启容器健康检查和审计日志,全方位降低安全风险。
容器生命周期从创建到销毁有完整命令链:docker create 只创建不启动,docker start 启动已创建容器,docker run 相当于创建 + 启动一步到位。docker stop 优雅停止,docker kill 强制杀死,docker restart 重启。docker pause 暂停容器,docker unpause 恢复。docker rm 删除停止的容器,docker ps 查看运行中的容器,docker ps -a 看所有状态容器。整个流程就是创建→启动→运行→暂停→恢复→停止→删除,配合这些命令能完整控制容器从生成到销毁的全过程,日常运维最常用 run、stop、rm、ps 这几个。
镜像构建靠 Dockerfile 执行指令,从基础镜像开始,一步步执行 FROM、RUN、COPY、CMD 等命令,每执行一条指令就生成一个只读层。Docker 会先检查本地缓存,有相同层就直接复用,没有才重新构建。所有层构建完成后合并成最终镜像,最后打上标签。构建命令是 docker build,能指定 Dockerfile 路径和标签。过程中要注意优化指令顺序,把不常变的放前面,充分利用缓存加速构建,同时精简指令,减少镜像层数和体积,避免多余依赖和文件,保证镜像轻量安全。
Docker 有几种常用网络模式:bridge 桥接模式是默认模式,容器有独立 IP,通过网桥和宿主机通信,容器间互通。host 主机模式,容器共享宿主机网络,没有独立 IP,性能最高但隔离差。none 无网络模式,完全封闭,适合安全要求极高的场景。container 模式,和另一个容器共享网络栈。overlay 模式用于跨主机集群通信。还有自定义网桥,比默认 bridge 更安全可控,能控制访问策略。日常开发用 bridge,集群用 overlay,追求性能用 host,根据隔离和业务需求选择即可。
环境变量用来给容器传配置,不用改代码或配置文件。运行时用 docker run -e 键 = 值 设置,多个变量就多次用 -e。也能在 Dockerfile 里用 ENV 指令设置镜像默认环境变量,还能把变量写在 env 文件里,用 --env-file 加载。容器内部可以直接读取这些变量,适合传数据库地址、端口、运行模式等配置。使用时注意区分 build 时和运行时变量,ARG 只用在构建阶段,ENV 运行时也能用,环境变量让容器更灵活,同一个镜像能在不同环境用不同配置。
Volume 是 Docker 管理的独立数据存储目录,不和容器生命周期绑定,容器删除数据也不会丢。它用来持久化容器里的数据,比如数据库文件、日志、上传文件。优点很多:数据持久化,容器重建不丢失;能在多个容器间共享数据;由 Docker 统一管理,移植性强,不依赖宿主机目录结构;支持备份、迁移、恢复;权限更安全,避免直接操作宿主机文件;性能不错,适合生产环境。相比绑定挂载,Volume 更稳定、更易管理,是容器数据持久化的首选方案。
Docker 靠 Linux 内核两大核心技术实现隔离:Namespace 和 Cgroups。Namespace 负责资源隔离,把 PID、网络、文件系统、用户、IPC、主机名等资源分隔开,每个容器感觉自己独占系统。Cgroups 负责资源限制,控制容器能用的 CPU、内存、磁盘、网络带宽等,防止资源争抢和滥用。两者配合,Namespace 保证“看不见、干扰不到”,Cgroups 保证“用不多、抢不过”,从逻辑隔离和资源限制两方面,让多个容器在同一宿主机安全稳定运行,互不影响。
Docker 镜像由多个只读层叠加而成,每一层对应 Dockerfile 里的一条指令,比如 FROM、RUN、COPY 都会生成一层。层是可复用的,不同镜像共用相同层,只存一份,节省存储空间。构建镜像时,Docker 会按顺序叠加这些层,只读层保证镜像稳定不变,容器运行时会在最上层加一个可写层,所有修改都在可写层,不影响底层镜像。分层结构让镜像构建快、分发快、存储省,更新时只改变动的层,不用全量重建,极大提升镜像管理和传输效率。
跨主机通信靠 overlay 网络实现,这是 Docker 原生的跨主机网络模式,需要搭配 Swarm 集群或第三方存储(如 etcd)共享网络信息。overlay 网络会在多台主机上创建虚拟网络,不同主机上的容器连到同一个 overlay 网络,就像在同一局域网,能直接通过容器名或 IP 通信。底层用 VXLAN 技术封装数据包,跨主机传输。也能用第三方方案如 Calico、Flannel,适合大规模集群。核心是虚拟网络 + 数据包封装,让跨主机容器互通像单机一样简单。
容器是轻量共享内核的,一旦单个容器被攻破,可能影响整个宿主机和其他容器,安全漏洞危害极大。生产环境容器数量多、迭代快,镜像来源复杂,很容易带入漏洞。实施安全实践能减少攻击面,防止越权、提权、数据泄露、资源耗尽等问题,保证业务稳定和数据安全。合规方面也要求做好权限、审计、漏洞管理。安全不是可选操作,是容器上线的基础,忽略安全会导致服务瘫痪、数据丢失,甚至引发线上生产事故,必须从构建到运行全流程重视。
Docker 内置 DNS 服务发现,同一网络内的容器可以用服务名或容器名直接互相访问,不用记 IP。Swarm 集群里,服务创建后会分配虚拟 IP,DNS 会把服务名解析到虚拟 IP,再由负载均衡转发到实际容器。容器启动时会自动注册到 DNS,停止时自动注销,动态维护解析关系。跨主机的 overlay 网络也支持同样的 DNS 解析。不用手动配置 hosts 或静态 IP,扩容、缩容、重启容器都不影响服务访问,自动适配变化,极大简化微服务间的通信管理。
存储驱动负责管理镜像层和容器可写层的存储,不同驱动性能和场景不同。overlay2 是现在默认推荐的,性能好、稳定性高、层数限制宽松,适合绝大多数场景。devicemapper 适合老版本 CentOS,直接用块设备,性能一般。btrfs、zfs 支持快照和压缩,适合有高级存储需求的场景。aufs 是早期驱动,兼容性好但层数有限。存储驱动决定镜像读写、分层、拷贝的效率,生产环境优先用 overlay2,根据操作系统和业务存储需求选择,保证容器读写性能和稳定性。
健康检查用来判断容器运行是否正常,不是启动就代表可用。在 Dockerfile 用 HEALTHCHECK 指令配置检查命令、间隔、超时、重试次数,比如检查端口、接口、进程是否存在。也能在 docker run 时加参数配置。Docker 会定期执行检查,根据结果标记 healthy 或 unhealthy, unhealthy 的容器 Swarm 会自动重建自愈。健康检查能及时发现应用假死、端口不通、服务异常等问题,不用人工监控,配合集群编排工具,实现自动故障恢复,保证服务持续可用,是生产环境必备的机制。
端口映射用来把宿主机的端口和容器端口绑定,让外部能访问容器里的服务。用 docker run -p 宿主机端口: 容器端口 实现,-P 会随机分配宿主机端口。桥接模式下,容器有独立 IP,端口映射通过 iptables 转发流量。host 模式不用映射,直接用宿主机端口。端口映射支持 TCP 和 UDP 协议,能指定网卡 IP 限制访问来源。外部流量先到宿主机端口,再转发给容器,既保证容器网络隔离,又能对外提供服务,是容器暴露服务最常用的方式,配置简单还能控制访问入口。
Docker 镜像全是只读层,多层叠加,运行容器时会在最顶层加一个可写层。容器里所有修改、新增、删除文件,都只在可写层操作,不会改动底层镜像。只读层保证镜像不变、可复用、可共享,可写层保证容器运行时能存储临时数据、日志、配置修改。容器删除时,可写层一起删掉,数据不持久化,所以重要数据要放数据卷。这种结构叫写时复制,只有修改文件时才复制到可写层,节省空间和性能,兼顾镜像稳定性和容器运行灵活性。
环境变量不能存明文密码、密钥、Token 等敏感信息,容易被 docker inspect 查到,日志或进程信息也可能泄露。生产用 Docker Secret、K8s ConfigMap/Secret 或外部配置中心管理敏感数据。ENV 只存非敏感配置,如运行模式、语言、普通端口。构建镜像用 ARG 代替 ENV 存临时构建变量,避免留在镜像里。不用在 Dockerfile、docker-compose.yml 里硬编码敏感信息,也不要通过命令行 -e 明文传密钥,做好权限控制,防止无关人员查看环境变量,从源头避免数据泄露。
Docker 用 iptables 实现网络访问控制,自定义网桥可以配置网络策略,限制容器间、容器与外部的访问规则。默认网桥不支持 DNS,自定义网桥能更好控制互通。宿主机防火墙配合 iptables 规则,只开放必要端口,禁止外部非法访问。Swarm 集群可以配置网络策略,限制服务间访问权限,实现微服务的网络隔离。集成 firewalld、ufw 等防火墙工具,统一管理宿主机和容器网络流量,防止端口暴漏、非法入侵、横向渗透,按最小权限原则配置网络,提升整体安全。
容器本身无状态,重点备份数据卷和配置。数据卷用 docker volume 备份,把数据卷打包成压缩文件,或直接复制 Volume 目录。镜像备份用 docker save 导出,docker load 恢复。容器配置用 docker inspect 导出,方便重建。定时自动备份,备份文件存外部存储,多地冗余防止丢失。恢复时先恢复数据卷,再用原镜像或备份镜像重建容器,加载配置。测试环境定期演练恢复流程,保证备份可用。核心是“容器不备份,只备份数据 + 配置 + 镜像”,简单高效,出问题能快速恢复业务。
单机多副本,同一服务启动多个容器,避免单点故障。用 Swarm、K8s 等集群工具,实现容器自动调度、故障自愈,节点挂了自动在其他节点重建。配置健康检查,异常容器自动替换。服务前加负载均衡,分发流量到多个副本。数据用共享存储或主从同步,防止数据单点。镜像稳定可靠,版本固定,滚动更新不中断服务。监控告警实时发现节点、容器、服务异常,及时处理。多节点集群 + 自愈 + 负载均衡 + 数据冗余,全方位保证服务不中断,满足生产高可用要求。
靠 Linux Cgroups 实现资源限制,创建容器时指定内存、CPU、磁盘 IO、网络带宽上限,防止单个容器耗尽宿主机资源。--memory 限制内存,--cpus 限制 CPU 核心数,--device-read-bps 限制磁盘读写速度。集群环境下,Swarm 或 K8s 能统一管理资源配额,给节点、服务分配资源总量,调度时保证不超配。资源配额能避免资源争抢,保证核心服务稳定,防止恶意程序或异常容器影响整个环境。生产环境必须配置,是多容器混跑的基础保障,让资源利用更均衡合理。
服务是 Swarm 里定义的应用模板,指定镜像、副本数、资源、网络、重启策略等期望状态,是逻辑上的服务单元。任务是服务的实际运行实例,一个服务会拆分成多个任务,调度到不同节点运行,每个任务对应一个容器。Swarm 负责保证任务数量和定义一致,任务挂了就自动新建。服务是“期望状态”,任务是“实际运行体”,扩容服务就是增加任务数,缩容就是减少任务数。用户只需要管理服务,不用关心任务具体在哪个节点,简化集群运维。
默认 root 运行容器,一旦容器被攻破,攻击者能获取宿主机 root 权限,风险极大。用非 root 用户,遵循最小权限原则,容器内只有有限权限,就算出安全问题,也无法越权操作宿主机或其他容器,减少攻击面。能防止容器内恶意程序修改系统文件、提权、挂载敏感目录等操作,符合安全规范。在 Dockerfile 里创建普通用户,切换后再运行应用,配置简单,安全收益极高,是生产环境必须做的安全配置,从运行层面降低风险。
镜像每一条指令对应一层,构建时 Docker 会检查本地缓存,指令和上下文没变化就直接复用旧层,不用重新执行。把不常变的指令放前面,比如基础镜像、安装依赖,频繁变的代码复制放后面,就能最大化利用缓存。修改代码后,只有代码层及之后的层重新构建,前面的依赖层全复用。分层缓存让构建从全量变成增量,速度大幅提升,还节省网络和存储资源。合理安排 Dockerfile 指令顺序,是优化构建速度最简单有效的方法,日常构建一定要利用好。
多阶段构建是在一个 Dockerfile 里用多个 FROM 阶段,前一阶段负责编译、打包,后一阶段只复制运行必需的产物,丢弃编译环境和多余依赖。比如 Java 项目先用 maven 镜像编译,再用 jre 镜像运行,最终镜像只有运行环境和 jar 包,体积极小。优势是大幅减小镜像体积,减少漏洞和依赖,提升传输、拉取、启动速度,安全又高效。避免了编译工具、源码留在镜像里,生产环境非常实用,解决了传统构建镜像臃肿、不安全的问题。
Java 虚拟机会默认按宿主机内存配置堆大小,不是容器限制的内存,直接导致容器内存超限被 OOM 杀死。设置容器内存限制后,必须同步配置 JVM 参数,指定堆内存上限,让 JVM 感知容器内存。新版 JDK 支持容器内存感知,老版本要手动调参。内存太小会频繁 GC,应用卡顿;内存太大浪费资源。要根据容器内存合理设置 JVM 堆、元空间,预留系统内存。不配套配置,Java 应用很容易崩溃,内存限制和 JVM 参数必须配合好,才能稳定运行。
启动慢常见原因:镜像体积大,拉取慢;基础镜像臃肿,依赖多;启动命令复杂,初始化耗时;数据卷挂载慢或网络解析慢;宿主机资源不足,CPU、IO 瓶颈;健康检查配置不合理,间隔太短。解决方法:用多阶段构建精简镜像,选轻量基础镜像;优化启动脚本,减少初始化操作;本地缓存镜像,避免重复拉取;排查宿主机磁盘、CPU 资源;合理配置健康检查和网络 DNS;优化数据卷挂载。找到瓶颈针对性优化,大部分容器都能做到秒级启动。
容器退出时,docker stop 会默认给 10 秒宽限期,让应用优雅关闭,保存数据、断开连接、清理资源,超过 10 秒才强制杀死。可以用 -t 参数自定义宽限期,给应用足够的优雅退出时间。应用要支持 SIGTERM 信号,收到信号后正常收尾,不要直接暴力退出。避免用 docker kill 直接强制杀死,容易导致数据丢失、文件损坏、连接异常。安全退出和合理宽限期,能保证业务数据完整,服务停得平稳,升级、重启、缩容时不丢数据、不抛异常。
单机多容器用 Docker Compose,YAML 配置管理,一键启停,适合开发测试。集群多节点用 Docker Swarm 或 K8s,实现调度、扩缩容、自愈。监控用 Prometheus+Grafana、cAdvisor,看容器状态和资源。日志用 ELK、Loki 聚合。编排工具统一管理生命周期,自动化部署用 Jenkins、GitLab CI。策略上容器无状态化,服务拆分,统一配置和数据管理。工具组合使用,从部署、运行、监控、日志全流程管理,降低多容器运维复杂度,保证规模化运行稳定。
先看容器状态和网络模式,docker inspect 查 IP、网关、DNS。测试容器内部网络,ping 网关、宿主机、外部地址,判断是内部还是外部问题。检查端口映射是否正确,宿主机防火墙、iptables 规则是否拦截。同一网络内容器互 ping,检查 DNS 解析是否正常。看 Docker 日志和宿主机系统日志,找网络报错。跨主机就查 overlay 网络、集群节点连通性、VXLAN 封装。一步步从容器内部到宿主机再到外部网络,逐层定位,大部分网络问题都能快速找到原因。
优先用 Volume 代替 Bind Mount,统一管理,性能稳定。用轻量存储驱动 overlay2,减少读写开销。多阶段构建精简镜像,减少无用文件和层。避免在容器内写大量临时数据,日志输出到 stdout,由外部管理。数据卷定期清理无用数据,开启压缩。大文件放外部存储,不占容器存储。监控存储使用,防止磁盘满。镜像分层合理,利用缓存,减少重复数据。存储优化核心是减少读写、减小体积、集中管理,提升性能的同时,避免存储耗尽影响业务。
容器默认继承宿主机时间,但可能出现时区不对、时间漂移,导致日志时间错乱、定时任务异常。解决方法:运行时挂载宿主机本地时间文件 -v /etc/localtime:/etc/localtime:ro,保证时区和时间一致。也能在 Dockerfile 里设置时区环境变量。集群环境用 NTP 服务同步宿主机时间,容器直接复用。时间不同步会引发业务逻辑错误、数据异常、排查困难,尤其是分布式服务,时间一致非常重要,简单挂载就能解决,是部署时必做的基础配置。
镜像容易带系统漏洞、依赖漏洞,上线前必须扫描。用 Trivy、Clair、Docker Scout 等工具,自动扫描镜像里的 CVE 漏洞、恶意配置、敏感信息。集成到 CI/CD 流程,构建时自动扫描,高危漏洞阻止上线。定期更新基础镜像和依赖,修复已知漏洞。只使用官方、可信镜像,不随意用未知镜像。建立漏洞管理流程,分级处理漏洞,高危立即修复,低危定期整改。安全扫描是镜像上线的门槛,提前发现漏洞,避免上线后被攻击,保障业务安全。
容器默认有独立文件系统,和宿主机隔离,通过挂载实现交互。Bind Mount 直接挂载宿主机目录,读写直接操作宿主机文件;Volume 由 Docker 管理,间接交互。容器读写镜像层是只读,修改复制到可写层。可以挂载宿主机配置、设备、时间文件,但要控制权限,只读挂载防止容器修改宿主机文件。交互要遵循最小权限,不挂载敏感目录,避免越权。合理的文件交互能共享配置和数据,不当挂载会带来安全风险,生产环境要严格控制挂载范围和权限。
单机用 Docker Compose 手动扩副本,集群用 Swarm 或 K8s 实现自动扩缩容。配置 CPU、内存、QPS 等指标阈值,监控指标达到阈值时,自动增加或减少服务副本数。配合健康检查,保证扩缩容时服务可用。自动扩展能应对流量高峰,不用人工干预,流量低时自动缩容节省资源。集成监控系统和编排工具,设置弹性策略,保证服务性能的同时,优化资源使用。适合流量波动大的互联网服务,提升响应速度和资源利用率。
容器共享宿主机内核,网络栈轻量,桥接模式损耗小,host 模式几乎无损耗,转发效率高,延迟低、吞吐量高。虚拟机是硬件虚拟化,有独立网络栈,经过多层模拟和转发,损耗大,延迟高,性能比容器低。容器网络开销远小于虚拟机,高并发、高吞吐量场景优势明显。虚拟机隔离更强,但性能差;容器性能好,隔离稍弱。对网络性能要求高的微服务、高并发应用,优先选容器;对隔离要求极高、不在乎性能损耗的场景,用虚拟机。
把证书放在数据卷或 Secret 里,不打进镜像,避免泄露。配置最新 TLS 版本,禁用老旧不安全协议和加密套件。证书定期更新,用自动续期工具,防止过期。容器内配置正确的证书路径和权限,只读权限防止篡改。对外服务用域名 + 证书,不裸跑 HTTP。镜像不包含私钥,私钥单独安全管理。监控证书有效期,告警即将过期的证书。SSL/TLS 保证传输加密,防止数据窃听、篡改,配置安全合规,是对外服务的必备安全措施。
容器通过 Volume 插件对接外部存储,如 NFS、AWS EBS、阿里云云盘、Ceph、GlusterFS 等。用 Docker 存储驱动或第三方插件,把外部存储挂载成容器 Volume,使用方式和本地 Volume 一样。容器不用关心存储底层,统一读写,数据存在外部,跨节点、跨容器共享,支持持久化和迁移。集成后容器完全无状态,方便扩缩容和迁移,适合数据库、文件服务等有大量数据的应用。外部存储保证数据高可用、冗余,和容器轻量特性完美配合。
跨主机日志不能单机管理,要集中聚合。用 Filebeat 或 Docker 日志驱动,把每台主机的容器日志发送到 Kafka、Redis 缓冲,再存入 Elasticsearch,用 Kibana 查询展示。也能用轻量的 Loki+Promtail,部署简单,资源占用低。日志加主机名、容器名、服务名标签,方便检索。统一日志格式,结构化输出,方便分析。跨主机聚合能集中查看、排查、告警,不用逐个节点查日志,大规模集群环境下,是日志管理的标准方案。
先通过 docker stats 看容器内存持续升高,判断泄漏。进入容器用 jstat、jmap 查 Java 应用,用 top、ps 看进程,用内存分析工具看对象引用。导出堆 dump 文件,分析泄漏点。查看应用日志,找异常创建、未释放的资源。检查代码,是否有连接未关闭、缓存无限增长、线程泄漏等问题。优化代码,修复泄漏点,同时给容器设置内存限制,防止影响宿主机。结合监控和分析工具,定位泄漏代码,从根源解决,保证容器长期稳定运行。
基于 CI/CD 流程,代码提交后自动触发构建、测试、镜像打包、扫描。通过 Jenkins、GitLab CI、GitHub Actions 实现自动化,镜像打版本标签,不 latest。测试通过后,自动部署到测试环境,验证通过再滚动更新到生产。用编排工具统一管理部署,支持回滚机制,部署失败自动恢复。镜像统一存私有仓库,权限控制。全流程自动化,减少人工操作,降低出错概率,保证多环境一致,发布高效稳定,适合频繁迭代的业务。
提前做好镜像、数据卷、配置备份,存外部独立存储,多地冗余。制定恢复流程,明确恢复顺序、步骤、责任人。故障时先切换流量到备用集群,再修复故障节点。用备份快速恢复数据和容器配置,重建服务。定期做恢复演练,保证备份可用、流程顺畅。集群多节点跨机房部署,避免单点故障。服务无状态化,快速迁移重建。灾难恢复核心是“备份可靠、流程清晰、演练到位”,出现故障能最短时间恢复业务,减少损失。