大家都是怎么管理多个docker镜像的?

如题,大家都是怎么管理多个docker镜像的?

我服务器上跑了8个镜像,我用的办法是把不同docker镜像的docker-compose.yml文件放在同一个父目录下的不同子目录,然后在脚本中定义工作目录为该父目录,通过脚本来管理。

我的目录结构类似于:

  • /etc
    • /docker-compose
      • /wechat

我的脚本长这样:

#!/bin/bash

usage() {
    echo ""
    echo "使用说明:这个脚本用于管理 Docker 容器,支持 start, stop, restart,logs, pull命令"
    echo "用法一,启动所有镜像: ./docker.sh [指令]"
    echo "用法二,启动特定镜像: ./docker.sh -n [服务] [指令]"
    echo ""
    echo "服务:"
    echo ""
    echo "  wechat: chatgpt-on-wechat"
    echo "  chatnext: chat-next-web"
    echo "  chatgemini: chetgemini"
    echo "  gemini: gemini-pro-chat"
    echo "  oneapi: oneapi"
    echo "  bing: go-proxy-bingai"
    echo "  coze: coze-discord-proxy"
    echo "  lobe: lobe"
    echo ""
    echo "命令:"
    echo ""
    echo "  start: 启动服务"
    echo "  stop: 停止服务"
    echo "  restart: 重启服务"
    echo "  logs: 查看日志"
    echo "  pull: 更新镜像并重启"
    echo ""
    echo "示例:"
    echo ""
    echo "  ./docker.sh start - 启动所有服务"
    echo "  ./docker.sh stop - 停止所有服务"
    echo "  ./docker.sh -n wechat restart - 重启wechat服务"
    exit 1
}
# 检查至少有一个参数
if [ "$#" -lt 1 ]; then
    usage
fi

parent_dir="/etc/docker-compose"

perform_action() {
    dir=$1
    action=$2
    echo "*** $action $dir ***"
    case $action in
        start)
            (cd "$dir" && docker compose up -d)
            ;;
        stop)
            (cd "$dir" && docker compose down)
            ;;
        restart)
            (cd "$dir" && docker compose down && docker compose up -d)
            ;;
        logs)
            (cd "$dir" && docker compose logs -f)
            ;;
        pull)
            (cd "$dir" && docker compose pull && docker compose up -d)
            docker image prune -f --filter "dangling=true"
            ;;
        *)
            echo "未知操作: $action"
            usage
            ;;
    esac
}

if [ "$1" = "-n" ]; then
    # 指定服务操作
    if [ "$#" -ne 3 ]; then
        usage
    fi
    service_name=$2
    action=$3
    service_dir="$parent_dir/$service_name"
    if [ ! -d "$service_dir" ]; then
        echo "未找到对应的服务,请检查你的输入。"
        exit 1
    fi
    perform_action "$service_dir" "$action"
else
    # 对所有服务执行操作
    action=$1
    for dir in "$parent_dir"/*; do
        if [ -d "$dir" ]; then
            perform_action "$dir" "$action"
        fi
    done
fi

PS:本人并无编程经验,代码由GPT-4生成后多次修修补补而来,不喜轻喷

有没有更好的方法或者管理软件啥的?

3 Likes

portainer

6 Likes

搞七捻三快问快答

1 Like

谢谢 我康康啊

1 Like

上K8S

一只不习惯用docker-compose,这种模式是需要自己git pull吧,感觉watchtower更轻松一些

内网NAS用群晖自带的,外网的用portainer

群晖自带的好像是独家的,找不到

下周试试

dockge

跟你方法一样,放在/opt/app1 /opt/app2等等。每个里面一个docker-compose.yml,而且每个container都配置一个ip地址,前端用bt panel反向代理到每个container的port。

没有用portainer,可能能节省点mem资源。

学习了

还有一个办法,uptime kua的作者出品 doge 管理,他的方式是在/opt下面建立一个doge目录,然后把所有的项目作为app1 app2,然后里面还是docker-compose.yml,如此进行管理。

k8s

你这充其量算是容器管理,镜像管理不应该用镜像仓库吗

我用1panel

From #develop:qa to 开发调优

1 Like