本文最后更新于 2024-07-28,文章内容可能已经过时。

大家好,这里是Cherry,喜爱折腾、捡垃圾、玩数码,热衷于分享NAS、docker玩耍经验~

| 前言

各位爱玩耍NAS的小伙伴们,你们对docker的使用熟悉程度如何呢?部署docker的时候你们会不会把所有的部署指令统统复制到txt文档里,每次使用的时候再翻出来重新复制一遍呢?

DUCK不必!
image.png

随着docker被墙,国内镜像库良莠不齐,阿里云斩断非ecs供给,cloudflare开始大规模删号,玩耍docker的难度变得越来越高了,以往随便下载的镜像现在都不敢删、舍不得删,存在硬盘里占用空间。

在这样高难度的玩耍过程中,记忆docker指令又是一个学习成本高且麻烦的事。毕竟玩耍NAS不是为了学习,要学docker这里复杂的指令和工具,还不如某海鲜市场花30找人部署来的快~

所以,今天Cherry教各位玩耍docker的朋友们一套更建议的部署方法,那就是docker compose。

🔻下面是我梳理的关于docker compose的三大优势。

🙂一是容器管理简易化。
	所有容器的定义、运行都可以通过文本记录在册,通过修改yml配置文件可以轻松的更改和管理这些容器。
	
😊二是容器管理用持续化。
	所有容器的配置,例如卷、镜像、网络都在yml配置文件里,无论何时,我都可以在yml文件和数据卷的合作下,轻松重启我的docker容器而不用担心容器丢失。
	
😘三是容器管理更安全。
	compose的容器间访问,默认是互联互通,通过hostname的使用,可以让容器不暴露端口的情况下被同个项目下的容器所访问,大大提高了安全性。

🔻本教程涉及到的NAS系统含:

群晖6X、群晖7.1,群晖7.2、威联通、铁威马、极空间、绿联UGOS、绿联UGOS Pro、Unraid、OMV等等。

其中群晖7.2、威联通、铁威马、Unraid、OMV有单独的方法, 其它的都可以使用SSH通用部署。


一、compose版本介绍

目前docker compose有两个版本,两者是可以共存的。

一个版本是docker的插件包: docker compose
另一个版本是独立包: docker-compose

对于目前新系统安装的docker工具来说,应该都是支持docker compose指令的,两者区别在于docker compose无法使用-v指令来获取版本。

这里附带docker-compose的安装方式,通过登录ssh,并输入下列指令后,任何设备都可以安装并支持docker-compose指令。

#安装docker-compose
curl -L https://hub.gitmirror.com/https://github.com/docker/compose/eleases/download/v2.29.0/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose

#赋权
chmod +x /usr/bin/docker-compose

#验证docker-compose版本
docker-compose -v

二、通用SSH部署(绿联UGOS、绿联UGOS Pro、群晖6、群晖7.1等支持SSH功能的NAS)

对于通用型docker compose部署方法来说,前提是我们能拿到SSH权限。

这里比较特殊的一个NAS就是极空间,目前极空间的SSH权限需要通过一定操作来获取,如果无法获取的化,极空间就无法使用docker compose了。

🔻在ssh页面,我们需要来到含有docker-compose.yaml文件的目录指令启动指令。

# 来到文件夹目录
cd /volume1/docker/容器名/
# 启动容器
docker compose up -d
# 独立安装的使用如下指令
docker-compose up -d

三、群晖7.2

群晖因为无法通过CM自动创建路径,所以在我们部署项目前,将所有compose代码中涉及到的路径都新建,确保不会出错。

打开Container Manager,选择项目,点击新建,选择路径,点击下一步即可。

image.png

四、威联通

打开Container Station,选择【应用程序】,点击【创建】,将代码复制进去,点击验证后部署即可。

image.png

五、铁威马

打开Docker Manager,选择【项目】,点击【+】,选择文件路径以后,填入代码即可。

image.png

六、Unraid

在应用商城,搜索docker compose,安装图里的插件。
image.png

安装以后,在docker里就有docker compose可视化页面了
image.png

七、OMV

OMV的docker指令来源于插件包,而其自带的插件包数量有限,因此我们需要通过安装三方插件源的模式来更新插件,需要登陆SSH。

更换软件源

apt-get install vim
vim /etc/apt/sources.list.d/openmediavault.list

将所有文本前面打星号,然后新增下面两行
image.png

deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/public/ sandworm main

deb [signed-by=/usr/share/keyrings/openmediavault-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/packages/ sandworm main

修改omvextras.list文件

vim /etc/apt/sources.list.d/omvextras.list
# 将文件修改为下面这行代码
deb https://mirrors.tuna.tsinghua.edu.cn/OpenMediaVault/openmediavault-plugin-developers sandworm main

安装第三方插件包

wget -O - https://hub.gitmirror.com/https://github.com/OpenMediaVault-Plugin-Developers/packages/raw/master/install | bash

八、支持compose的软件

当然,除了NAS自身外,还有很多的docker可视化应用是支持使用compose部署的,这里给出几款经典的软件,感兴趣的可以下载使用。

1、dockge

dockge是一款专门针对docker compose的可视化应用项目,由uptime kuma作者开发。该项目通过一个界面,实现了compose类目的整合。我们可以通过可视化编辑yml文件,可以轻松管理和运维compose项目。

🟡所有dockge管理的compose项目,都必须将docker-compose.yml文件放到环境变量DOCKGE_STACKS_DIR所设置的目录下。
image.png
image.png

🔻dockge部署代码

services:
  dockge:
    image: louislam/dockge:1
    restart: unless-stopped
    ports:
      # Host Port : Container Port
      - 5001:5001
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./data:/app/data
        
      # If you want to use private registries, you need to share the auth file with Dockge:
      # - /root/.docker/:/root/.docker

      # 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 is your stacks directory
      - DOCKGE_STACKS_DIR=/opt/stacks

2、portianer

老牌dockerUI项目,放在dockge后面的原因是整合效果和运维内容不如dockge那么多,不支持直接更新镜像文件。

🟡所有portianer管理的compose项目,都必须使用portainer的界面上进行新建。
image.png

🔻portainer部署代码

version: "2.1"

services:
  portainer:
    image: outlovecn/portainer-cn:latest
    container_name: portainer
    restart: always
    ports:
      - "9000:9000"
      - "8000:8000"
    volumes:
      - ./dockerconfig/portainer:/data
      - /var/run/docker.sock:/var/run/docker.sock