本文使用的 Docker 镜像
本文基于 jumpserver/jms_all:v5.0.0,实测引擎 JumpServer v5.0.0,测试平台 Ubuntu 24.04 Linux。
运维群里还在传 root 密码:有人记在 Excel,有人贴到企业微信,有人把跳板机的 authorized_keys 拷来拷去。新人入职要连三台机器,旧同事离职了密钥还在;出了事故回看聊天记录,说不清谁在哪台机器敲过什么。RDP、数据库、云主机的入口又各一套,权限一散,审计更难。
把账号交到公有云堡垒或第三方跳板,又会碰到内网隔离、等保和「会话录像不出域」。很多机房已经有一台跑 Docker 的 Ubuntu,缺的是:镜像能拉下来、密钥和数据落在自己盘上、浏览器里就能授权资产、Web 终端连上去并留下会话记录。
JumpServer(官网、文档、镜像页)是开源堡垒机。本文跟做 jumpserver/jms_all:官方 all-in-one 镜像,控制台、Web 终端、资产与授权打进一个容器,内置 PostgreSQL。浏览器管资产、发授权、开终端;会话走 JumpServer,口令不必再在群里传。
部署跑通之后,你实际能做这些事:
| 场景 | 部署后怎么用 |
|---|---|
| 统一入口 | 运维用各自的 JumpServer 账号登录,不再共用一台机的 root 口令 |
| 纳管主机 | 把内网 Linux / Windows / 数据库加进资产树,凭据保存在 JumpServer |
| Web 终端 | 授权后在浏览器里连 SSH / RDP,会话可审计 |
| 权限回收 | 人员变动时停账号或改授权,不必逐台改密钥、清 authorized_keys |
用 轩辕镜像 加速拉取 jumpserver/jms_all:v5.0.0,Docker Compose 启动。把文中的服务器 IP、DOMAINS 换成你的访问地址。
官方:JumpServer 官网 · 快速入门 · all-in-one Dockerfile · 镜像页 · 标签列表
一、jumpserver/jms_all 是什么?
jumpserver/jms_all 是 JumpServer 的单容器一体化镜像:Web 控制台、终端组件和内置 PostgreSQL 同容器运行。业务数据进命名卷 jsdata(/opt/data),数据库进 pgdata(/var/lib/postgresql)。浏览器访问宿主机 8080,SSH 相关入口映射 2222。本镜像走纯 B/S:用浏览器管理与连资产,不提供独立 Client。
text浏览器 ──HTTP:8080──▶ Web 控制台 / Web 终端 SSH 客户端 ──:2222──▶ 终端组件(Koko 等) │ ▼ jumpserver/jms_all:v5.0.0 ├── /opt/data ← 命名卷 jsdata └── /var/lib/postgresql ← 命名卷 pgdata
跟做坐标:jumpserver/jms_all:v5.0.0。/r/ 与 /zh/r/ 为同一镜像的不同页面语言。
二、环境要求
| 项目 | 建议 |
|---|---|
| 系统 | Linux,建议 Ubuntu 24.04;macOS 用 ~/docker/jms-all |
| Docker | Engine + Compose V2 |
| 架构 | v5.0.0 当前为 linux/amd64;arm64 请核 标签页,或选用带 arm64 的旧版(如 v4.10.19) |
| 内存 | ≥ 4 GB;偏紧时启动慢或 OOM |
| 磁盘 | Hub 标注压缩约 1.05 GB;解压与录像另计 |
| 端口 | 宿主机 8080(HTTP)、2222(SSH);容器内 80 / 2222 |
bashdocker --version docker compose version
Linux 未装 Docker 可使用轩辕镜像一键安装脚本:
bashbash <(wget -qO- https://get.xuanyuan.cloud/docker.sh)
备用地址:
bashbash <(wget -qO- https://get.xuanyuan.me/docker.sh)
三、拉取镜像
3.1 标签怎么选
| 标签 | 说明 | 是否跟做 |
|---|---|---|
v5.0.0 | 撰写时较新的具体版本,与当时 latest 同源;amd64 | 推荐 |
v4.10.19 等 | v4 线;部分标签有 amd64 / arm64 | 需要 arm64 或暂留 v4 |
latest | 浮动标签 | 勿写入跟做命令 |
完整列表见 标签页。升级只改镜像标签,密钥与命名卷保持不变。
3.2 用轩辕镜像加速拉取
bashdocker pull docker.xuanyuan.run/jumpserver/jms_all:v5.0.0
Ubuntu 24.04 实测:
textv5.0.0: Pulling from jumpserver/jms_all 3f4f5203236f: Pull complete 52ad27bdf382: Pull complete 4f4fb700ef54: Pull complete 6b37362b3da7: Pull complete 8e2145ee0a08: Pull complete 44136fa355b3: Download complete 4bc33203a324: Download complete Digest: sha256:027460f2d0c3b55b20497b7a8599aab70864e679d31417ce55a08e4add2f59c8 Status: Downloaded newer image for docker.xuanyuan.run/jumpserver/jms_all:v5.0.0 docker.xuanyuan.run/jumpserver/jms_all:v5.0.0
体积较大,首次拉取预留时间与磁盘即可。
四、Docker Compose 部署(主路径)
顺序:建目录 → 写 .env → 写 compose.yaml → up -d → 等就绪 → 浏览器登录。
上游示例常占宿主机 80。本机若已有 Nginx / 面板,会冲突,故改为 8080→80;SSH 仍为 2222。访问 http://IP:8080。
持久化与上游一致:用命名卷 jsdata、pgdata。不要把空目录绑到 /var/lib/postgresql,否则会盖住镜像内 PostgreSQL,出现 17/main is not accessible 并卡在 wait for database(FAQ 有排障)。
4.1 准备目录
bashsudo mkdir -p /www/wwwroot/jms-all cd /www/wwwroot/jms-all
macOS 换成 ~/docker/jms-all。数据在命名卷里,不必再 mkdir 业务子目录。
4.2 生成密钥与访问地址写入 .env
SECRET_KEY、BOOTSTRAP_TOKEN 用于加密与组件注册;升级时必须与首次一致,否则库里加密字段解不开。勿含特殊字符;长度建议分别 ≥ 50、≥ 24。
DOMAINS 填浏览器地址栏的 主机:端口(不要 http://)。局域网示例 192.168.1.35:8080;多个入口用英文逗号分隔。漏配或写错时,登录页会红框提示设置 DOMAINS。
bashcd /www/wwwroot/jms-all SECRET_KEY=$(openssl rand -base64 48 | tr -d '/+=' | cut -c1-50) BOOTSTRAP_TOKEN=$(openssl rand -hex 16) # 将 DOMAINS 改成你的访问地址 cat > .env <<EOF SECRET_KEY=${SECRET_KEY} BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN} LOG_LEVEL=ERROR DOMAINS=192.168.1.35:8080 EOF chmod 600 .env
grep -E 'SECRET_KEY|DOMAINS' .env 确认即可。.env 勿提交公开仓库。
4.3 写入 compose.yaml
bashcd /www/wwwroot/jms-all cat > compose.yaml <<'EOF' services: jms_all: image: docker.xuanyuan.run/jumpserver/jms_all:v5.0.0 container_name: jms_all restart: unless-stopped ports: - "8080:80" - "2222:2222" env_file: - .env volumes: - jsdata:/opt/data - pgdata:/var/lib/postgresql volumes: jsdata: pgdata: EOF
| 项 | 含义 |
|---|---|
8080:80 | 宿主机 8080 → 容器 80 |
2222:2222 | SSH / 终端入口 |
env_file | 读入密钥与 DOMAINS |
jsdata / pgdata | 业务数据与内置 PostgreSQL |
4.4 启动与验证
bashcd /www/wwwroot/jms-all docker compose up -d docker compose ps docker compose logs -f --tail 100 jms_all
首次冷启动常需 几分钟:建库、跑完 Django migration,再起 supervisor(core / koko / web)。其间短暂刷 wait for jms_core 或 connection refused 属正常,等 Core 起来即可;另开终端探测也可以。
Ubuntu 24.04 实测摘录:
text>> Init database >> Start database postgre ALTER ROLE CREATE DATABASE >> Update database structure … Running migrations: … OK Time: 2026-09-22 15:49:40 … success: core entered RUNNING state … … success: koko entered RUNNING state … … success: web entered RUNNING state …
bashcurl -sI http://127.0.0.1:8080/
实测:
textHTTP/1.1 200 OK Server: nginx Date: Tue, 22 Sep 2026 07:52:41 GMT Content-Type: text/html Content-Length: 3763 Connection: keep-alive
浏览器打开 http://192.168.1.35:8080(换成你的 IP)会跳到登录页。Ctrl+C 只结束 logs -f,容器继续跑。
可忽略:rm: cannot remove '/var/log/nginx'、偶发 logs 目录 mv 提示、Django RuntimeWarning、supervisor 以 root 运行。若见 kael stopped ... codex-cli,只影响 AI 助手,不挡登录(见 FAQ)。
五、浏览器首次登录
- 打开
http://<服务器IP>:8080(实测:http://192.168.1.35:8080)。 - 默认账号:admin / ChangeMe。
- 按提示改密、完善资料后进入控制台。
5.1 登录页
语言选「中文 (简体)」,填入账号后登录。

若顶部红框要求设置 DOMAINS=…,说明 .env 与地址栏不一致。改对 DOMAINS 后执行 docker compose up -d --force-recreate(命令见 FAQ)。

5.2 强制改密
默认口令会被判定过简,弹出「请修改密码」,确认后进入重置页,提交新密码。


5.3 完善个人信息
「个人信息完善」中用户名多为 admin,名称、邮箱可改;勾选同意条款后提交。页面上的 admin(Administrator) 水印是 JumpServer 的防截图水印,属正常。

进入系统后,可在系统设置里填写「当前站点 URL」(内网示例:http://192.168.1.35:8080),邮件链接等会用到。默认口令见上游 all-in-one README。公网务必强密码 + HTTPS / 来源限制。
六、主界面与核心功能
下列截图来自局域网实测空库环境:尚未纳管真实主机,侧重菜单与首次界面。加资产、授权的逐步字段说明见 官方快速入门。
6.1 仪表盘
控制台「仪表盘」汇总在线会话、用户与资产。新装常见用户 1(Administrator)、资产 0。

6.2 用户与资产
「用户管理 → 用户列表」可改管理员、再建运维账号。

「资产管理 → 资产列表」按主机、数据库等分类;点「创建」添加第一台机器。

「网域列表」用来描述资产所在位置(机房、VPC 等),创建后再挂网关与资产。

6.3 账号与授权
「账号管理」保存连资产的凭据;「账号模版」可预设用户名与密文策略,便于批量推送。


「资产授权」把用户(组)绑到资产与账号;「命令过滤」可对危险命令拒绝或告警。


6.4 系统设置
「平台列表」内置 Linux、Windows 等协议模板;「通知设置」可配 SMTP;「远程应用」可见 WebLite、DBeaver 等内置项。「AI 助手」默认关闭,不配也能用堡垒主流程。




6.5 Web 终端
从顶栏进入 Web 终端:左侧资产树,右侧会话区。尚无资产时显示快捷键与「未连接」;完成纳管与授权后,右键资产即可连接。

七、升级与密钥注意
- 备份
.env中的密钥:
bashgrep -E 'SECRET_KEY|BOOTSTRAP_TOKEN|DOMAINS' /www/wwwroot/jms-all/.env
- 备份命名卷(卷名以
docker volume ls | grep jms为准,项目目录为jms-all时多为jms-all_jsdata/jms-all_pgdata):
bashmkdir -p /www/wwwroot/jms-all/backup docker run --rm -v jms-all_jsdata:/from -v /www/wwwroot/jms-all/backup:/to alpine \ tar czf /to/jsdata-$(date +%F).tgz -C /from . docker run --rm -v jms-all_pgdata:/from -v /www/wwwroot/jms-all/backup:/to alpine \ tar czf /to/pgdata-$(date +%F).tgz -C /from .
- 只改
compose.yaml里的镜像标签,不要改.env的SECRET_KEY/BOOTSTRAP_TOKEN。 - 滚动升级:
bashcd /www/wwwroot/jms-all docker compose pull docker compose up -d
八、备选:docker run
无 Compose 时可用命名卷直接跑:
bashdocker volume create jsdata docker volume create pgdata SECRET_KEY=$(openssl rand -base64 48 | tr -d '/+=' | cut -c1-50) BOOTSTRAP_TOKEN=$(openssl rand -hex 16) docker run -d \ --name jms_all \ --restart unless-stopped \ -p 8080:80 \ -p 2222:2222 \ -e SECRET_KEY="${SECRET_KEY}" \ -e BOOTSTRAP_TOKEN="${BOOTSTRAP_TOKEN}" \ -e LOG_LEVEL=ERROR \ -e DOMAINS=192.168.1.35:8080 \ -v jsdata:/opt/data \ -v pgdata:/var/lib/postgresql \ docker.xuanyuan.run/jumpserver/jms_all:v5.0.0
把 DOMAINS 和密钥记下来;升级时密钥必须一致。
bashdocker ps --filter name=jms_all docker logs --tail 100 jms_all docker rm -f jms_all # 命名卷仍保留
九、常见问题
为什么不用 latest?
会随仓库滚动,界面与依赖可能和文档脱节。跟做写 v5.0.0。
为什么宿主机是 8080?
容器内 Web 是 80;宿主机 80 常被 Nginx / 面板占用。确认空闲时可自行改成 "80:80"。
登录提示「配置文件存在问题 / DOMAINS=…」?
把地址栏的主机:端口写入 .env(不要 http://),再重建:
bashcd /www/wwwroot/jms-all grep -q '^DOMAINS=' .env \ && sed -i 's|^DOMAINS=.*|DOMAINS=192.168.1.35:8080|' .env \ || echo 'DOMAINS=192.168.1.35:8080' >> .env docker compose up -d --force-recreate
本机与局域网并用时可写:DOMAINS=192.168.1.35:8080,127.0.0.1:8080。
postgresql/17/main is not accessible,一直 wait for database?
空目录绑过 /var/lib/postgresql。改回命名卷后:
bashcd /www/wwwroot/jms-all docker compose down # compose 中应为 pgdata:/var/lib/postgresql,并有 volumes: 声明 docker compose up -d
冷启动一直 wait for jms_core?
等容器内 Core 健康检查,常见于 migration 刚结束。用 curl -sI http://127.0.0.1:8080/ 探测;与「空绑定盖库」不是同一类问题。
日志里 kael stopped / codex-cli?
AI 组件 Kael 退出。控制台、资产、Web 终端不受影响;「AI 助手」可保持关闭。
和 Installer / 拆分镜像怎么选?
本文是单机 all-in-one、纯 B/S。要多节点、Client 或按企业清单上生产,走 官方文档 的 Installer 与拆分镜像,那是另一条线。
页面打不开?
看 docker compose ps 与 logs --tail 200;确认内存、防火墙放行 8080 / 2222。
升级后解不开数据?
核对 .env 密钥是否与首次一致,命名卷是否仍是原来的 jsdata / pgdata。
要外置 MySQL / Redis 吗?
主路径用内置库即可。外置要求见 allinone/README。
可以公网吗?
本文按内网写。公网请强密码、HTTPS、限制来源,并评估是否改用标准部署。
十、命令速查
bashdocker pull docker.xuanyuan.run/jumpserver/jms_all:v5.0.0 sudo mkdir -p /www/wwwroot/jms-all && cd /www/wwwroot/jms-all SECRET_KEY=$(openssl rand -base64 48 | tr -d '/+=' | cut -c1-50) BOOTSTRAP_TOKEN=$(openssl rand -hex 16) cat > .env <<EOF SECRET_KEY=${SECRET_KEY} BOOTSTRAP_TOKEN=${BOOTSTRAP_TOKEN} LOG_LEVEL=ERROR DOMAINS=192.168.1.35:8080 EOF chmod 600 .env # compose.yaml 见第四节 docker compose up -d docker compose ps docker compose logs --tail 100 jms_all curl -sI http://127.0.0.1:8080/ # 备选 run(须带 DOMAINS) docker volume create jsdata && docker volume create pgdata docker run -d --name jms_all --restart unless-stopped \ -p 8080:80 -p 2222:2222 \ -e SECRET_KEY=... -e BOOTSTRAP_TOKEN=... -e LOG_LEVEL=ERROR \ -e DOMAINS=192.168.1.35:8080 \ -v jsdata:/opt/data -v pgdata:/var/lib/postgresql \ docker.xuanyuan.run/jumpserver/jms_all:v5.0.0
浏览器:http://<IP>:8080 · admin / ChangeMe(登录后改密)· v5.0.0 · 卷 jsdata / pgdata · 必配 DOMAINS
十一、延伸阅读
阅读原文
评论交流
免责声明
本博客文章所提供的内容、技术方案、配置示例及部署指南等信息,仅供学习交流和技术参考使用。文章内容基于发布时的技术环境和版本信息编写,可能因时间推移、技术更新或环境差异而存在不适用的情况。
用户在参考本博客内容进行部署操作前,应当充分了解相关技术风险,并建议在测试环境中进行充分验证和测试,确认无误后再考虑在生产环境中使用。生产环境部署前,请务必进行数据备份,并制定相应的回滚方案。
用户因使用本博客内容进行部署操作而产生的任何损失、数据丢失、系统故障、安全风险或其他问题,均由用户自行承担全部责任。轩辕镜像官方不对因使用本博客内容而产生的任何直接或间接损失承担责任。
本免责声明的最终解释权归轩辕镜像官方所有。
