CentOS7下Docker环境搭建开源堡垒机Apache Guacamole

科技   2024-12-18 15:20   河北  

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登录。


Python运维实践
Python运维实践,专注于互联网技术的总结与交流,内容涉及Python自动化运维、Django框架、园区网络技术、linux云计算、系统架构及网络空间安全等知识的实践与分享。
 最新文章