Apache Ambari 2.7.9 Docker Compose 部署指南

Apache Ambari 2.7.9 Docker Compose 部署指南:自建 ambari-2.7.9 镜像一键拉起全栈并映射 8080/8440/8441,覆盖构建、验证、数据卷持久化与常用运维命令,全部实测。

Apache AmbariAmbari2026/10/13

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 postgresPostgreSQL 禁止 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.repoEOL 源修复,是后续所有 yum 操作的前提
yum install java-1.8.0-openjdk-develAmbari 2.7.x 要求 JDK 8;iproute/openssh-clients 是 ambari-server bootstrap 与网络诊断依赖
yum localinstall 两个 RPM自动解析 postgresql-server、postgresql-jdbc 等依赖,与真机安装等效
sed ambari-env.shJVM 堆限到 256-512MB(管理平台自身负载不高,默认 2G 堆过大);生效验证见 4.7
sed buildNumber源码 tarball(无 .git)构建的 RPM 固有缺陷,三个脚本不修复则启动即报 buildNumber: unbound variable
COPY ambari-pg-systemctl.sh → /usr/local/bin/systemctl4.3 的 systemctl 兼容层,setup 的 initdb 与 PostgreSQL 启停依赖它(/usr/local/bin 在 PATH 中优先于 /usr/bin)
EXPOSE 8080 8440 8441Web/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.comAmbari 强依赖主机名互认:Agent 注册与 Server 内部拓扑都以 FQDN 为主键,不设 hostname 会导致注册异常
portsWeb/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-serverambari.properties、password.dat、log4j 配置需重新 setup(幂等脚本会自动执行)
ambari-compose_ambari-lib/var/lib/ambari-serverStack 资源、CA 证书与密钥、视图 jar、临时文件证书重建会导致 Agent 需重新注册
ambari-compose_ambari-log-server/var/log/ambari-serverServer 日志仅丢历史日志
ambari-compose_ambari-log-agent/var/log/ambari-agentAgent 日志仅丢历史日志

重启容器验证持久化(先记下已注册主机,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_64setup 时写入 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.propertiesambari-etcServer 核心配置(数据库 server.jdbc.*、路径 metadata.path/webapp.dir、端口与安全头等)
/var/lib/ambari-server/ambari-env.shambari-libServer JVM 参数(AMBARI_JVM_ARGS,镜像内已限堆 256-512MB)
/etc/ambari-agent/conf/ambari-agent.ini镜像层Agent 配置([server] hostname=ambari1.example.com 与 Server 主机名一致,无需改动)
/var/lib/pgsql/dataambari-pgdataPostgreSQL 数据目录

解读:单机一体化部署中 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 方案导出卷再导入。

十二、参考链接