Appearance
Docker 服务部署
相较于各种传统的打包软件再分发安装的方式,docker 无需过多的考虑依赖冲突和软件之间的冲突。这让 docker 在运行一些服务时非常的方便快捷,这也让本人分享内网安装的服务时变得非常简单和快捷
传统 docker 启动容器的方式是使用命令行,该方式无法一次性启动多个服务,也不方便与容器的维护。compose 命令的出现则改变了这一点,通过一个名为 compose.yml 的文件,可以更方便的定制容器运行和编组方案。也便于在升级时重新拉取镜像,而不是回忆半天命令行是怎么写的
docker 服务推荐
虽然说 docker 性能较好,但是容器内始终存在磁盘和网络的转发映射消耗,而且 docker 服务自身也增加了脆弱点(更改部分配置需要重启服务,重启存在起不来的可能)。因此一些关键的网络服务、服务器管理或数据库应用最好还是在裸机安装
基础服务组
先来点最基础的服务,portainer。这个是图形化的 docker 管理工具,可通过 gui 的方式启动和管理多台机器上的 docker 服务(删除不需要的镜像,链接容器的内的 shell 或者查看 log)
Portainer 社区版是一个轻量级的服务交付平台,适用于容器化应用程序,可用于管理 Docker、Swarm、Kubernetes 和 ACI 环境。它被设计为易于部署和使用。该应用程序允许您通过“智能”GUI 和/或广泛的 API 管理所有编排器资源(容器、映像、卷、网络等)
yml
version: "3"
services:
portainer-ce:
container_name: portainer-ce
image: portainer/portainer-ce:latest
volumes:
- /data/portainer:/data
- /var/run/docker.sock:/var/run/docker.sock
restart: always
privileged: true
network_mode: host
网页导航
homepage,一个非常的简单实用的导航页。非常简洁大方便于扩展,缺点是要写 yml 配置文件,对不习惯的人可能有点麻烦
Homepage 是一个开源的、现代的、安全的、高度可自定制的应用程序仪表板(Homepage),或者,大家更习惯称这类应用为「导航页」
yml
version: "3"
services:
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
volumes:
- /data/homepage/config:/app/config # app配置文件
- /data/homepage/images:/app/public/images #
- /var/run/docker.sock:/var/run/docker.sock # pass local proxy
ports:
- 3000:3000
restart: unless-stopped
network_mode: "bridge" # "host
智能家居
如果你有一些智能家居应用,那么除了各类厂商的 app 外,你还可以将它们接入一个统一的自有管理平台。相比于米家这种闭源 APP,HASS 可以提供更长的记录时间,更简便的展示和控制方式
Home Assistant 是一个平台,可让您通过语音、应用程序或网络控制您的家庭设备和服务。它可以与 Alexa、Google Assistant 和其他集成一起使用,并提供家庭能源管理等功能
yml
version: "3"
services:
homeassistant:
container_name: home-assistant
image: ghcr.io/home-assistant/home-assistant:stable # home assistant 的最新docker镜像不在docker源,而是在github的源众
# image: ghcr.nju.edu.cn/home-assistant/home-assistant:stable # 南京邮电大学的github-docker镜像
volumes:
- /data/home-assistant:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
privileged: true
network_mode: host
内网 DNS 服务器
这个是更进阶一点的内容,大部分时候直接使用阿里云、腾讯云或者是 114.114.114.114 等可靠的域名基本不会被劫持。但是 adguradhome 对于去广告、代理加速和内网发现仍有用处。如果你的光猫或者是路由器的 dhcp 功能不满足你的要求,它还可以当做 dhcp 服务器
你还在软件偷偷上传你的隐私而烦恼,又或者担心 DNS 被污染?adguard 可以加速你的 dns 解析速度并且通过将广告网址导向到黑洞的方式屏蔽广告
AdGuard Home 是一款用于拦截广告和跟踪的全网络软件。在你设置它之后,它将覆盖您所有的家庭设备,并且您不需要任何客户端
yml
version: "3"
services:
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
volumes:
- /data/adguardhome/work:/opt/adguardhome/work
- /data/adguardhome/conf:/opt/adguardhome/conf
ports:
- 53:53/tcp
- 53:53/udp
- 3000:3000
restart: unless-stopped
network_mode: "bridge" # "host"
节点存活监控
也介绍不少的服务了,而这么多服务怎么才能知道是否正常运行呢?尤其是在有多个虚拟机或者实体机的情况下(我内网大概 40 个服务,10 个虚拟机)。这时候就要使用监控软件了
Uptime Kuma 是一个支持多种特性和通知服务的在线时间监控工具,可以监控 HTTP、TCP、Ping、DNS、Push、Steam 等服务器的在线时间和证书信息
Uptime-Kuma 是一个开源免费的监控工具,可以监控 Web 和网络,支持多语言和多种通知方式,基于 Node.js 和 Vue 3 开发
yml
version: "3"
services:
uptime-kuma:
image: louislam/uptime-kuma
container_name: uptime-kuma
volumes:
- /data/uptime-kuma:/app/data
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
network_mode: "host"
内网部署数据库
理论上来说,由于转发影响 IO,是不推荐使用 docker 方式来部署数据库的。但是毕竟 docker 方式方便迁移和管理,so...
如果你需要部署一些高级服务,比如接下来介绍的一些程序,数据库是必需品。普通程序一般不会内置一个可以处理大量数据或进行复杂联合查询的数据库
正统数据库: MySQL 当然是数据库。查询程序的信息存储和推送都是依赖轮询数据库的,内网的一些测试也可以
yaml
version: "3"
services:
mysql:
image: mysql
container_name: mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: example
ports:
- 3306:3306
volumes:
- /data/mysql/my.cnf:/etc/my.cnf
- /data/mysql/db:/var/lib/mysql
network_mode: "bridge" # "host"
时序数据库: influxdb 也是数据库,很多监控服务都需要专门的时序数据库来压缩量大但是变化不大的时序数据
yaml
version: "3"
services:
influxdb:
image: influxdb
container_name: influxdb2
restart: unless-stopped
volumes:
# Mount for influxdb data directory and configuration
- /data/influxdb2/config:/etc/influxdb2
- /data/influxdb2/data:/var/lib/influxdb2
ports:
- "8086:8086"
network_mode: "bridge" # "host"
块存储: minio 也是数据库,虽然比较少见,但是 minio 是一个不错的块存储后端
yaml
version: "3"
services:
minio:
image: minio/minio
container_name: minio
restart: unless-stopped
ports:
- "9002:9002"
- "9003:9003"
volumes:
- /data/minio/config.env:/etc/config.env
- /data/minio/data:/data
environment:
MINIO_CONFIG_ENV_FILE: /etc/config.env
command: server --address ":9002" --console-address ":9003"
network_mode: "bridge" # "host
内网版本管理软件
很多时候我们经常使用 github 的一些代码仓库,或者是自己写一些代码之类的。而 github 就存在访问不上或者是免费版配额限制导致无法操作等问题。这时候为什么不选择自己搭建一个内网的版本控制软件呢?
比起庞大臃肿的 GitLab,我更推荐精简小巧的 Gitea,该有的都有,平时的启动和运行速度飞快
更加让人喜出望外的是,gitea 还内置了一个基于 act_runner 的 ci/cd 软件。它能大幅降低很多运维操作的成本,比如我现在的推文发布就改成了提交代码后,自动发布到服务器的方式
Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来,几乎所有代码都已更改
yaml
version: "3"
networks:
gitea:
name: gitea
ipam:
config:
- subnet: 172.24.0.0/24
services:
gitea:
image: gitea/gitea
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: unless-stopped
networks:
gitea:
ipv4_address: 172.24.0.8
volumes:
- /data/gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "2222:2222"
runner:
image: gitea/act_runner
container_name: act-runner-host
environment:
CONFIG_FILE: /data/config.yaml
GITEA_INSTANCE_URL: "http://172.24.0.8:3000"
GITEA_RUNNER_REGISTRATION_TOKEN: "TOEKN IS HERE"
GITEA_RUNNER_NAME: "rpi4"
GITEA_RUNNER_LABELS: "ubuntu-latest:docker://node:16-bullseye,debian-latest:docker://debian:latest,rpi4:host"
restart: unless-stopped
networks:
gitea:
ipv4_address: 172.24.0.9
volumes:
# - /data/act-runner/config.yaml:/data/config.yaml
- /data/act-runner:/data
- /var/run/docker.sock:/var/run/docker.sock
内网监控组合拳
与只能简单监控节点是否存活的 uptime-kuma 不同,Prometheus(普罗米修斯)是正经的服务器监控程序,可以监控服务器、网站、应用程序的性能和状态。正巧,这就用上了之前的数据库来存储监控数据
Prometheus 已成为监控应用的行业标准和服务 —— 也是 Grafana 社区的必备品
而只有监控也不行,还需要强大的前端展示界面。而 Grafana(格拉法纳)就是 Prometheus 的最佳搭档。它能做出非常实用又很酷炫的展示
查询、可视化和理解数据,并获取数据警报,无论数据存储在何处。在 Grafana,您可以通过美观、灵活的数据面板创建、探索和共享所有数据
Prometheus 的这个比较特别,需要映射具体的使用用户。然后这个是附带了本机的指标采集程序,因为如果开了 selinux 的话,直接装 node_exporter 会报错。
yaml
version: "3.8"
services:
prometheus:
image: prom/prometheus
container_name: prometheus
user: "root:root"
restart: unless-stopped
volumes:
- /data/prometheus/config:/etc/prometheus
- /data/prometheus/data:/prometheus
ports:
- 9091:9090
network_mode: "bridge" # "host"
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- "--path.rootfs=/host"
network_mode: host
pid: host
restart: unless-stopped
volumes:
- "/:/host:ro,rslave"
Grafana 相对来说就简单很多了,就是也需要指定用户
yaml
version: "3"
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
user: "root:root"
restart: unless-stopped
ports:
- "3003:3000"
volumes:
- /data/grafana:/var/lib/grafana
network_mode: "bridge" # "host"