用了两三年极空间了,什么都好,就是不支持 docker-compose,并且 docker 权限也控制的很死,想要部署带特权的容器都难。

无意中在张大妈闲逛时看到了 root 方法,打开新世界大门,仔细阅读后发现还是一种几乎无损的方式,在一番研究后终于成功获得权限,具体方法可以去张大妈家搜索。

我下面要说的是,在权限拿到后该怎么玩 compose,并且给出自己在部署中遇到的问题解决办法,希望对大家在玩 dockge 时候有一些帮助。

至于有 portainer 为什么还要用 dockge,大家喜欢哪个就哪个,这里不争论,纯玩儿,看到文末也许有答案。

一、部署 dockge

前提是你已经学会进入极空间的 portainer,至于拿没拿到 root 权限,其实并不是很重要,拿到当然最好,对于其他系统那就更轻松了,部署一个 portainer 即可。

另外,这里建议进入自带的 portainer 后,先部署一个新的 portainer,一个是为了使用新版平台,另一个是防止入口封堵。

dockge 官网:https://dockge.kuma.pet/

以下是官方的代码,请注意阅读红色字体内容

version: "3.8"
services:
  dockge:
    image: louislam/dockge:1
    restart: unless-stopped
    ports:
      - 5001:5001
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data
      # Stacks Directory
      # ⚠️ READ IT CAREFULLY. If you did it wrong, your data could end up writing into a WRONG PATH.
      # ⚠️ 1. FULL path only. No relative path (MUST)
      # ⚠️ 2. Left Stacks Path === Right Stacks Path (MUST)
      - /opt/stacks:/opt/stacks
    environment:
      # Tell Dockge where to find the stacks
      - DOCKGE_STACKS_DIR=/opt/stacks

进入堆栈,创建,使用以下代码部署 dockge

version: "3.8"
services:
  dockge:
    image: louislam/dockge:latest
    restart: unless-stopped
    container_name: dockge
    ports:
      - 5001:5001
    privileged: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - xxxxxxxx/data/docker/dockge/data:/app/data
      - xxxxxxxx/data/docker/dockge/stacks:xxxxxxxx/data/docker/dockge/stacks
    environment:
      - DOCKGE_STACKS_DIR=xxxxxxxx/data/docker/dockge/stacks
    network_mode: bridge

这里重点修改带颜色的字体部分,其中对于极空间用户而言,前两个路径的获取是需要一点技巧的:

1、首先如果你有 root 权限,大可以顺藤摸瓜 ssh 进去一个个目录下钻,但不熟悉的话可能要找很久

2、小技巧是,通过 portainer 查看其他容器中有绑定本地持久化目录的配置,参考其路径,如果实在没有,可以直接在极空间 docker 界面创建 dockge,映射好目录,虽然启动会失败,直接停止,回到 portainer 里重新编辑即可

3、再来就是最后那个红字,工作目录,一定记得配置的是实际路径,因为到时候 dockge 里创建容器时是直接加载这个路径作为工作目录的,我看很多教程没有详细说明这点,新手特别注意这里的配置。同时,两端一定要对齐,官方代码注释里明确说明了对等关系,如果不这么做,后续 yaml 文件和持久化文件可能身首异处。

4、最后,蓝色部分是开启特权模式的代码,对于极空间特别是 z4s 用户来说,可能是因为 docker 引擎版本过低,导致部署的容器权限都不够,因此需要增加这行代码来解决一些因为权限问题导致容器反复重启的情况。

基本上这样之后就可以正常启动了,注意端口冲突即可。

二、在 dockge 里部署容器

这里以部署 halo 为例,官方教程:https://docs.halo.run/2.8/getting-started/install/docker-compose/

我们用最简单的仅创建 halo 实例的方式部署,在 dockge 里创建一个 compose,堆栈名字为 halo,右边输入如下代码:

version: "3"

services:
  halo:
    image: halohub/halo:2
    container_name: halo
    restart: on-failure:3
    volumes:
      - ./:/root/.halo2
    ports:
      - "8090:8090"
    privileged: true
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s          
    command:
      # 外部访问地址,请根据实际需要修改
      - --halo.external-url=http://localhost:8090/
      # 初始化的超级管理员用户名
      - --halo.security.initializer.superadminusername=admin
      # 初始化的超级管理员密码
      - --halo.security.initializer.superadminpassword=P@88w0rd

同样记得极空间 z4s 用户要加入特权模式代码。

点击部署按钮即可:

一会儿就启动成功了,启动成功后,你再回 portainer 里会发现,本地持久化目录落地到之前那个工作目录下了,也就是“xxxxxxxx/data/docker/dockge/stacks”里。

这就是刚才强调的原因,如果部署 dockge 时候你填的是网上大多教程里的“/opt/stacks”,你可能死活都找不到持久化目录,因为它需要你 ssh 到系统根目录下找这个路径。

至此,极空间也可以支持 docker-compose 了,还能用这么现代化的界面来部署和更新(对,这个东西 portainer 可没有),很 nice。