Apache Ambari 2.7.9 Docker Compose 部署指南
Apache Ambari 2.7.9 Docker Compose 部署指南:自建 ambari-2.7.9 镜像一键拉起全栈并映射 8080/8440/8441,覆盖构建、验证、数据卷持久化与常用运维命令,全部实测。
Apache Ambari 2.7.9 Docker Compose 部署指南
目标:用 Docker Compose 在一台宿主机上一键部署 Apache Ambari 2.7.9(Server + Agent + 内嵌 PostgreSQL),覆盖自建镜像(预装 RPM、调整 JVM 堆)、compose 编排、Web 控制台验证、数据卷持久化与常用运维命令。全部命令已在 Docker 29.8.1 + Compose v5.5.1 环境实测,启动后 Web 控制台 HTTP 200、Agent 注册成功、重启后数据不丢。
一、环境信息
- 宿主操作系统:Linux x86_64(内核 6.8)
- Docker:29.8.1,Docker Compose:v5.5.1
- 镜像:
ambari-2.7.9:centos7(本文自建,基础centos:7,构建后约 1.86GB) - Apache Ambari:2.7.9.0-0(RPM:ambari-server 约 123MB + ambari-agent 约 33MB,来源见《Apache Ambari 2.7.9 安装指南》方案 A 编译产物)
- Java:OpenJDK 1.8.0_412(镜像内
java-1.8.0-openjdk-devel) - 元数据库:内嵌 PostgreSQL 9.2.24(ambari-server RPM 依赖自动装入)
- 端口映射:
18081→8080(Web/REST API)、18442→8440(Agent 注册心跳)、18443→8441(Agent 加密通信) - 数据卷:5 个命名卷(PostgreSQL 数据、ambari-server 配置与数据、双端日志)
- 管理账号:admin(出厂密码 admin,本文改为 q1w2e3r4)
💡 技术拓展:容器编排单机部署可选 Docker Compose 与 Podman Compose,两者均兼容 compose.yaml 规范——Docker Compose 生态最成熟、文档示例最多;Podman 免守护进程、rootless 更安全,但部分依赖 systemd 的老镜像兼容性略差。Ambari 2.7.9 的 RPM 依赖 SysV/systemd 风格服务管理,本文选用兼容性最稳的 Docker Compose + 幂等启动脚本方案。
二、镜像选型说明
Ambari 没有官方镜像(Docker Hub 上的第三方 ambari 镜像版本陈旧且不可控),而 2.7.9 的 RPM 只能从官方源码自行编译获得,因此本文采用自建镜像方案:以 centos:7 为基底,把编译好的两个 RPM 与 JDK 打进镜像,启动时执行 ambari-server setup 初始化。
| 选项 | 说明 | 结论 |
|---|---|---|
| 第三方 ambari 镜像 | 版本停更、来源不明 | 不采用 |
| 官方 centos:7 + RPM 自建 | 版本精确 2.7.9.0-0、内容可控、可复现 | 本文采用 |
| 精简版(运行时挂 RPM) | 镜像小但依赖外部 RPM 分发 | 不采用 |
镜像内做的四件关键事(与 Dockerfile 一一对应):换 EOL 后的 CentOS vault 源 → 装 JDK 8 与基础工具 → 安装两个 RPM(依赖自动解析)→ 把 JVM 堆从默认 -Xms512m -Xmx2048m 限到 -Xms256m -Xmx512m 并修复源码构建产物中的 buildNumber 占位符。
⚠️ RPM 产物获取:《Apache Ambari 2.7.9 安装指南》方案 A 编译产出
ambari-server-2.7.9.0-0.x86_64.rpm与ambari-agent-2.7.9.0-0.x86_64.rpm,把两个文件放到本文构建目录后才能构建镜像。
三、前置条件
- 宿主机已安装 Docker 26+ 与 Docker Compose v2+(
docker compose version能输出版本)。 - 磁盘余量 8GB 以上(镜像 1.86GB + PostgreSQL 元数据与日志)。
- 宿主端口 18081、18442、18443 未被占用(被占用时改 compose 文件中映射的宿主端口即可,容器端口固定)。
- 构建目录就绪:
ambari-server/ambari-agent两个 RPM 已按《Apache Ambari 2.7.9 安装指南》编译取得。
docker --version && docker compose version
Docker version 29.8.1, build 4a63305
Docker Compose version v5.5.1
四、部署步骤
4.1 创建目录并放入 RPM
mkdir -p ambari-compose && cd ambari-compose
cp /root/apache-ambari-2.7.9-src/ambari-server/target/rpm/ambari-server/RPMS/x86_64/ambari-server-2.7.9.0-0.x86_64.rpm .
cp /root/apache-ambari-2.7.9-src/ambari-agent/target/rpm/ambari-agent/RPMS/x86_64/ambari-agent-2.7.9.0-0.x86_64.rpm .
ls -l
-rw-r--r-- 1 root root 34581912 Oct 13 18:57 ambari-agent-2.7.9.0-0.x86_64.rpm
-rw-r--r-- 1 root root 129310552 Oct 13 18:57 ambari-server-2.7.9.0-0.x86_64.rpm
解读:
cp源路径为编译机上的 RPM 产物位置(对应《Apache Ambari 2.7.9 安装指南》方案 A 的编译输出);内网分发时替换为 RPM 实际所在目录即可。
4.2 编写 CentOS 7 EOL 源文件
CentOS 7 已停止维护,官方源下线,构建期 yum makecache 会失败,先写好归档源文件 CentOS-Base.repo(构建时 COPY 进镜像):
cat > CentOS-Base.repo <<'EOF'
[base]
name=CentOS-7.9.2009 - Base
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
[updates]
name=CentOS-7.9.2009 - Updates
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
[extras]
name=CentOS-7.9.2009 - Extras
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/extras/x86_64/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1
EOF
| 项 | 说明 |
|---|---|
baseurl | 阿里云 centos-vault 归档源(实测可用,直连 vault.centos.org 会 403) |
gpgkey | 沿用 centos:7 镜像自带的 GPG 公钥路径 |
4.3 编写 systemctl 兼容脚本与启动脚本
镜像内没有 systemd(主进程是启动脚本而非 init),而 ambari-server setup 在初始化内嵌 PostgreSQL 时会调用 systemctl show/start postgresql(postgresql-setup initdb 内部同样依赖),直接执行会报 System has not been booted with systemd as init system (PID 1). Can't operate.。解法分两层:
- 第一层:
ambari-pg-systemctl.sh——放在/usr/local/bin/systemctl(PATH 中优先于/usr/bin/systemctl),仅接管postgresql单元,把 status/start/stop/reload/show 翻译为pg_ctl等价操作,其余单元原样返回 systemd 未运行的报错。这是 setup 能完成 initdb 的前提。 - 第二层:
start-ambari.sh——容器主进程,幂等:首次启动执行 setup 建库,之后启动 Server 与 Agent,前台跟随日志保活。
创建 ambari-pg-systemctl.sh:
cat > ambari-pg-systemctl.sh <<'EOF'
#!/bin/bash
# systemctl 兼容脚本(部署镜像专用)
# 部署镜像内没有 systemd(PID 1 为 start-ambari.sh),而 Ambari 通过 systemctl
# 管理内嵌 PostgreSQL(status/start/stop/reload),因此提供基于 pg_ctl 的等价实现。
# 脚本放置在 /usr/local/bin/systemctl(PATH 中优先于 /usr/bin/systemctl),
# 仅处理 postgresql 服务单元,其余单元一律返回 systemd 未运行的原始报错。
action="$1"
unit="${@: -1}"
unit="${unit%.service}"
if [ "$unit" != "postgresql" ]; then
echo "System has not been booted with systemd as init system (PID 1). Can't operate." >&2
exit 1
fi
PGDATA=/var/lib/pgsql/data
PG_LOG=/var/lib/pgsql/pg_startup.log
pg() {
su postgres -c "pg_ctl -D $PGDATA $*"
}
prepare_log() {
if [ ! -f "$PG_LOG" ]; then
touch "$PG_LOG"
chown postgres:postgres "$PG_LOG"
fi
}
case "$action" in
status)
pg status
;;
start)
prepare_log
pg "-l $PG_LOG -w start"
;;
stop)
pg "-m fast stop"
;;
restart)
pg "-m fast stop"
prepare_log
pg "-l $PG_LOG -w start"
;;
reload)
pg reload
;;
is-active)
if pg status >/dev/null 2>&1; then
echo active
exit 0
else
echo inactive
exit 3
fi
;;
show)
# systemctl show -p Environment postgresql.service(postgresql-setup 内部调用)
# 与 RHEL7 postgresql.service 单元中的 Environment 指令保持一致
echo "Environment=PGDATA=/var/lib/pgsql/data"
echo "Environment=PGPORT=5432"
;;
*)
echo "System has not been booted with systemd as init system (PID 1). Can't operate." >&2
exit 1
;;
esac
EOF
chmod +x ambari-pg-systemctl.sh
| 片段 | 说明 |
|---|---|
unit="${@: -1}" | 取最后一个参数为单元名(兼容 systemctl start postgresql.service 带后缀写法,先去掉 .service) |
| 非 postgresql 单元直接报错 | 保持与真机 systemctl 对非托管单元的报错语义一致,避免掩盖问题 |
pg() 的 su postgres | PostgreSQL 禁止 root 启动,统一以 postgres 用户执行 pg_ctl |
show 子项 | 伪装 systemctl show -p Environment 的输出(postgresql-setup initdb 内部调用它确认 PGDATA/PGPORT),这是 initdb 能走通的关键 |
is-active 退出码 | active 返回 0、inactive 返回 3,与 systemd 约定一致 |
创建 start-ambari.sh:
cat > start-ambari.sh <<'EOF'
#!/bin/bash
# Ambari 服务启动脚本(容器主进程)
# 幂等设计:首次启动执行 ambari-server setup 初始化元数据库,
# 再次启动(数据卷已持久化配置)直接启动服务。
set -e
JDK=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64
# ambari-server setup:password.dat 由 setup 生成,作为"已完成初始化"的标记
if [ ! -f /etc/ambari-server/conf/password.dat ]; then
# 三个交互应答均取默认值 n:不自定义运行账号 / 不启用 GPL LZO / 不进高级数据库配置
printf 'n\nn\nn\n' | ambari-server setup -j "$JDK"
fi
ambari-server start
ambari-agent start
# 前台跟随服务日志,保持容器存活
tail -F /var/log/ambari-server/ambari-server.log
EOF
chmod +x start-ambari.sh
| 脚本要点 | 说明 |
|---|---|
| 幂等判断 | 以 password.dat 存在与否区分「首次」(需 setup 建库)与「再次」(卷里已有配置,直接启动),这是数据卷持久化能工作的前提 |
printf 'n\nn\nn\n' | setup 的三个 [y/n] 交互全部取默认值 n,语义与手工回车一致 |
tail -F | 主进程前台跟随日志;Server/Agent 由脚本守护拉起,进程退出时容器保持可观察状态 |
4.4 编写 Dockerfile
cat > Dockerfile <<'EOF'
FROM centos:7
# CentOS 7 已 EOL,官方镜像源下线,替换为阿里云 centos-vault 归档源
COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
RUN rm -f /etc/yum.repos.d/CentOS-Sources.repo \
/etc/yum.repos.d/CentOS-Vault.repo \
/etc/yum.repos.d/CentOS-fasttrack.repo && \
yum makecache fast
# 安装 OpenJDK 8 与基础工具
RUN yum install -y java-1.8.0-openjdk-devel wget curl openssh-clients which iproute && \
yum clean all
# 安装 Ambari Server / Agent RPM(postgresql-server 等依赖由 yum 自动解析安装)
COPY ambari-server-2.7.9.0-0.x86_64.rpm ambari-agent-2.7.9.0-0.x86_64.rpm /tmp/
RUN yum localinstall -y \
/tmp/ambari-server-2.7.9.0-0.x86_64.rpm \
/tmp/ambari-agent-2.7.9.0-0.x86_64.rpm && \
rm -f /tmp/ambari-server-*.rpm /tmp/ambari-agent-*.rpm && \
yum clean all
# JVM 堆限制在 256~512MB(RPM 默认 -Xms512m -Xmx2048m)
RUN sed -i 's/-Xms512m -Xmx2048m/-Xms256m -Xmx512m/' /var/lib/ambari-server/ambari-env.sh
# 修复源码 tarball 构建产物中未替换的 buildNumber 占位符(set -u 下执行会报 unbound variable)
RUN sed -i 's/\${buildNumber}/source/g' \
/usr/sbin/ambari-server \
/etc/init.d/ambari-server \
/var/lib/ambari-agent/bin/ambari-agent
# 容器内无 systemd:提供 PostgreSQL 的 systemctl 兼容脚本(/usr/local/bin 在 PATH 中优先于 /usr/bin)
COPY ambari-pg-systemctl.sh /usr/local/bin/systemctl
COPY start-ambari.sh /usr/local/bin/start-ambari.sh
RUN chmod 755 /usr/local/bin/systemctl /usr/local/bin/start-ambari.sh
EXPOSE 8080 8440 8441
CMD ["/usr/local/bin/start-ambari.sh"]
EOF
| 指令 | 说明 |
|---|---|
COPY CentOS-Base.repo | EOL 源修复,是后续所有 yum 操作的前提 |
yum install java-1.8.0-openjdk-devel | Ambari 2.7.x 要求 JDK 8;iproute/openssh-clients 是 ambari-server bootstrap 与网络诊断依赖 |
yum localinstall 两个 RPM | 自动解析 postgresql-server、postgresql-jdbc 等依赖,与真机安装等效 |
sed ambari-env.sh | JVM 堆限到 256-512MB(管理平台自身负载不高,默认 2G 堆过大);生效验证见 4.7 |
sed buildNumber | 源码 tarball(无 .git)构建的 RPM 固有缺陷,三个脚本不修复则启动即报 buildNumber: unbound variable |
COPY ambari-pg-systemctl.sh → /usr/local/bin/systemctl | 4.3 的 systemctl 兼容层,setup 的 initdb 与 PostgreSQL 启停依赖它(/usr/local/bin 在 PATH 中优先于 /usr/bin) |
EXPOSE 8080 8440 8441 | Web/REST、Agent 注册心跳、Agent 加密通信三端口 |
构建镜像(首次构建实测约 42 分钟,其中 4/11 JDK 安装步 1441.9s、6/11 Ambari RPM 依赖安装步 1070.4s 为主要耗时,快慢取决于网络;命中构建缓存的重复构建数秒完成):
docker build -t ambari-2.7.9:centos7 .
#5 [ 1/11] FROM docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
#5 resolve docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 0.0s done
#5 DONE 0.0s
#9 [ 2/11] COPY CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
#9 CACHED
#11 [ 3/11] RUN rm -f /etc/yum.repos.d/CentOS-Sources.repo /etc/yum.repos.d/CentOS-Vault.repo /etc/yum.repos.d/CentOS-fasttrack.repo && yum makecache fast
#11 CACHED
(中间步骤输出节选,实测首尾:首次构建时 4/11 JDK 安装与 6/11 RPM 依赖安装为全量 yum 输出并分别实测耗时 1441.9s、1070.4s;命中缓存时各步显示 CACHED)
#16 exporting to image
#16 exporting layers done
#16 exporting manifest sha256:6d07ae3e8900735ae0025aa2e4ce2c140542fcfa87e9e6cbd616a1cbd844f9cd done
#16 exporting config sha256:6c580368a575fc752368f3a87aea1d785cac1d20af9a2adf46b45a539f9fba81 done
#16 exporting attestation manifest sha256:c5916f7d0c8cc607e9c65a8f7b0936c0a9368a3b6f45d4be3686155b3868ed3a done
#16 exporting manifest list sha256:57be317b17ca81c8b7ed233cdc0b4d528aa246eac5a30f94eb3fe5ec898b7d15 done
#16 naming to docker.io/library/ambari-2.7.9:centos7 done
#16 unpacking to docker.io/library/ambari-2.7.9:centos7 0.0s done
#16 DONE 0.1s
确认镜像:
docker images ambari-2.7.9
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
ambari-2.7.9:centos7 57be317b17ca 1.86GB 610MB
解读:新版 Docker 的
docker images输出中,DISK USAGE 为镜像占用磁盘(含基础镜像层),CONTENT SIZE 为镜像内容大小;镜像 ID 每次构建不同,以本机输出为准。
4.5 编写 docker-compose.yml
cat > docker-compose.yml <<'EOF'
services:
ambari:
build: .
image: ambari-2.7.9:centos7
hostname: ambari1.example.com
init: true
ulimits:
nofile:
soft: 65536
hard: 65536
ports:
- "18081:8080"
- "18442:8440"
- "18443:8441"
volumes:
- ambari-pgdata:/var/lib/pgsql
- ambari-lib:/var/lib/ambari-server
- ambari-etc:/etc/ambari-server
- ambari-log-server:/var/log/ambari-server
- ambari-log-agent:/var/log/ambari-agent
volumes:
ambari-pgdata:
ambari-lib:
ambari-etc:
ambari-log-server:
ambari-log-agent:
EOF
| 配置项 | 说明 |
|---|---|
hostname: ambari1.example.com | Ambari 强依赖主机名互认:Agent 注册与 Server 内部拓扑都以 FQDN 为主键,不设 hostname 会导致注册异常 |
ports | Web/REST 18081→8080,Agent 通信 18442→8440 与 18443→8441;宿主端口可按需改动 |
volumes 五卷 | PostgreSQL 数据、ambari-server 数据目录(资源/密钥/临时)、配置目录、双端日志,全部命名卷持久化 |
init: true | 注入 init 进程转发信号并回收僵尸进程(ambari-agent 的 Python 守护会派生子进程) |
ulimits nofile 65536 | 与 ambari.properties 的 ulimit.open.files=65536 对齐,避免批量操作时句柄不足 |
4.6 启动与首次初始化
docker compose up -d
[+] Running 7/7
✔ Network ambari-compose_default Created
✔ Volume ambari-compose_ambari-etc Created
✔ Volume ambari-compose_ambari-log-agent Created
✔ Volume ambari-compose_ambari-lib Created
✔ Volume ambari-compose_ambari-log-server Created
✔ Volume ambari-compose_ambari-pgdata Created
✔ Container ambari-compose-ambari-1 Started
解读:首次启动会创建 1 个网络、5 个数据卷与 1 个容器;容器名
ambari-compose-ambari-1由「项目名(目录名)-服务名-序号」构成。再次执行up -d时已存在的资源直接复用,回显变为Running。
首次初始化(setup 建库建表 + 启动 Server/Agent)约 1-2 分钟。确认状态:
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
ambari-compose-ambari-1 ambari-2.7.9:centos7 "/usr/local/bin/star…" ambari 2 hours ago Up 2 hours 0.0.0.0:18081->8080/tcp, [::]:18081->8080/tcp, 0.0.0.0:18442->8440/tcp, [::]:18442->8440/tcp, 0.0.0.0:18443->8441/tcp, [::]:18443->8441/tcp
首次启动日志(setup 交互应答、建库、启动全过程,输出节选,实测首尾):
docker compose logs --tail 40 ambari
ambari-1 | Using python /usr/bin/python
ambari-1 | Setup ambari-server
ambari-1 | Checking SELinux...
ambari-1 | Customize user account for ambari-server daemon [y/n] (n)? Adjusting ambari-server permissions and ownership...
ambari-1 | Checking JDK...
ambari-1 | Configuring database...
ambari-1 | Running initdb: This may take up to a minute.
ambari-1 | Initializing database ... OK
ambari-1 | About to start PostgreSQL
ambari-1 | Creating schema and user...
ambari-1 | done.
ambari-1 | Creating tables...
ambari-1 | done.
ambari-1 | Extracting system views...
ambari-1 | ambari-admin-2.7.9.0.0.jar
ambari-1 | Ambari Server 'setup' completed successfully.
ambari-1 | Using python /usr/bin/python
ambari-1 | Starting ambari-server
ambari-1 | Server started listening on 8080
ambari-1 | Ambari Server 'start' completed successfully.
ambari-1 | Verifying Python version compatibility...
ambari-1 | Ambari Agent successfully started
ambari-1 | Agent PID at: /run/ambari-agent/ambari-agent.pid
(其后为 ambari-server.log 的前台跟随输出)
4.7 服务验证
Web 控制台探活(宿主机侧):
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:18081/
curl -s http://localhost:18081/ | grep -o '<title>.*</title>'
200
<title>Ambari</title>
浏览器访问 http://<宿主机IP>:18081/,用 admin/admin 登录(改密见本节末尾)。
REST API 验证 Agent 注册(容器内 Agent 已指向 ambari1.example.com,首次心跳约十几秒):
curl -s -u admin:q1w2e3r4 -H 'X-Requested-By: ambari' http://localhost:18081/api/v1/hosts
{
"href" : "http://localhost:18081/api/v1/hosts",
"items" : [
{
"href" : "http://localhost:18081/api/v1/hosts/ambari1.example.com",
"Hosts" : {
"host_name" : "ambari1.example.com"
}
}
]
}
进入容器执行管理命令(compose exec 的入口用法):
docker compose exec ambari ambari-server status
Using python /usr/bin/python
Ambari-server status
Ambari Server running
Found Ambari Server PID: 74 at: /var/run/ambari-server/ambari-server.pid
确认 JVM 堆限值已生效(镜像构建期的 sed 改动落到了运行进程上):
docker compose exec ambari ps -ef | grep [A]mbariServer | grep -oE '\-Xms[0-9]+m -Xmx[0-9]+m'
-Xms256m -Xmx512m
修改管理员密码(出厂 admin/admin 必须立即改掉):
curl -s -o /dev/null -w '%{http_code}\n' -u admin:admin -H 'X-Requested-By: ambari' \
-X PUT -d '{"Users":{"password":"q1w2e3r4","old_password":"admin"}}' \
http://localhost:18081/api/v1/users/admin
200
此后 Web 控制台与 REST API 均以 admin/q1w2e3r4 登录(旧口令实测返回 403)。
五、数据持久化说明
五个命名卷与容器生命周期解耦,docker compose down 删除容器后数据仍在,up -d 重新拉起后直接复用(start-ambari.sh 的幂等分支跳过 setup):
| 数据卷 | 容器内挂载点 | 内容 | 丢失影响 |
|---|---|---|---|
ambari-compose_ambari-pgdata | /var/lib/pgsql | 内嵌 PostgreSQL 数据(集群/主机/服务/用户全部元数据) | 致命:需重新 setup 并重建集群 |
ambari-compose_ambari-etc | /etc/ambari-server | ambari.properties、password.dat、log4j 配置 | 需重新 setup(幂等脚本会自动执行) |
ambari-compose_ambari-lib | /var/lib/ambari-server | Stack 资源、CA 证书与密钥、视图 jar、临时文件 | 证书重建会导致 Agent 需重新注册 |
ambari-compose_ambari-log-server | /var/log/ambari-server | Server 日志 | 仅丢历史日志 |
ambari-compose_ambari-log-agent | /var/log/ambari-agent | Agent 日志 | 仅丢历史日志 |
重启容器验证持久化(先记下已注册主机,restart 后再查):
docker compose restart ambari
Container ambari-compose-ambari-1 Restarting
Container ambari-compose-ambari-1 Started
等待约 1 分钟服务就绪后验证(Web 200 + 主机记录仍在 = 元数据与配置均持久化成功):
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:18081/
curl -s -u admin:q1w2e3r4 -H 'X-Requested-By: ambari' http://localhost:18081/api/v1/hosts | grep host_name
200
"host_name" : "ambari1.example.com"
docker compose exec ambari ls /etc/ambari-server/conf/password.dat
/etc/ambari-server/conf/password.dat
💡 卷名前缀
ambari-compose_来自 compose 项目名(目录名)。若需把数据迁到宿主机目录做备份,docker run --rm -v ambari-compose_ambari-pgdata:/data -v /root/backup:/backup alpine tar czf /backup/pgdata.tgz -C /data .(其余卷同理)。
六、环境变量表
镜像与 compose 文件未依赖任何环境变量,Ambari 的全部配置走文件(卷挂载)。与运行行为相关的两个变量在镜像内部固化:
| 变量 | 值/位置 | 作用 |
|---|---|---|
JAVA_HOME(脚本内) | start-ambari.sh 中 JDK=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64 | setup 时写入 ambari.properties 的 java.home |
AMBARI_JVM_ARGS | /var/lib/ambari-server/ambari-env.sh(镜像内已 sed 为 -Xms256m -Xmx512m) | Server JVM 堆与 GC 参数 |
如需自定义(例如改堆、换 JDK),不引入环境变量机制,直接改两处后在容器内 ambari-server restart(细节见《Apache Ambari 2.7.9 配置参数详解》5.5),保持配置经数据卷持久化、重建容器不回退。
七、配置参数说明
容器内 Ambari 的参数体系与真机安装完全一致,核心文件与实测路径:
| 文件 | 挂载卷 | 说明 |
|---|---|---|
/etc/ambari-server/conf/ambari.properties | ambari-etc | Server 核心配置(数据库 server.jdbc.*、路径 metadata.path/webapp.dir、端口与安全头等) |
/var/lib/ambari-server/ambari-env.sh | ambari-lib | Server JVM 参数(AMBARI_JVM_ARGS,镜像内已限堆 256-512MB) |
/etc/ambari-agent/conf/ambari-agent.ini | 镜像层 | Agent 配置([server] hostname=ambari1.example.com 与 Server 主机名一致,无需改动) |
/var/lib/pgsql/data | ambari-pgdata | PostgreSQL 数据目录 |
解读:单机一体化部署中 ambari-agent.ini 的 hostname 恰好等于容器 hostname,开箱即用;参数含义与修改方式(改后
ambari-server restart生效)详见《Apache Ambari 2.7.9 配置参数详解》。
八、配置文件挂载
本文采用「命名卷持久化」而非「宿主机单文件 bind mount」:ambari.properties 由 setup 首次生成,内容包含证书路径、数据库口令文件等生成态内容,bind mount 单文件会截断 setup 的生成过程。两种情形的处理方式:
- 想长期查看/备份配置:进入容器直接读,或
docker compose cp拷出——docker compose cp ambari:/etc/ambari-server/conf/ambari.properties ./ambari.properties。 - 想用宿主机文件覆盖某项配置:对「已存在」的文件可追加 bind mount 覆盖(如把调优后的 log4j.properties 挂进
/etc/ambari-server/conf/log4j.properties),改完docker compose up -d重建容器生效;对「setup 生成」的文件(ambari.properties、password.dat)不要 bind mount,直接进容器改(改动落在ambari-etc卷上,持久保留)。
九、等价 docker run 命令
不使用 Compose 时,以下 docker run 与本文 compose 配置完全等价(先构建镜像,再创建同名网络与五个命名卷,最后按 compose 的参数启动):
docker network create ambari-compose_default
docker volume create ambari-compose_ambari-pgdata
docker volume create ambari-compose_ambari-lib
docker volume create ambari-compose_ambari-etc
docker volume create ambari-compose_ambari-log-server
docker volume create ambari-compose_ambari-log-agent
docker run -d --name ambari-compose-ambari-1 \
--network ambari-compose_default \
--hostname ambari1.example.com \
--init \
--ulimit nofile=65536:65536 \
-p 18081:8080 -p 18442:8440 -p 18443:8441 \
-v ambari-compose_ambari-pgdata:/var/lib/pgsql \
-v ambari-compose_ambari-lib:/var/lib/ambari-server \
-v ambari-compose_ambari-etc:/etc/ambari-server \
-v ambari-compose_ambari-log-server:/var/log/ambari-server \
-v ambari-compose_ambari-log-agent:/var/log/ambari-agent \
ambari-2.7.9:centos7
与 compose 文件的对应关系:hostname/init/ulimits/ports/五个 volumes 逐项一致;启动后同样先执行 setup 再拉起服务。验证方式与 4.7 完全相同(curl http://localhost:18081/ 应返回 200)。
十、常用运维命令
| 命令 | 作用 | 实测回显要点 |
|---|---|---|
docker compose ps | 查看服务状态与端口映射 | STATUS 为 Up,PORTS 列出三组映射 |
docker compose logs -f ambari | 跟随服务日志 | setup/启动与 ambari-server.log 输出 |
docker compose exec ambari <命令> | 进入容器执行管理命令 | 如 ambari-server status、ambari-agent status |
docker compose restart ambari | 重启服务(数据保留) | Restarting/Started 两行,约 1 分钟就绪 |
docker compose stop / docker compose start | 停止 / 再次启动(保留容器与卷) | Stopped / Started,stop 后 Web 探活失败属预期 |
docker compose down | 删除容器与网络(卷保留) | 容器逐行 Stopped/Removed,再次 up -d 时跳过 setup 直接启动 |
实测样例(状态查看与重启,日志尾部节选):
docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
ambari-compose-ambari-1 ambari-2.7.9:centos7 "/usr/local/bin/star…" ambari 2 hours ago Up 2 hours 0.0.0.0:18081->8080/tcp, [::]:18081->8080/tcp, 0.0.0.0:18442->8440/tcp, [::]:18442->8440/tcp, 0.0.0.0:18443->8441/tcp, [::]:18443->8441/tcp
docker compose stop
Container ambari-compose-ambari-1 Stopping
Container ambari-compose-ambari-1 Stopped
docker compose start
Container ambari-compose-ambari-1 Starting
Container ambari-compose-ambari-1 Started
docker compose logs --tail 3 ambari
ambari-1 | 2026-10-13 13:03:30,700 INFO [pool-32-thread-1] MetricsServiceImpl:84 - ********* Configuring Metric Sink **********
ambari-1 | 2026-10-13 13:03:30,700 INFO [pool-32-thread-1] AmbariMetricSinkImpl:94 - No clusters configured.
ambari-1 | 2026-10-13 13:08:30,700 INFO [pool-32-thread-1] MetricsServiceImpl:68 - Attempting to initialize metrics sink
⚠️
docker compose down只删容器与网络、不删命名卷,元数据安全;若要连卷一起清空(完全重置)用docker compose down -v,该命令会删除全部 Ambari 元数据,务必先备份。
十一、常见问题
11.1 容器反复退出或 setup 阶段 PostgreSQL 启动失败
现象:docker compose ps 显示 Restarting/Exited,日志见 About to start PostgreSQL 后失败。
背景与解决:ambari-server setup 通过 systemctl 管理内嵌 PostgreSQL,而本方案的容器主进程是启动脚本(无 systemd)。本文镜像已通过 4.3 的 systemctl 兼容脚本(/usr/local/bin/systemctl,把 postgresql 单元翻译为 pg_ctl 操作)打通该路径;若自行改造时丢失了该文件或改动破坏了其翻译逻辑,setup 会卡在 Running initdb。对照真实服务器的标准流程排查理解:
# CentOS 7 真机上 PostgreSQL 的标准初始化与启动(容器内由 setup/start 脚本自动完成同样动作)
postgresql-setup initdb
systemctl start postgresql
systemctl is-active postgresql
Initializing database ... OK
active
自查:docker compose logs ambari | grep -E 'initdb|PostgreSQL',确认 Initializing database ... OK 与 About to start PostgreSQL 后无报错;docker compose exec ambari ss -tlnp | grep 5432 应能看到 postgres 监听。
11.2 启动报 buildNumber: unbound variable
现象:容器日志反复出现 /usr/sbin/ambari-server: line 34: buildNumber: unbound variable。
原因:源码 tarball 构建的 RPM 未替换 ${buildNumber} 占位符。
解决:确认镜像构建包含 Dockerfile 中对三个文件的 sed 修复(4.4);已构建的旧镜像可进容器手工补:
docker compose exec ambari sed -i 's/\${buildNumber}/source/g' /usr/sbin/ambari-server /etc/init.d/ambari-server /var/lib/ambari-agent/bin/ambari-agent
docker compose restart ambari
11.3 端口冲突:address already in use
现象:docker compose up -d 报 Error starting userland proxy: listen tcp4 0.0.0.0:18081: bind: address already in use。
解决:换宿主端口——只改 docker-compose.yml 中 ports: 的冒号左侧(如 28081:8080),冒号右侧容器端口固定不动;docker compose up -d 重建容器生效。
11.4 构建期 yum 下载慢或失败
现象:docker build 在 yum makecache fast 或安装 JDK 阶段长时间无输出/报 404。
原因:CentOS 7 EOL 后官方源全部下线,未换源必然失败;归档源偶发网络抖动会表现为下载停滞。
解决:确认 CentOS-Base.repo(4.2)已 COPY 进镜像且 baseurl 指向 mirrors.aliyun.com/centos-vault/7.9.2009/;构建停滞时中断后重跑(Docker 层缓存会跳过已完成的步骤)。
11.5 Agent 未出现在主机列表
现象:Web/REST 正常,但 /api/v1/hosts 为空。
排查:
docker compose exec ambari ambari-agent status
docker compose exec ambari grep hostname /etc/ambari-agent/conf/ambari-agent.ini
docker compose logs ambari | grep -iE 'register|heartbeat' | tail -5
常见原因:首次心跳需十几秒,稍候再查;或 ambari-agent.ini 的 [server] hostname 与容器 hostname 不一致(本文镜像默认一致,手工改过才需修正),修正后 docker compose exec ambari ambari-agent restart。
11.6 数据卷磁盘回收与迁移
现象:长期运行后卷占用增长。
操作:日志卷可进容器清理或压缩 ambari-server.log(logrotate 配置见《Apache Ambari 2.7.9 配置参数详解》);PostgreSQL 数据卷可用 docker compose exec ambari su postgres -c "vacuumdb ambari" 回收空间;迁移到其他宿主机用 5 中的 tar 方案导出卷再导入。
十二、参考链接
- Apache Ambari 官网:https://ambari.incubator.apache.org/
- Docker Compose 官方文档:https://docs.docker.com/compose/
- Ambari 源码仓库:https://github.com/apache/ambari
- 2.7.9 源码包(官方归档):https://archive.apache.org/dist/ambari/ambari-2.7.9/
- 阿里云 CentOS Vault 源:https://mirrors.aliyun.com/centos-vault/7.9.2009/
- 同系列:《Apache Ambari 2.7.9 安装指南》(RPM 编译来源)《Apache Ambari 2.7.9 配置参数详解》