Docker部署Apache Ranger

使用 Docker 部署 Apache Ranger,用来为开发 Ranger 策略批量操作工具提供一个开发环境。由于官方为旧版本的 Ranger 只提供了 arm64 架构的镜像,也尝试了自行构建出旧版的 amd64 镜像。


概述

Apache Ranger 是 Hadoop 生态中的安全与权限管理框架,它为 HDFS、Hive、HBase、Kafka、YARN 等多种组件提供集中化、可审计、可扩展的访问控制。

Ranger 的权限机制由管理端组件端插件两个核心部分构成:

  • Ranger Admin:管理员在 WebUI 上创建管理策略,配置的策略会被保存到数据库,并通过 REST API 推送给各个组件端插件。

  • Ranger Plugin:不同 Hadoop 服务有对应的 Ranger 插件,这些插件部署在 Hadoop 组件运行的每个服务器上,并在组件内部拦截访问请求。权限的判断发生在组件内部,无需再经过 Admin。

权限校验流程:

  1. 用户向 Hadoop/Hive/HBase 等发起访问;
  2. 该组件的 Ranger 插件强制拦截请求;
  3. 插件从本地缓存中查找是否有允许或拒绝的策略,根据策略决定是否允许访问;
  4. 将操作记录写入审计。

总的来说,Apache Ranger 通过集中管理 + 本地拦截插件实现大数据组件的统一权限控制——管理端负责配置策略,组件端插件在实际读写时执行策略,从而实现安全、可审计、可扩展的权限体系。

Docker部署Ranger

根据想要部署的 Apache Ranger 版本不同,有以下几种方案:

  • 2.7.0:使用官方镜像。官方在 Docker Hub 为该最新版本提供了 amd64arm64 双架构的镜像,直接使用即可。
  • 2.5.0-2.6.0:使用官方的 ranger_in_docker 脚本。官方只提供了 arm64 架构的镜像,但提供了脚本可以自动构建和启动容器。
  • 2.4.0:使用非官方镜像。官方只提供了 arm64 架构的镜像且未提供 ranger_in_docker 脚本。

Ranger 2.4.0(非官方镜像)

/app/
$ git clone https://github.com/takezoe/ranger-docker.git
$ cd ranger-docker/
$ docker-compose up -d
[+] Running 4/4
✔ Network ranger-docker_default Created 0.0s
✔ Container ranger-solr Started 0.5s
✔ Container ranger-mysql Started 0.5s
✔ Container ranger-admin Started 0.6s

访问 http://localhost:6080 即可进入 WEBUI,账号为 admin,密码为 Ranger1234

Ranger 2.5.0-2.6.0(自己构建镜像)

从零构建需要下载约 1.8 G 的依赖,且部分依赖文件需要提前从其他仓库下载好,否则会构建失败。

以 2.5.0 版本为例,在 WSL 2 环境中构建镜像并启动容器:

/app
# 1.拉取项目并切换到需要的版本
$ git clone https://github.com/apache/ranger.git
$ cd ranger
$ git checkout release-ranger-2.5.0
Note: switching to 'release-ranger-2.5.0'.
...
HEAD is now at f3e2a44f0 RANGER-4877 : Upgrade requireJS to 2.3.6 to 2.3.7.

# 2.创建maven仓库目录,该目录会挂载到ranger-build容器内
# 如果该目录不存在,docker在构建过程中会自动创建,但可能会出现权限问题
$ mkdir -p ~/.m2/repository

# 3.手动下载pty4j和purejavacomm依赖
# 这些依赖需要从指定仓库下载,无法从默认仓库获取到
$ JB_REPO="https://packages.jetbrains.team/maven/p/ij/intellij-dependencies"
# 下载pty4j依赖
$ mkdir -p ~/.m2/repository/org/jetbrains/pty4j/pty4j/0.11.4
$ cd ~/.m2/repository/org/jetbrains/pty4j/pty4j/0.11.4
$ wget "$JB_REPO/org/jetbrains/pty4j/pty4j/0.11.4/pty4j-0.11.4.jar"
$ wget "$JB_REPO/org/jetbrains/pty4j/pty4j/0.11.4/pty4j-0.11.4.pom"
# 下载purejavacomm依赖
$ mkdir -p ~/.m2/repository/org/jetbrains/pty4j/purejavacomm/0.0.11.1
$ cd ~/.m2/repository/org/jetbrains/pty4j/purejavacomm/0.0.11.1
$ wget "$JB_REPO/org/jetbrains/pty4j/purejavacomm/0.0.11.1/purejavacomm-0.0.11.1.jar"
$ wget "$JB_REPO/org/jetbrains/pty4j/purejavacomm/0.0.11.1/purejavacomm-0.0.11.1.pom"

# 4.启动脚本自动构建镜像并启动容器
# 如果顺利的话,会在数个小时后看到ranger相关镜像构建成功并启动的信息
$ cd /app/ranger/
$ ./ranger_in_docker up
[+] Running 11/11
✔ ranger-solr Built 0.0s
✔ ranger-zk Built 0.0s
✔ ranger:latest Built 0.0s
✔ ranger-usersync Built 0.0s
✔ ranger-postgres Built 0.0s
✔ Container ranger-zk Started 3.8s
✔ Container ranger-solr Started 3.9s
✔ Container ranger-postgres Healthy 11.4s
✔ Container ranger Started 11.5s
✔ Container ranger-usersync Started 11.8s
✔ Container ranger-base Started 0.4s
################### LIST OF DOCKER PROCESSES EXPOSING PORTS #####################
SERVICE: ranger ExposedPort: 6080
SERVICE: ranger-solr ExposedPort: 8983
SERVICE: ranger-zk ExposedPort: 2181
###################################################################################
Now, You can run access RANGER portal via http://localhost:6080 (admin/rangerR0cks!)

# 构建过程需要下载约1.8G的依赖
$ du -hd 0 ~/.m2/repository
1.8G /home/thinklong/.m2/repository

访问 http://localhost:6080 即可进入 WEBUI,账号为 admin,密码为 rangerR0cks!

构建过程中 ranger-build 异常退出,local repository 创建失败

构建失败信息如下:

ranger-build  | [ERROR] Could not create local repository at /home/ranger/.m2/repository -> [Help 1]
...
ranger-build exited with code 1

查看 docker-compose.ranger-build.yml 文件,找到与 .m2 目录有关的部分:

ranger/dev-support/ranger-docker/docker-compose.ranger-build.yml
volumes:
- ${HOME:-~}/.m2:/home/ranger/.m2:delegated

可以看到是将用户家目录下的 .m2 目录挂载到了容器内部。

如果 .m2 目录之前不存在,挂载时会由 docker 自动创建;WSL 2 中 docker 是以 root 身份运行的,所以自动创建的 .m2 目录的拥有者为 root。来看下该目录和 docker 进程的相关信息:

$ ls -la $HOME | grep .m2
drwxr-xr-x 3 root root 4096 Dec 17 11:17 .m2

$ ps -ef | grep docker
root 2669 2668 0 01:10 pts/8 00:00:17 /mnt/wsl/docker-desktop/docker-desktop-user-distro proxy --distro-name Ubuntu-24.04 -docker-desktop-root /mnt/wsl/docker-desktop C:\Program Files\Docker\Docker\resources

修改 .m2 目录的权限为当前用户即可:

$ sudo chown -R thinklong:thinklong ~/.m2

构建过程中 ranger-build 异常退出,无法解析部分依赖

构建失败信息如下:

ranger-build  | [ERROR] Failed to execute goal on project ranger-knox-plugin: Could not resolve dependencies for project org.apache.ranger:ranger-knox-plugin:jar:2.5.0: The following artifacts could not be resolved: org.jetbrains.pty4j:pty4j:jar:0.11.4, org.jetbrains.pty4j:purejavacomm:jar:0.0.11.1: Could not find artifact org.jetbrains.pty4j:pty4j:jar:0.11.4 in apache.snapshots.https (https://repository.apache.org/content/repositories/snapshots) -> [Help 1]

当前仓库 中无法下载到 jetbrains 相关的依赖项,需要从 IntelliJ Deps Repository 仓库获取相关依赖,参考流程中的第三步。

Ranger 2.7.0(官方镜像)

官方镜像的使用方式如下:

# 1.指定Ranger版本
# 目前只为最新的2.7.0版本提供了amd64/arm64多架构镜像
# 其它版本只有arm64架构的镜像
$ export RANGER_VERSION=2.7.0

# 2.拉取Ranger运行所需的镜像,包括Solr、Zookeeper和数据库(postgres/mysql)
$ docker pull apache/ranger-zk:${RANGER_VERSION}
$ docker pull apache/ranger-solr:${RANGER_VERSION}
$ docker pull apache/ranger-db:${RANGER_VERSION}
$ docker pull apache/ranger:${RANGER_VERSION}

# 3.创建网络
$ docker network create rangernw

# 4.启动Zookeeper/Solr/数据库/Ranger
$ docker run -d --name ranger-zk --hostname ranger-zk.example.com --network rangernw -p 2181:2181 apache/ranger-zk:${RANGER_VERSION}
$ docker run -d --name ranger-solr --hostname ranger-solr.example.com --network rangernw -p 8983:8983 apache/ranger-solr:${RANGER_VERSION} solr-precreate ranger_audits /opt/solr/server/solr/configsets/ranger_audits/
$ docker run -d --name ranger-db --hostname ranger-db.example.com --network rangernw --health-cmd='su -c "pg_isready -q" postgres' --health-interval=10s --health-timeout=2s --health-retries=30 apache/ranger-db:${RANGER_VERSION}
$ docker run -d --name ranger --hostname ranger.example.com --network rangernw -e RANGER_VERSION=${RANGER_VERSION} -e RANGER_DB_TYPE=postgres -p 6080:6080 apache/ranger:${RANGER_VERSION} /home/ranger/scripts/ranger.sh

所有容器启动完成后,便可以通过 http://localhost:6080/login.jsp 访问 Apache Ranger,默认用户为 admin,密码为 rangerR0cks!

如果指定的版本为 2.4.1,则安装的其实是 ARM 版的容器:

$ docker inspect apache/ranger:2.4.1 apache/ranger-db:2.4.1 apache/ranger-solr:2.4.1 apache/ranger-zk:2.4.1 | grep Architecture
"Architecture": "arm64",
"Architecture": "arm64",
"Architecture": "arm64",
"Architecture": "arm64",

参考资料

Apache Ranger - DockerHub

Apache Ranger - GitHub

ranger-docker - GitHub

作者

ThinkLong

发布于

2025-11-25

更新于

2025-12-19

许可协议

评论

+