服务器重启后如何按自定义顺序重启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替代日志/健康检查判断容器就绪,可以这样做:
- 先安装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
- 在脚本的高内存容器启动部分,替换等待逻辑为:
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
相关产品推荐
相关产品推荐

