容器异常或停止自动启动脚本
方案1:使用 systemd 监控(推荐)
1.1 创建 systemd 服务
创建/etc/systemd/system/nginx-container.service,信息如下:
vi /etc/systemd/system/nginx-container.service,信息如下: [Unit] Description=Nginx Docker Container Requires=docker.service After=docker.service Wants=network-online.target [Service] Type=forking Restart=always RestartSec=10 TimeoutStartSec=0 ExecStart=/usr/local/bin/start-nginx-container #ExecStop=/usr/bin/docker stop -t 10 nginx [Install] WantedBy=multi-user.target
1.2 创建启动脚本
创建/usr/local/bin/start-nginx-container,信息如下:
vi /usr/local/bin/start-nginx-container,信息如下: #!/bin/bash CONTAINER_NAME="nginx" COMPOSE_DIR="/root/nginx" echo "监控容器: $CONTAINER_NAME" # 检查容器是否在运行(docker ps 查看运行中的容器) if ! docker ps --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then echo "$(date): 容器 $CONTAINER_NAME 未运行" # 先尝试启动已有容器 if docker start "$CONTAINER_NAME" 2>/dev/null; then echo "$(date): 成功启动已有容器" else echo "$(date): 没有找到容器,尝试使用docker-compose重新创建" cd "$COMPOSE_DIR" && docker-compose up -d fi fi
赋予执行权限:
chmod +x /usr/local/bin/start-nginx-container
1.3 启用服务
systemctl daemon-reload systemctl enable nginx-container.service systemctl start nginx-container.service
1.4 使用方法
# 查看服务状态 sudo systemctl status nginx-container # 查看日志 sudo journalctl -u nginx-container -f # 手动重启服务 sudo systemctl restart nginx-container # 停止服务(这会停止监控,但容器可能还在运行) sudo systemctl stop nginx-container # 禁用开机启动 sudo systemctl disable nginx-container
1.5改进脚本
#一、 创建监控脚本 sudo tee /usr/local/bin/monitor-nginx-container > /dev/null << 'EOF'
#!/bin/bash CONTAINER_NAME="nginx" COMPOSE_DIR="/root/nginx" CHECK_INTERVAL=10 trap "echo '监控进程收到信号,退出...'; exit 0" SIGTERM SIGINT echo "开始监控容器: $CONTAINER_NAME" check_and_start() { if ! docker ps --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then echo "$(date '+%Y-%m-%d %H:%M:%S'): 容器 $CONTAINER_NAME 未运行" if docker start "$CONTAINER_NAME" 2>/dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S'): 成功启动已有容器" return 0 else echo "$(date '+%Y-%m-%d %H:%M:%S'): 尝试使用 docker-compose 重新创建" if cd "$COMPOSE_DIR" && docker-compose up -d 2>&1; then echo "$(date '+%Y-%m-%d %H:%M:%S'): 容器创建成功" return 0 else echo "$(date '+%Y-%m-%d %H:%M:%S'): 容器创建失败" return 1 fi fi fi return 0 } check_and_start while true; do for ((i=0; i<CHECK_INTERVAL; i++)); do sleep 1 done if ! docker ps --format '{{.Names}}' | grep -q "^$CONTAINER_NAME$"; then echo "$(date '+%Y-%m-%d %H:%M:%S'): 检测到容器停止,尝试重新启动..." check_and_start fi done EOF # 赋予执行权限 sudo chmod +x /usr/local/bin/monitor-nginx-container #二、 创建 systemd 服务 sudo tee /etc/systemd/system/nginx-container.service > /dev/null << 'EOF' [Unit] Description=Nginx Docker Container Monitor Requires=docker.service After=docker.service Wants=network-online.target [Service] Type=simple Restart=always RestartSec=10 StartLimitInterval=0 User=root Group=root StandardOutput=journal StandardError=journal ExecStart=/usr/local/bin/monitor-nginx-container ExecReload=/bin/kill -HUP $MAINPID KillSignal=SIGTERM TimeoutStopSec=30 [Install] WantedBy=multi-user.target EOF # 重新加载 systemd 并启用服务 sudo systemctl daemon-reload sudo systemctl enable nginx-container.service sudo systemctl start nginx-container.service # 检查服务状态 sudo systemctl status nginx-container.service
浙公网安备 33010602011771号