Docker Compose编排RustDesk服务器:一键部署与高可用配置
1. 为什么选择Docker Compose来部署RustDesk服务器?
如果你用过RustDesk,肯定知道它是个好东西——开源、免费、流畅,自己搭服务器就能完全掌控远程桌面连接,数据安全自己说了算。但说到自建服务器,很多朋友第一步就被劝退了:又是拉镜像,又是写一长串docker run命令,还要配置网络、挂载目录、设置重启策略,步骤繁琐不说,命令敲错一个字母就得重来,管理起来更是头疼。
我自己刚开始也是用docker run一条条命令去部署hbbs和hbbr这两个核心服务。部署一次还行,但后来服务器迁移,或者想调整配置参数,就得翻历史记录,把那些长得要命的命令再找出来,一不小心就配错了。更麻烦的是,这两个服务是相互依赖的,启动顺序、网络配置都得手动保证一致,维护成本其实不低。
直到我开始用Docker Compose,整个部署体验完全变了。你可以把它理解为一个“服务编排器”或者“一键部署脚本”。以前你需要手动执行的两个docker run命令,现在只需要写在一个叫docker-compose.yml的配置文件里。部署时,一条命令docker-compose up -d,两个服务就按你定义好的方式,乖乖地一起跑起来了。这不仅仅是省了几行命令,更重要的是带来了几个实实在在的好处:
第一,配置即文档。 你的所有部署设置——用什么镜像、容器叫什么名字、映射哪些端口、挂载什么目录、使用什么网络模式——都白纸黑字地写在了YAML文件里。半年后你再看,或者换一个运维同事来接手,他看一眼这个文件就知道整个服务是怎么跑的,完全不用去猜历史命令。
第二,管理极度简化。 想同时启动、停止、重启或查看hbbs和hbbr的状态?不用再分别操作两个容器了。一句docker-compose start/stop/restart/ps就能搞定所有服务。想清理环境?docker-compose down一键就能移除所有相关的容器、网络,干净利落。
第三,环境一致性得到保证。 Compose文件确保了每次部署,两个服务的配置(尤其是网络模式host、重启策略always)都是完全一致的,彻底避免了因为手动输入错误导致一个服务用host网络、另一个用bridge网络这种尴尬的、难以排查的问题。
第四,为未来扩展铺平道路。 今天你只部署RustDesk,明天可能想加上一个Nginx做反代,或者配一个Prometheus来监控。你只需要在同一个docker-compose.yml文件里继续添加服务定义就行,所有服务都能被统一管理。这种可维护性和可扩展性,是单打独斗的docker run命令很难比拟的。
所以,如果你打算认真搭建一个用于个人或小团队生产环境的RustDesk服务器,我强烈建议直接从Docker Compose开始。它把部署从一项“一次性手工活”,变成了一个可重复、可版本控制、易于管理的“基础设施代码”过程。接下来,我就带你从零开始,一步步搭建一个高可用、易维护的RustDesk服务器。
2. 部署前的准备工作:环境与规划
在动手敲命令之前,花几分钟做好准备工作,能让你后面的部署过程顺畅无比,少踩很多坑。这部分咱们主要搞定三件事:服务器环境、网络规划,还有关键信息的确认。
2.1 服务器环境检查
首先,你需要一台服务器。云服务商的VPS或者你自己家里的有公网IP的机器都行。操作系统推荐用主流的Linux发行版,比如Ubuntu 22.04 LTS或者CentOS Stream 8/9。我这里以Ubuntu为例,但原理是相通的。
登录服务器后,第一件事是检查并安装必要的软件:
-
Docker Engine:这是基石。确保你的系统已经安装了Docker。如果没有,可以用官方脚本快速安装。打开终端,执行:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh安装完成后,运行
sudo docker --version确认安装成功。为了避免每次都要sudo,可以把当前用户加入docker组:sudo usermod -aG docker $USER,然后退出终端重新登录生效。 -
Docker Compose:这是我们今天的主角。虽然现在Docker Desktop通常自带,但在Linux服务器上我们需要单独安装。推荐安装独立的Compose插件(v2版本),它是
docker命令的一个子命令,用起来更统一。# 下载最新的docker-compose插件二进制文件 sudo curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose # 赋予执行权限 sudo chmod +x /usr/local/bin/docker-compose # 验证安装 docker compose version看到版本号输出,就说明安装成功了。注意,我们用的是
docker compose(两个词中间有空格),这是新版的命令格式。
2.2 关键信息确认与规划
这一步至关重要,直接决定了你的RustDesk服务能否被外界访问。
-
服务器的公网IP或域名:这是客户端连接时必须填写的地址。
- 公网IP:最简单直接。你可以在服务器上运行
curl -4 ifconfig.me或curl ip.sb来获取。记下这个IP。 - 域名:更推荐的方式。去域名服务商那里买一个域名(比如
your-company.com),然后添加一条A记录,将子域名(例如rustdesk.your-company.com)解析到你服务器的公网IP。用域名的好处是,即使服务器IP变了,你只需要更新DNS解析,所有客户端配置无需修改。
- 公网IP:最简单直接。你可以在服务器上运行
-
数据存储目录规划:RustDesk服务器运行时会生成一些关键数据,比如自动生成的密钥对、运行日志等。我们需要在宿主机上创建目录,并挂载到容器内,这样即使容器销毁,数据也不会丢失。 我习惯在
/opt目录下创建:sudo mkdir -p /opt/rustdesk/{hbbs,hbbr}这样,
/opt/rustdesk/hbbs目录就给hbbs服务用,/opt/rustdesk/hbbr给hbbr服务用。目录权限也要设置好,让Docker能写入:sudo chown -R $USER:$USER /opt/rustdesk sudo chmod -R 755 /opt/rustdesk -
防火墙端口确认:RustDesk服务需要开放一系列端口。请确保你的服务器安全组(云服务商控制台)和系统防火墙(如
ufw或firewalld)放行了以下端口:- TCP: 21115-21119:这是核心端口范围。
hbbs和hbbr的通信主要依赖这些端口。 - UDP: 21116:这个端口必须同时开放TCP和UDP协议,用于ID注册和心跳检测,对UDP打洞成功至关重要。
以Ubuntu的
ufw为例,开放命令如下:sudo ufw allow 21115:21119/tcp sudo ufw allow 21116/udp sudo ufw reload - TCP: 21115-21119:这是核心端口范围。
准备工作做完,心里就有底了。服务器环境就绪,IP/域名在手,数据目录规划好,端口大门敞开,接下来我们就可以开始编写那个“一劳永逸”的编排文件了。
3. 编写Docker Compose文件:从入门到精通
现在进入核心环节——创建docker-compose.yml文件。这个文件就是我们整个部署方案的“蓝图”。我会逐行解释,并给你一个生产环境可用的完整模板,同时对比之前docker run命令的写法,让你看清Compose带来的清晰与优雅。
3.1 基础服务定义:让hbbs和hbbr跑起来
首先,在你规划好的目录,比如/opt/rustdesk下,创建这个文件:
cd /opt/rustdesk
nano docker-compose.yml
然后,我们把最基本的服务结构写进去。先看一个最简版本,它实现了和之前两条docker run命令完全一样的功能:
version: '3.8'
services:
hbbs:
image: rustdesk/rustdesk-server:latest
container_name: rustdesk-hbbs
command: hbbs -r your-server-address.com -k your_custom_key_here
network_mode: "host"
volumes:
- ./hbbs:/root
restart: always
hbbr:
image: rustdesk/rustdesk-server:latest
container_name: rustdesk-hbbr
command: hbbr
network_mode: "host"
volumes:
- ./hbbr:/root
restart: always
我们来拆解一下每一部分的含义:
version: '3.8':指定Compose文件的格式版本。用3.x版本兼容性比较好。services::下面定义的就是我们要运行的所有容器服务。hbbs:和hbbr::这是我们给服务起的名字,你可以按喜好修改,但后面命令里要用到。image::指定使用的Docker镜像,这里就是官方的rustdesk/rustdesk-server。container_name::指定运行起来的容器叫什么名字,方便我们管理时识别。如果不指定,Docker会生成一个随机名字。command::覆盖容器启动时默认执行的命令。这是核心配置!- 对于
hbbs,我们必须通过-r参数指定服务器地址(替换your-server-address.com为你的IP或域名)。-k参数用于设置一个自定义的密钥,增强安全性(可选,但强烈建议设置)。 - 对于
hbbr,通常只需要hbbr这个命令本身。
- 对于
network_mode: "host":这是关键配置!它让容器直接使用宿主机的网络栈。这意味着容器内开放的端口(21115-21119)就是直接在宿主机上开放的,省去了复杂的端口映射配置,性能也最好。RustDesk官方推荐这种模式。volumes::数据卷挂载。格式是宿主机目录:容器内目录。这里我们把当前目录下的hbbs和hbbr文件夹(就是之前创建的那两个),分别挂载到两个容器的/root目录。这样容器内生成的所有文件(包括密钥、日志)都会持久化保存在宿主机上。restart: always:重启策略。设置为always后,只要容器异常退出,或者宿主机重启,Docker都会自动重新启动这个容器,极大地提高了服务的可用性。
对比一下传统的docker run命令:
以前部署hbbs,你需要敲这么一长串:
docker run --restart=always --name hbbs -v /opt/rustdesk/hbbs:/root -td --net=host rustdesk/rustdesk-server hbbs -r your-server-address.com -k your_custom_key_here
现在,所有参数都清晰地组织在了YAML文件里。哪个更易读、更易维护,一目了然。
3.2 进阶配置:让服务更健壮、更易管理
基础版本能跑,但我们可以做得更好。下面我分享几个在实际生产环境中非常实用的进阶配置。
1. 资源限制与日志管理: 防止某个服务异常占用过多资源,影响宿主机的稳定,同时控制日志文件大小,避免磁盘被撑爆。
services:
hbbs:
# ... 其他配置同上 ...
deploy:
resources:
limits:
cpus: '1.0' # 限制最多使用1个CPU核心
memory: 512M # 限制最多使用512MB内存
logging:
driver: "json-file"
options:
max-size: "10m" # 单个日志文件最大10MB
max-file: "3" # 最多保留3个日志文件(滚动覆盖)
deploy部分通常在Swarm集群中使用,但在单机Compose下,resources限制依然有效。logging配置确保了容器日志不会无限增长。
2. 健康检查与依赖关系:
虽然hbbr对hbbs没有严格的启动顺序依赖,但我们可以通过健康检查来监控服务状态,并在管理上建立逻辑依赖。
services:
hbbs:
# ... 其他配置 ...
healthcheck:
test: ["CMD", "timeout", "5", "bash", "-c", "echo > /dev/tcp/127.0.0.1/21116"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
hbbr:
# ... 其他配置 ...
depends_on:
hbbs:
condition: service_started
这里给hbbs定义了一个健康检查:每30秒尝试连接本地的21116端口(hbbs的核心端口),超时5秒,重试3次。hbbr服务通过depends_on指定,在hbbs启动之后才开始启动。这更多是一种最佳实践,让服务启动更有秩序。
3. 环境变量与配置文件分离:
把服务器地址、密钥等敏感或易变的信息从Compose文件里抽出来,用环境变量管理,更安全、更灵活。
首先,创建一个.env文件在docker-compose.yml同级目录:
RUSTDESK_SERVER_ADDR=rustdesk.your-company.com
RUSTDESK_KEY=your_very_strong_secret_key_123!
然后,修改docker-compose.yml中的command部分:
command: hbbs -r $${RUSTDESK_SERVER_ADDR} -k $${RUSTDESK_KEY}
注意,在Compose文件里引用环境变量需要双美元符号$$进行转义。这样,当你需要修改地址或密钥时,只需改.env文件,无需动核心的YAML配置。记得把.env文件加入.gitignore,不要提交到代码仓库。
把这些进阶配置组合起来,你就得到了一个非常健壮、接近生产级别的部署模板。它不仅能让服务跑起来,还能跑得稳、管得好。
4. 一键部署与日常运维全指南
配置文件写好之后,部署就变成了最简单的环节。我们来看看如何用几条命令搞定一切,以及日后如何轻松地进行管理。
4.1 启动服务与验证
在docker-compose.yml文件所在的目录(/opt/rustdesk),执行一条命令:
docker compose up -d
这个-d参数代表“后台运行”。执行后,Docker Compose会做以下几件事:
- 检查镜像本地是否存在,不存在则自动从Docker Hub拉取。
- 按照文件定义,依次创建并启动
hbbs和hbbr两个服务(容器)。 - 将服务放入后台运行。
启动完成后,立刻用以下命令检查状态:
docker compose ps
你应该能看到两个服务的状态都是Up。这比分别运行docker ps | grep hbbs和docker ps | grep hbbr要方便得多。
验证服务是否真正工作:
-
查看日志:启动初期,查看日志能帮你快速定位问题。
# 查看所有服务的日志 docker compose logs # 实时跟踪hbbs的日志 docker compose logs -f hbbs在
hbbs的启动日志中,你应该能看到类似[INFO] Public key: xxxxxxxxxxxxxx的信息。这个公钥(或者你自定义的Key)就是待会客户端要填的。 -
检查端口监听:在宿主机上运行
ss -tulnp | grep 2111,应该能看到21115-21119端口的TCP监听,以及21116端口的UDP监听。 -
验证密钥文件:由于我们挂载了数据卷,密钥文件应该已经生成在宿主机上。
cat /opt/rustdesk/hbbs/id_ed25519.pub这个文件里的字符串就是你的公钥。如果启动时指定了
-k参数,这里就是你自定义的密钥。
4.2 日常运维命令大全
有了Compose,日常管理变得异常统一和简单。下面这些命令请收好:
- 停止服务:
docker compose stop。这会让容器停止,但不会删除它们。 - 启动服务:
docker compose start。启动已停止的服务。 - 重启服务:
docker compose restart。常用于应用配置更新后。 - 停止并移除容器、网络:
docker compose down。注意:这会把容器删掉,但不会删除我们挂载的数据卷(/opt/rustdesk/hbbs和hbbr目录里的数据是安全的)。如果想连数据卷一起清理,用docker compose down -v(慎用!)。 - 查看实时日志:
docker compose logs -f。 - 进入容器内部:
docker compose exec hbbs bash。如果你想检查容器内的文件或执行一些调试命令,这个很有用。 - 更新服务(例如镜像更新后):
# 拉取最新镜像 docker compose pull # 重新创建并启动容器(使用新镜像) docker compose up -d # 清理旧的、已停止的容器和未使用的镜像 docker system prune -f
4.3 客户端配置与连接测试
服务端搭好了,最后一步就是在你的电脑或手机上配置RustDesk客户端。
-
获取配置信息:
- ID服务器:填写你的服务器公网IP或域名(即
-r参数设置的值)。 - 中继服务器:和ID服务器填一样的地址。
- API服务器:留空即可。
- Key:填写你在
docker-compose.yml中通过-k参数设置的自定义密钥,或者查看/opt/rustdesk/hbbs/id_ed25519.pub文件得到的公钥。
- ID服务器:填写你的服务器公网IP或域名(即
-
在客户端设置:打开RustDesk客户端,进入“设置” -> “网络”。在“ID服务器”和“中继服务器”栏填入你的服务器地址,在“Key”栏填入密钥。点击“确定”或“应用”。
-
测试连接:
- 在客户端主界面,你应该能看到本机的ID。
- 尝试用另一台也配置了相同服务器的设备,输入这个ID进行连接。
- 如果一切正常,你会看到连接请求,接受后即可开始远程控制。
常见问题排查:
- 连接不上:首先检查服务器防火墙和安全组是否已正确开放所有必需的端口(TCP:21115-21119, UDP:21116)。在服务器上用
telnet 你的服务器IP 21116命令从外部网络测试端口连通性。 - Key不匹配:确保客户端填写的Key与服务器端
hbbs容器生成的或你自定义的完全一致,注意不要有多余的空格。 - 查看服务端日志:使用
docker compose logs hbbs和docker compose logs hbbr,看是否有明显的错误信息。
走到这一步,恭喜你,一个由Docker Compose编排的、高可用的RustDesk服务器就已经稳稳地运行在你的掌控之下了。整个部署过程从一堆零散的命令,变成了一个可版本化、可重复执行的清晰定义文件。以后无论是迁移服务器,还是增加新的辅助服务,你都会感谢今天选择了Compose这个方式。
更多推荐
所有评论(0)