You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务器重启后如何按自定义顺序重启Docker容器?

解决Docker容器分批启动避免内存溢出的方案

核心思路

先取消所有容器的Docker自动重启配置,改用自定义启动脚本+系统服务来实现分批启动:先启动低内存消耗的容器,再逐个启动高内存容器,且每个高内存容器完全就绪后再启动下一个。


步骤1:取消所有容器的自动重启

避免Docker自带的重启机制和自定义脚本冲突,执行批量命令:

# 列出所有容器ID并批量取消自动重启
docker ps -aq | xargs docker update --restart no

步骤2:编写分批启动脚本

创建脚本文件/usr/local/bin/docker-sequential-start.sh,内容如下(替换为你的容器名称列表):

#!/bin/bash

# 1. 先启动23个低内存容器
LOW_MEM_CONTAINERS=("web-app-1" "db-cache" "monitoring" ...) # 替换为你的低内存容器名
for container in "${LOW_MEM_CONTAINERS[@]}"; do
    echo "Starting low-memory container: $container"
    docker start "$container"
done

# 2. 逐个启动高内存容器,等待就绪后再启动下一个
HIGH_MEM_CONTAINERS=("build-service-1" "compiler-2" ...) # 替换为你的7个高内存容器名
for container in "${HIGH_MEM_CONTAINERS[@]}"; do
    echo "Starting high-memory container: $container"
    docker start "$container"
    
    # 方式A:如果容器配置了健康检查,等待健康状态(推荐)
    echo "Waiting for $container to be ready..."
    docker wait --condition healthy "$container"
    
    # 方式B:无健康检查时,通过日志关键字判断(替换为你的就绪标识)
    # until docker logs "$container" 2>&1 | grep -q "Compilation completed successfully"; do
    #     sleep 10
    # done
done

echo "All containers started successfully"

给脚本添加执行权限:

chmod +x /usr/local/bin/docker-sequential-start.sh

步骤3:配置系统服务实现开机自动执行

创建systemd服务文件/etc/systemd/system/docker-sequential-start.service:

[Unit]
Description=Sequential Docker Container Startup
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/docker-sequential-start.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启用并启动服务:

systemctl daemon-reload
systemctl enable docker-sequential-start.service

关于dockerize的用法(可选)

如果想用dockerize替代日志/健康检查判断容器就绪,可以这样做:

  1. 先安装dockerize:
curl -L https://github.com/jwilder/dockerize/releases/download/v0.7.0/dockerize-linux-amd64-v0.7.0.tar.gz | tar -C /usr/local/bin -xzv
  1. 在脚本的高内存容器启动部分,替换等待逻辑为:
docker start "$container"
# 等待容器内的服务端口就绪(替换为容器实际监听的端口)
LOCAL_PORT=$(docker port "$container" 8080 | cut -d: -f2)
dockerize -wait tcp://localhost:$LOCAL_PORT -timeout 300s

关键注意事项

  • 给高内存容器配置健康检查(在Dockerfile或docker run时添加),能更准确判断就绪状态,比如:
    HEALTHCHECK --interval=10s --timeout=5s CMD curl -f http://localhost/health || exit 1
    
  • 测试脚本:手动执行一次/usr/local/bin/docker-sequential-start.sh,观察容器启动顺序和内存占用情况,调整等待间隔或就绪判断逻辑。

内容的提问来源于stack exchange,提问作者Viv Bass

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:57:05