ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Dockge 使用教程:用可视化面板高效管理 Docker Compose 服务栈

Dockge 使用教程:用可视化面板高效管理 Docker Compose 服务栈 我们这些常年混服务器的人手边维护的 docker-compose 文件一多真是容易炸裂。早期我管理一堆服务栈靠的是脑子里记路径、记端口再配一个密密麻麻的 Markdown 笔记时间一长哪个服务挂在哪个目录、哪个 compose 改没改过根本对不上号。后来用了 Dockge这一块才算真正顺起来。Dockge 是 Uptime Kuma 作者 louislam 出的一个管理 docker-compose 的可视化面板直白点说就是给你所有的 compose 文件一个统一的家在网页上就能看状态、改配置、拉日志、启停服务不用再每次 ssh 进去翻目录敲命令。这篇文章从我的实际使用经验出发把 Dockge 怎么装、怎么用、踩过哪些坑一次讲透。1. 为什么需要 Dockge从命令行到可视化管理的痛点1.1 多服务栈管理的原始难题先说一个非常普遍的场景一台服务器上跑着 Nginx、Nexus、数据库、监控面板、内网工具等十来个服务。每个服务一个目录目录里放一个 docker-compose.yml。看起来井井有条但真正操作起来全是麻烦记不住目录结构。服务多了以后哪些服务是测试环境、哪些是生产环境全靠猜。改配置靠 Vi保存之后要自己执行 docker compose up -d一旦写错缩进或者端口冲突报错信息能让人盯屏幕半天。看日志要一条条 tail -f多个服务出问题就得开多个终端窗口。忘了哪个服务占用了哪个端口最后只能 netstat 挨个查。这些问题不是不能解决但解决很费时间而且容易出错。尤其当你在紧急处理故障时越急越容易敲错命令然后陷入改错—重启—再改错的恶性循环。Portainer 也是个选项但它是面向容器的通用管理面板对 docker-compose 栈这种“服务集合”的管理不够聚焦。Dockge 的出现正好把这一个细分领域做透了。1.2 Dockge 的核心理念目录即资产Dockge 的设计思路非常清晰它不重新发明轮子而是把你服务器上已有的 compose 文件目录管理起来。你指定的某个目录比如 /opt/stacks就是它的“栈仓库”Dockge 会自动扫描这个目录下的子目录把每个包含 compose.yaml / compose.yml / docker-compose.yml 的子目录识别为一个“栈”。这种设计带来两个直接好处第一你现有的目录组织结构可以原封不动保留不用为了迁入 Dockge 而重新编排路径第二Dockge 本身不存储额外的配置文件所有的 compose 文件仍然是你自己的资产哪怕有一天 Dockge 挂了你手动 docker compose up -d 依然能拉起所有服务。这个概念比“一个工具管所有容器”要稳妥得多也更符合我们这些习惯手动控制一切的人的使用心理。另一个非常舒服的点是Dockge 的界面操作逻辑和手动工作流几乎完全一致编辑文件、保存、部署、看日志、重启。它没有搞一套抽象层不会让你在网页上点了一通之后还要怀疑它到底在服务器上执行了什么操作。所见即所得适合那些想把控制权握在自己手里的人。2. Dockge 核心能力拆解它到底牛在哪里2.1 栈管理状态一屏扫完Dockge 的主界面会对所有栈进行卡片式列表展示。每个卡片上你能直接看到这个栈的名称、当前运行状态、容器数量、最近日志摘要。运行状态分区很直观绿色表示正常红色表示出错灰色表示已停止。这个界面看起来简简单单但实际用起来信息量非常大尤其当你有二三十个栈的时候哪个挂了一目了然不需要再输入 docker ps 然后一行行比对。更重要的是Dockge 支持直接对栈执行启动、停止、重启、更新操作。更新操作底层调用的就是 docker compose pull docker compose up -d和手动执行完全一致。这意味着你在网页上干的每一件事都可以在命令行里找到对应动作心智负担极小。2.2 内置编辑器语法检查与智能提示Dockge 自带了一个功能相当完整的编辑器在浏览器里直接打开某个栈的 compose 文件就能改。这个编辑器有 YAML 语法高亮支持缩进提示还有基础的字段补全。刚开始我觉得编辑器都是花架子直到有一次我在网页里编辑时不慎把缩进写错了它直接标红报错省掉了我在命令行里反复 up -d 试探的时间。不过要提醒一句Dockge 的编辑器并不是 IDE别指望它有官方的 Compose Specification 全字段校验。它重点解决的是 YAML 语法层错误和缩进问题更复杂的逻辑问题比如卷路径非法的、镜像名不存在还得靠部署时的实际报错来反馈。但作为日常调整配置的工具已经非常够用了。它在保存时还会自动备份上一个版本这个功能我后面细说别小看这一下。2.3 日志与终端不用再开 SSH每个栈的详情页里都集成了日志查看功能支持实时滚动刷新。你可以同时开多个栈的日志页面横向对比各服务的输出这在排查联动故障时非常爽。比如 Nginx 反向代理连不上后端应用以前要开两个终端分别 tail现在并排两个标签页就解决。另外Dockge 还提供了网页终端功能。这个终端可以在对应栈的容器里执行命令也可以在 Dockge 容器自身里跑 shell。虽然我没有把它当主力终端用但在某些只暴露了 HTTP 端口的受限环境里这个功能相当于给你开了一扇后门应急处理小问题非常方便。2.4 资源占用与部署方式轻量是硬道理Dockge 本身的资源占用非常克制容器化部署之后内存通常在几十 MB 到一百多 MB 之间。它自带一个轻量 Web 服务和内置的 terminal不需要额外装数据库不用 Redis也没有外部依赖就吃一个 Docker socket 和几个文件目录。这决定了它非常适合跑在 VPS、树莓派、NAS 这类资源不富裕的设备上。部署方式上Dockge 官方推荐用 docker-compose 部署它自己吃自己的狗粮同时也方便你统一管理整个栈目录。3. 实操部署 Dockge从零到跑通一个完整栈3.1 部署前的准备系统与 Docker 环境检查在动手之前先确认三件事Docker Engine 已经安装并运行正常Docker Compose 插件可用以及你有一个固定的目录用来存放 compose 文件。Dockge 对 Docker Compose 版本有一定要求建议使用 Compose V2也就是 docker compose中间带空格这个命令。如果你还在用老旧的 docker-compose带横杠的 Python 版本最好先升级否则后面排查问题会很闹心。目录方面建议规划一个专门的栈根目录比如 /opt/stacks。在这个目录下每个服务建立独立子目录例如 /opt/stacks/nexus、/opt/stacks/nginx。整个结构一目了然也方便备份。Dockge 只负责管理这个目录它不会主动去动你服务器上其他位置的 compose 文件所以也不用担心它越权操作。3.2 用 docker-compose 拉起 Dockge 本身Dockge 官方提供了一个 compose 文件模板。我在实际部署时做了一些微调这里放出我当前在用的版本services: dockge: image: louislam/dockge:1 container_name: dockge restart: unless-stopped ports: - 5001:5001 environment: - DOCKGE_STACKS_DIR/opt/stacks volumes: - /var/run/docker.sock:/var/run/docker.sock - ./data:/app/data - /opt/stacks:/opt/stacks几个关键点逐个说一下。volume 部分挂载了 /var/run/docker.sock这是 Dockge 和 Docker Engine 通信的唯一通道没有它就没法操作容器和读取状态。挂载 ./data 是为了持久化 Dockge 自己的配置数据比如暗色模式偏好、编辑器的历史备份文件等。而 DOCKGE_STACKS_DIR 这个环境变量告诉 Dockge 去哪个目录扫描 compose 栈。建议设为 /opt/stacks这样你后续手动创建的目录也会被自动识别。把这段内容保存为 docker-compose.yml然后执行 docker compose up -d 启动。如果一切正常访问 http://服务器IP:5001 就能看到 Dockge 的初始化页面。首次打开会让你指定栈目录如果你已经在 environment 中设置了 DOCKGE_STACKS_DIR那它就直接显示这个路径确认一下即可。3.3 多版本 Docker Engine 与 Compose 的配合问题这里必须单独插一段因为我在部署时确实在这里卡过。Dockge 官方对 Compose 版本和 Docker Engine 版本并不算特别苛刻但它调用的底层命令和 Compose 规范相关。尤其是在新部署 Docker Engine 的机器上你大概率用的是 docker compose 插件但老机器上可能残留着旧版 docker-compose。这个时候如果 Dockge 执行“部署”操作报错先不要怀疑 Dockge而是去看机器上执行 docker compose up -d 本身是否报错。我个人的建议是统一使用“docker engine docker-composev2 插件”组合。也就是通过 Docker 官方源安装 Docker Engine并确保 docker compose version 能正常输出版本号。尽量避免同时存在 docker-compose 和 docker compose 两套命令因为它们有可能指向不同的实现在自动化脚本和 Dockge 内部调用时会引入不确定性。3.4 添加第一个服务栈以 Nexus 3.28.1 为例Dockge 装好后第一个栈加什么我推荐用一个有实际业务价值的服务这样你能立刻体验到完整的工作流。这里以用 docker-compose 部署 Nexus 3.28.1 为例。Nexus 是一个仓库管理工具常用于搭建内网的 Maven、npm、Docker 镜像仓库非常吃内存但对 compose 管理来说是个典型项目。在 Dockge 界面中点击“创建栈”输入名称比如 nexusDockge 会在 /opt/stacks/nexus 目录下生成一个 compose.yaml然后打开在线编辑器。我把初始内容粘贴进去services: nexus: image: sonatype/nexus3:3.28.1 container_name: nexus restart: unless-stopped ports: - 8081:8081 volumes: - nexus-data:/nexus-data volumes: nexus-data:保存后点“部署”Dockge 就会执行镜像拉取和容器创建。首次启动 Nexus 需要一点耐心因为应用初始化比较慢日志里出现“Started Sonatype Nexus”才算真正就绪。这个过程中你可以直接点开日志面板实时观察输出比在命令行里 docker logs -f 体验好得多因为日志面板自动滚动不会刷屏干扰其他操作。部署完成后浏览器访问 http://服务器IP:8081 就能打开 Nexus 管理界面。这里提一下 Nexus 3.28.1 的一个注意点首次启动后admin 用户的初始密码在容器内的 admin.password 文件里你可以在 Dockge 的网页终端中执行 cat /nexus-data/admin.password 查看。这个文件在首次登录后会被删除所以别等太久再去拿。3.5 通过 Dockerfile 扩展 Dockerfile 场景等等这里不是要讲 Dockerfile而是想说明 Dockge 的栈不局限于直接使用官方镜像的 compose。比如你在内网环境中可能需要给 nexus 镜像加一些自定义配置。常见做法是先写一个 Dockerfile 继承 sonatype/nexus3:3.28.1做一些环境定制再通过 docker-compose build 构建。Dockge 完全支持这种工作流它构建时读取 Dockerfile 并执行镜像构建和命令行行为一致。我当时为了让 Nexus 使用内网 DNS 解析就额外加了一个自定义脚本挂载进去改起来比直接改容器内部文件要干净得多升级镜像的时候也不会丢配置。4. 经典报错排查实录libz.so.1 与 Compose 环境问题4.1 老机器上的经典报错error while loading shared libraries: libz.so.1在做迁移和帮朋友修服务器时我多次遇到过这个经典报错docker-compose: error while loading shared libraries: libz.so.1: failed to map segment from shared object。这个报错通常只出现在使用老版本 docker-composev1 系基于 Python 和 pip 安装的机器上。它的直接含义是 docker-compose 这个可执行文件在运行过程中无法将 libz.so.1 这个共享库成功映射到进程的地址空间导致程序启动直接崩溃。很多人在这一步就慌了以为是 Docker 环境彻底坏了。其实大可不必背后的原因通常就几种一是系统里 zlib 库确实缺失二是系统里存在多个 libz.so.1 的软链接指向了不兼容的版本三是运行用户对库文件没有读权限或者 NFS 挂载的库文件被限制四是某些精简系统本身开了奇怪的编译选项导致 Python 加载动态库失败。排查顺序建议是先确认命令来源再检查库依赖最后解决库文件问题。4.2 解决步骤从确认到修复首先确认你调用的 docker-compose 到底是什么来源which docker-compose如果输出路径在 /usr/local/bin 或者 /usr/bin基本可以认定是 pip 或包管理器安装的 Python 版。然后检查它的动态库依赖ldd $(which docker-compose) | grep libz正常情况下你会看到类似 libz.so.1 /lib/x86_64-linux-gnu/libz.so.1 的输出。如果这里直接显示 not found那问题就是库缺失重新安装 zlib 即可。以 Debian/Ubuntu 为例apt-get update apt-get install -y zlib1g安装完成后再次运行 ldd确认链接正常。如果库存在但映射失败也就是报错里的 failed to map segment那大概率是运行时文件系统或内存相关问题。查看一下当前磁盘空间和内存df -h free -h如果某个挂载点空间不足尤其是 /tmp 分区满了Python 解析动态库时可能无法创建临时映射文件就会出现这段报错。清理空间、重启服务后再次执行 docker-compose 版本往往就能恢复。不过说实话根治这个问题的最终手段还是换掉老掉牙的 docker-compose。现在 Docker 官方力推的是 Docker Engine 内置的 Compose V2 插件也就是 docker compose 这个命令。它直接用 Go 编写随 Docker Engine 一起分发没有 Python 环境依赖没有 pip 依赖也就不会出现加载 libz.so.1 这种诡异问题。我在所有新环境里已经彻底向 docker compose 迁移老机器的 docker-compose 只用来做一次性存量迁移工具。4.3 处理 Dockge 内部的 Compose 调用异常在 Dockge 实际操作中偶尔会在部署某个栈时看到类似“return code 1”“exit code 1”的提示点开详情界面上显示的往往就是 Docker Compose 的标准错误输出。我第一次遇到这种问题时第一反应是去翻 Dockge 的日志后来发现完全没必要。Dockge 把 compose 命令的 stdout 和 stderr 都透传到了前端你只要看那个错误详情实际上就等于在服务器上执行 docker compose up -d 看到的结果。所以排查思路很简单如果 Dockge 部署报错先回到服务器终端手动进入对应栈目录执行 docker compose up -d看看本机是否能复现同样的错误。如果能复现那问题出在 Docker 环境或 compose 文件本身跟 Dockge 无关按常规思路排查。如果本机正常但 Dockge 报错才需要检查权限、路径映射或者 socket 通信。实际经验里绝大多数报错在服务器端就能直接定位。4.4 高频 Compose 问题速查表根据项目热词里出现的几个方向我把日常用 Dockge 管理 compose 时遇到的高频问题整理成了一张表方便对照处理。现象可能原因处理方式部署时提示 image not found镜像名写错或镜像不存在检查镜像名与 tagdocker pull 手动验证端口冲突两个服务占用了同一物理机端口修改 compose 中 ports 左侧宿主机端口卷挂载后文件不生效宿主机目录权限不足chmod 或 chown 调整目录权限重启容器容器一直重启启动命令异常或健康检查不通过查看日志检查环境变量和 entrypointNexus 首次启动后需要很久才可用应用初始化未完成耐心等待日志中出现 Started Sonatype Nexuslibz.so.1 error老版 docker-compose Python 环境异常重装 zlib或改用 docker compose 插件这张表里的问题每一个我都至少在实际环境里碰到过一次。尤其是端口冲突和卷权限这两类几乎占了日常维护问题的一半。用 Dockge 的好处在于错误信息环绕着对应的栈展示不会像命令行那样在满屏日志中丢失重点。但底层的解决逻辑终究还是要回到对 Docker 和 Compose 本身的理解上所以别把 Dockge 当成万能面板它更准确的定位是“顺手的管理工具”。4.5 典型案例复盘compose 文件里的环境变量陷阱再讲一个具体案子。我在 Dockge 里维护一个服务栈原本一直正常某天更新了 compose 文件之后部署结果容器起来了但服务不可用。打开日志面板发现应用在读取数据库连接地址时拿到了空值。排查后发现是因为我在 compose 文件里使用了环境变量引用 ${DB_HOST}但是部署时忘了在 Dockge 的栈环境变量配置里填充这个变量。在命令行环境下这个变量可能是从 Shell 全局环境继承的而在 Dockge 的部署流程中它只读取 compose 文件里显式声明的 env 信息。这个案例提醒我在 Dockge 里管理栈环境变量要么用默认值兜底要么显式配置。尽量不要依赖宿主机全局环境变量因为你的预期环境并不一定在 Docker 的部署上下文中存在。这也是为什么我在后面会建议把 compose 文件写成“自包含”的格式该写的默认值都写上宁可啰嗦一点不要留隐式依赖。5. 进阶玩法与个人心得把 Dockge 用成生产力工具5.1 目录与命名规范我踩过坑后的最佳实践Dockge 的目录设计虽然自由但如果你不给定规范很快就会乱起来。我现在的习惯是在 /opt/stacks 下只放“活跃项目”每个项目目录名简洁且对应服务名比如 databases、nginx、nexus、monitor。不会出现类似“test1”“tmp2”这种命名。每个项目里的 compose 文件统一命名为 compose.yaml。Dockge 官方文档其实支持 compose.yaml、compose.yml、docker-compose.yml 三种命名但统一成 compose.yaml 能减少歧义尤其在脚本里处理时更加省心。另一个重要规范是同一个栈尽量只服务一个业务不要把一堆关联性很弱的服务塞进一个 compose 里。Dockge 的启停操作是针对整个栈的如果你把 Nginx 和数据库塞在一起更新数据库时 Nginx 也会被重启造成不必要的抖动。关联性强、需要一起启停的服务放一起弱关联服务拆开这是管理上的一个核心准则。5.2 数据备份与迁移Dockge 带来的便利与注意点Dockge 把所有的 compose 文件放在一个统一目录下这让备份变得异常简单。我每天凌晨用 rsync 同步 /opt/stacks 目录到另外一台备份机整个目录不大几 MB 到几十 MB 而已但包含了所有服务的“定义文件”。真正恢复时只需要在新服务器上安装好 Docker、Compose、Dockge再把这个目录同步过去Dockge 就会自动识别全部栈。但这里有一个坑我必须强调compose 文件恢复不代表数据恢复。Nexus 的制品数据、数据库文件这些都会放在命名卷里Dockge 不会帮你备份卷数据。命名卷的数据通常存放在 /var/lib/docker/volumes 下如果服务器整机挂了compose 文件找回容易卷数据找回来就很难。所以不要只备份 stacks 目录还得关注命名卷的备份方案。我的做法是把重要数据通过 bind mount 挂载到宿主机目录然后用同一套 rsync 任务在备份机同步这样 compose 定义和实际数据在同一个备份体系里恢复流程也更顺畅。5.3 Docker Compose V2 与 Docker Engine 版本匹配的注意事项前面已经提到迁移到 docker compose 插件这里再深入一点Docker Compose V2 插件的版本和 Docker Engine 版本有对应关系。通常 Docker Engine 在安装时就会附带匹配的 compose 插件所以只要你不是手动乱更新、乱装社区版一般不会出现兼容问题。但在某些测试环境里如果发现 docker compose 命令执行时出现“unknown flag”“network not found”之类的奇怪错误十有八九是版本不匹配。在 Dockge 中如果碰到这种情况不要尝试通过修改 Dockge 配置来绕开正确做法是统一宿主机上的 Docker Engine 和 Compose 插件版本。检查版本的命令很简单docker version docker compose version两者版本差异过大时优先选择升级 Docker Engine再配合官方源安装对应版本的 compose 插件。我个人比较推荐直接用 apt 源安装 docker-ce、docker-ce-cli、docker-compose-plugin 三个包保证版本一致。5.4 结合反向代理安全暴露 DockgeDockge 本身没有复杂的用户认证体系默认打开页面就能用。如果直接把它暴露到公网风险非常高。我的做法是Dockge 只绑定在内网 IP 或 127.0.0.1 上不让它直接对外监听然后通过已有的 Nginx 或 Caddy 反向代理加上基本认证来访问。compose 里端口映射可以写成只监听本地ports: - 127.0.0.1:5001:5001这样外网直接访问不了 5001 端口只有通过反代才能进入。如果你更追求省事也可以在 Dockge 容器前面再加一个带 Basic Auth 的 Nginx 容器但我觉得用现成的反代更合适少起一个容器就少一份维护负担。5.5 更新 Docker 镜像和容器的一致性问题在 Dockge 里更新一个栈很简单点一下更新按钮就行。长时间用下来我发现这个按钮能极大简化镜像升级流程。但要注意更新是面向整个栈的也就是说它会重新拉取该栈内所有服务的镜像。如果你只是想让其中一个服务更新镜像其他服务保持不动手动操作更精准。我的更新流程是先在 Dockge 里备份当前版本它支持从编辑器的历史记录里恢复再点击更新最后观察日志面板确认所有服务都健康运行才关闭页面。有一次我更新一个包含数据库和应用的栈更新完发现数据库版本被自动拉到了新的大版本导致应用连接时报认证失败。虽然用 Dockge 历史版本一键回滚了但浪费了不少时间。后来我学乖了涉及数据库这类有状态服务在 compose 文件里明确写死镜像 tag不写 latest减少意外升级的风险。6. 常见问题与部署心得正在用 Dockge 的你可能会碰到这些6.1 Dockge 无法访问容器却不报错这种情况下先检查端口映射是否被其他服务抢占。Dockge 默认端口是 5001但如果你在其他容器里也映射过 5001两个容器会互相冲突Docker 不会主动提醒你映射冲突。另一个常见原因是防火墙或安全组没有放行该端口。我在云服务器上最常遇到的就是这个控制台的入站规则没加 5001本地怎么访问都超时Docker 这边日志却干干净净。还有一个容易被忽略的点Dockge 如果设置了 bind mount 目录而该目录权限不对容器可能无法读取或写入栈数据表现就是白屏或卡在初始化页面。这时去宿主机执行 chmod 755 或 chown 调整目录权限重启容器即可。6.2 编辑器保存后未触发自动部署Dockge 的编辑器默认只保存文件不会自动部署。这是很多初次使用者容易误解的地方以为保存之后就生效了。实际上它的工作流是“保存 → 部署”你在编辑器里做的修改只会落到 compose 文件需要再次点击部署按钮Dockge 才会执行 docker compose up -d 让改动生效。这个设计有其合理性如果你在编辑一个复杂的栈还没改完就自动部署很可能把服务搞挂。但如果你习惯改完立刻生效就会觉得多了一步。我个人的建议是保持这个手动部署的习惯好处是每次部署都是你主动控制的出问题时能立刻对应到当时的改动点排查效率高得多。6.3 Docker Socket 权限与安全边界前面已经说过Dockge 需要挂载 Docker socket 才能工作。这意味着任何能访问 Dockge 页面的人实际上都拥有整个 Docker 的控制权。所以前面提到的反向代理认证非常重要。不要因为觉得“内网环境安全”就完全裸奔内网的攻防复杂度不低尤其当你把 Dockge 跑在 NAS 或家庭服务器上时暴露的端口越多风险越大。如果能接受还可以考虑为 Dockge 单独创建受限用户和 socket 代理但这对普通用户来说配置成本太高。我目前的做法是绑定内网 IP 反向代理认证 定期更新 Dockge 镜像三重措施下来安全性和便利性达成了不错的平衡。6.4 使用体验上的几个小细节Dockge 的界面上有两个小功能非常提升幸福感。一个是“复制栈”功能可以通过一个模板快速复制出一个新栈适合批量搭建相似服务。比如我要开多个测试环境先手动配好第一个后面直接用复制功能生成新的再改端口和目录名就行不用从零去写 compose。另一个是历史版本备份它会在每次保存时自动生成备份可以在编辑器里查看和恢复历史记录。这个功能在调试阶段特别好用。我经常改一个配置文件越改越乱最后直接恢复到早上正常运行的版本几秒钟解决。功能虽小但救命的时候是真救命。6.5 迁移老 compose 项目到 Dockge 的实操步骤如果你已经有一批手动管理的 compose 项目迁移到 Dockge 不需要做任何额外操作。Dockge 里设置栈目录为 /opt/stacks 后把你现有的项目整个目录移动或复制到 /opt/stacks 下刷新 Dockge 页面就能看到这些栈被自动识别。唯一要注意的是每个栈的 compose 文件必须位于子目录下且文件名要符合规范。我迁过一批老项目大部分都直接识别成功了只有个别因为文件名叫 docker-compose_without_env.yml 之类的没被扫描到改名为 compose.yaml 后恢复正常。最后再分享一个实操中的体会。Dockge 这东西用熟了之后你会慢慢忘掉“它在管理 compose 文件”这件事而是把它当成“看板 控制台”来用。我每天上班第一件事不是 ssh 上服务器而是打开 Dockge 主页扫一眼所有栈的状态看到绿色就放心了。如果有异常直接在网页上拉日志、看报错、改配置大多数情况不需要开终端。这种体验上的转变其实是管理思路的转变从“记住一切”变为“让工具把状态展示清楚”。Dockge 没有止步于做一个管理面板它把 compose 文件这个基础资产真正盘活了。如果你还在用一堆 scattered 的 compose 文件裸奔不妨花十分钟把它部署起来后面省下的时间会远超这十分钟。
返回列表