Apache Guacamole 是一个无客户端远程桌面网关。它支持 VNC、RDP 和 SSH 等标准协议。不需要插件或客户端软件。借助 HTML5,一旦在服务器上安装了 Guacamole,只需使用 Web 浏览器即可访问桌面。
1.Guacamole的架构介绍
Guacamole不是一个独立的网络应用程序,而是由多个部分组成的。该网络应用程序实际上旨在保持简单和最小化,而大部分繁重的工作则由底层组件来完成。
1)Guacamole协议
该网络应用程序完全不理解任何远程桌面协议。它不包含对VNC、RDP或Guacamole堆栈支持的其他任何协议的支持。它实际上只理解Guacamole协议,这是一种用于远程显示渲染和事件传输的协议。虽然具有这些特性的协议自然会具备与远程桌面协议相同的能力,但远程桌面协议和Guacamole协议背后的设计原则是不同的:Guacamole协议的目的不是实现特定桌面环境的功能。
作为远程显示和交互协议,Guacamole实现了现有远程桌面协议的超集。因此,向Guacamole添加对特定远程桌面协议(如RDP)的支持,需要编写一个中间层,该中间层在远程桌面协议和Guacamole协议之间进行“翻译”。实现这种翻译与实现任何本地客户端没有不同,只是这个特定的实现是向远程显示而不是本地显示进行渲染。
处理这种翻译的中间层是guacd。
2)guacd
guacd是Guacamole的核心,它动态加载对远程桌面协议(称为“客户端插件”)的支持,并根据来自网络应用程序的指令将它们连接到远程桌面。
guacd是一个守护进程,与Guacamole一起安装并在后台运行,监听来自网络应用程序的TCP连接。guacd本身也不理解任何特定的远程桌面协议,而是仅实现了足够多的Guacamole协议功能,以确定需要加载哪个协议支持以及需要向其传递哪些参数。一旦客户端插件加载完毕,它就会独立于guacd运行,并完全控制其与网络应用程序之间的通信,直到客户端插件终止。
guacd和所有客户端插件都依赖于一个通用库libguac,该库使通过Guacamole协议的通信变得更加容易和抽象一些。
2.安装docker
1)安装yum工具
[root@Guacamole /]# yum install -y yum-utils \
> device-mapper-persistent-data \
> lvm2 --skip-broken
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: repo.jing.rocks
* extras: mirrors.aliyun.com
* nux-dextop: mirror.li.nux.ro
* updates: mirrors.aliyun.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 device-mapper-persistent-data.x86_64.0.0.8.5-2.el7 将被 升级
---> 软件包 device-mapper-persistent-data.x86_64.0.0.8.5-3.el7_9.2 将被 更新
……
2)更新本地镜像源
[root@Guacamole /]# yum-config-manager \
> --add-repo \
> https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
已加载插件:fastestmirror, langpacks
adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
grabbing file https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
[root@Guacamole /]# sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
[root@Guacamole /]# yum makecache fast
3)安装docker-ce
[root@Guacamole /]# yum install -y docker-ce
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* epel: repo.jing.rocks
* extras: mirrors.aliyun.com
* nux-dextop: mirror.li.nux.ro
* updates: mirrors.aliyun.com
正在解决依赖关系
……
已安装:
docker-ce.x86_64 3:26.1.4-1.el7
作为依赖被安装:
container-selinux.noarch 2:2.119.2-1.911c772.el7_8 containerd.io.x86_64 0:1.6.33-3.1.el7
docker-buildx-plugin.x86_64 0:0.14.1-1.el7 docker-ce-cli.x86_64 1:26.1.4-1.el7
docker-ce-rootless-extras.x86_64 0:26.1.4-1.el7 docker-compose-plugin.x86_64 0:2.27.1-1.el7
fuse-overlayfs.x86_64 0:0.7.2-6.el7_8 fuse3-libs.x86_64 0:3.6.1-4.el7
slirp4netns.x86_64 0:0.4.3-4.el7_8
完毕!
[root@Guacamole /]#
安装完成后,启动docker并查看版本:
[root@Guacamole /]# systemctl start docker
[root@Guacamole /]#
[root@Guacamole /]# docker -v
Docker version 26.1.4, build 5650f9b
[root@Guacamole /]#
4)配置镜像加速
[root@Guacamole ~]# mkdir -p /etc/docker
[root@Guacamole ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.registry.cyou",
"https://docker-cf.registry.cyou",
"https://dockercf.jsdelivr.fyi",
"https://docker.jsdelivr.fyi",
"https://dockertest.jsdelivr.fyi",
"https://mirror.aliyuncs.com",
"https://dockerproxy.com",
"https://mirror.baidubce.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn",
"https://docker.mirrors.sjtug.sjtu.edu.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://mirror.iscas.ac.cn",
"https://docker.rainbond.cc"]
}
最后,重启docker:
[root@Guacamole ~]# systemctl daemon-reload
[root@Guacamole ~]# systemctl restart docker
[root@Guacamole ~]#
3.安装docker-compose
通过curl命令下载,并指定保存到/usr/local/bin/docker-compose目录下:
[root@Guacamole /]# curl -L https://github.com/docker/compose/releases/download/v2.32.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:06 --:--:-- 0
100 61.6M 100 61.6M 0 0 4042k 0 0:00:15 0:00:15 --:--:-- 8789k
[root@Guacamole /]#
然后修改执行权限,并查看docker-compose版本:
[root@Guacamole bin]# chmod +x /usr/local/bin/docker-compose
[root@Guacamole bin]#
[root@Guacamole bin]# docker-compose -v
Docker Compose version v2.32.1
[root@Guacamole bin]#
4.创建guacamole工作目录
为 Guacamole 创建一个工作目录,如下:
[root@Guacamole opt]# mkdir guacamole-docker
[root@Guacamole opt]# cd guacamole-docker/
[root@Guacamole guacamole-docker]#
5.创建docker-compose.yml文件
创建 docker-compose.yml 文件,用于定义 Guacamole 服务及其依赖项:
[root@Guacamole guacamole-docker]# vim docker-compose.yml
[root@Guacamole guacamole-docker]# cat docker-compose.yml
version: '3'
services:
db:
image: mariadb:10.6.18
container_name: guac-db
environment:
- MYSQL_ROOT_PASSWORD=111111
- MYSQL_DATABASE=guacamole_db
- MYSQL_USER=guacamole
- MYSQL_PASSWORD=guacamole
volumes:
- guac-db-data:/var/lib/mysql
ports:
- "3306:3306"
restart: always
guacd:
image: guacamole/guacd:latest
container_name: guacd
ports:
- "4822:4822"
restart: always
guacamole:
image: guacamole/guacamole:latest
container_name: guacamole
depends_on:
- db
- guacd
environment:
- GUACD_HOSTNAME=192.168.250.21 # 宿主机IP
- GUACD_PORT=4822
- MYSQL_HOSTNAME=192.168.250.21 # 宿主机IP
- MYSQL_PORT=3306
- MYSQL_DATABASE=guacamole_db
- MYSQL_USER=guacamole
- MYSQL_PASSWORD=guacamole
ports:
- "8080:8080"
volumes:
- /opt/guacamole/guacamole.properties:/etc/guacamole/guacamole.properties
restart: always
volumes:
guac-db-data:
[root@Guacamole guacamole-docker]#
上面的配置文件定义了三个服务:
guacd :Guacamole 的代理服务 guacdb:用于存储 Guacamole 数据的 mariadb数据库 guacserver :Guacamole 服务器
保存后,启动docker-compose:
[root@Guacamole guacamole-docker]# docker-compose up -d
WARN[0000] /opt/guacamole-docker/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 9/9
✔ db Pulled 456.1s
✔ 9ea8908f4765 Pull complete 58.8s
✔ 7cb3a4df67e2 Pull complete 59.0s
✔ 4d2d4c02d11f Pull complete 61.0s
✔ 3e1f3619136a Pull complete 61.3s
✔ 7761768b6965 Pull complete 61.5s
✔ 56a0f21847dd Pull complete 182.3s
✔ 0d82f4c8dbd8 Pull complete 182.5s
✔ a362108bc1af Pull complete 182.6s
[+] Running 5/5
✔ Network guacamole-docker_default Created 0.2s
✔ Volume "guacamole-docker_guac-db-data" Created 0.0s
✔ Container guacd Started 2.3s
✔ Container guac-db Started 2.3s
✔ Container guacamole Started 2.0s
[root@Guacamole guacamole-docker]#
6.初始化数据库
在启动 Guacamole 之前,需要初始化数据库,主要包括创建数据库表结构,如下:
[root@Guacamole guacamole-docker]# docker run --rm guacamole/guacamole /opt/guacamole/bin/initdb.sh --mysql > initdb.sql
Unable to find image 'guacamole/guacamole:latest' locally
latest: Pulling from guacamole/guacamole
23828d760c7b: Pull complete
cfcf356fa6e6: Pull complete
cf62b0dd6e4e: Pull complete
fdbcbf92947e: Pull complete
401c25db2eba: Pull complete
d9c41f3bdd88: Pull complete
c86641ed1db0: Pull complete
a929ebdce6c6: Pull complete
87f46d9f86e4: Pull complete
03df01d81784: Pull complete
5cb364e4e431: Pull complete
8f2c49bb8fa3: Pull complete
9ae3a77ff06a: Pull complete
Digest: sha256:a5024fd0d594a336e74d71fdc79220856cd3263eb1baedba7040d473b46e00fd
Status: Downloaded newer image for guacamole/guacamole:latest
[root@Guacamole guacamole-docker]#
上面这条命令会从 Guacamole 镜像中提取 SQL 脚本,并通过 Docker 执行这些脚本来初始化 guac-db 数据库。
[root@Guacamole guacamole-docker]# pwd
/opt/guacamole-docker
[root@Guacamole guacamole-docker]# ls
docker-compose.yml initdb.sql
然后,使用 docker exec 命令将初始化脚本导入到 MySQL 数据库中:
[root@Guacamole guacamole-docker]# docker exec -i guac-db mysql -uguacamole -pguacamole guacamole_db < initdb.sql
[root@Guacamole guacamole-docker]#
7.启动服务
[root@Guacamole guacamole-docker]# docker-compose down
WARN[0000] /opt/guacamole-docker/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 4/4
✔ Container guacamole Removed 1.0s
✔ Container guacd Removed 0.5s
✔ Container guac-db Removed 1.0s
✔ Network guacamole-docker_default Removed 0.2s
[root@Guacamole guacamole-docker]#
[root@Guacamole guacamole-docker]# docker-compose up -d
WARN[0000] /opt/guacamole-docker/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 4/4
✔ Network guacamole-docker_default Created 0.2s
✔ Container guac-db Started 1.4s
✔ Container guacd Started 1.4s
✔ Container guacamole Started 1.9s
[root@Guacamole guacamole-docker]#
8.访问 Guacamole
输入下面地址:
http://192.168.250.21:8080/guacamole/#/
然后输入默认的用户名:guacadmin/guacadmin登录。