使用 Docker 部署 Apache Ranger,用来为开发 Ranger 策略批量操作工具提供一个开发环境。由于官方为旧版本的 Ranger 只提供了 arm64 架构的镜像,也尝试了自行构建出旧版的 amd64 镜像。
概述 Apache Ranger 是 Hadoop 生态中的安全与权限管理框架,它为 HDFS、Hive、HBase、Kafka、YARN 等多种组件提供集中化、可审计、可扩展的访问控制。
Ranger 的权限机制由管理端 和组件端插件 两个核心部分构成:
权限校验流程:
用户向 Hadoop/Hive/HBase 等发起访问;
该组件的 Ranger 插件强制拦截请求;
插件从本地缓存中查找是否有允许或拒绝的策略,根据策略决定是否允许访问;
将操作记录写入审计。
总的来说,Apache Ranger 通过集中管理 + 本地拦截插件 实现大数据组件的统一权限控制——管理端 负责配置策略,组件端插件 在实际读写时执行策略,从而实现安全、可审计、可扩展的权限体系。
Docker部署Ranger 根据想要部署的 Apache Ranger 版本不同,有以下几种方案:
2.7.0:使用官方镜像。官方在 Docker Hub 为该最新版本提供了 amd64 和 arm64 双架构的镜像,直接使用即可。
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 $ 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. $ mkdir -p ~/.m2/repository $ JB_REPO="https://packages.jetbrains.team/maven/p/ij/intellij-dependencies" $ 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" $ 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" $ 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 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!) $ du -hd 0 ~/.m2/repository 1.8G /home/thinklong/.m2/repository
访问 http://localhost:6080 即可进入 WEBUI,账号为 admin,密码为 rangerR0cks!。
构建失败信息如下:
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 | [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(官方镜像) 官方镜像的使用方式如下:
$ export RANGER_VERSION=2.7.0 $ 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} $ docker network create rangernw $ 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