Docker 部署 JumpServer:轻松搭建开源堡垒机平台
2026/9/22Docker部署教程轩辕镜像团队29 分钟阅读

Docker 部署 JumpServer:轻松搭建开源堡垒机平台

JumpServer 是开源堡垒机,支持 SSH、RDP、数据库等资产的授权、审计与 Web 终端。本文将介绍如何通过 Docker Compose 部署官方 all-in-one 镜像 jumpserver/jms_all,用轩辕镜像加速拉取,适合内网运维审计与小团队自托管。

本文使用的 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.0Docker 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
DockerEngine + 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
bash
docker --version
docker compose version

Linux 未装 Docker 可使用轩辕镜像一键安装脚本:

bash
bash <(wget -qO- https://get.xuanyuan.cloud/docker.sh)

备用地址:

bash
bash <(wget -qO- https://get.xuanyuan.me/docker.sh)

三、拉取镜像

3.1 标签怎么选

标签说明是否跟做
v5.0.0撰写时较新的具体版本,与当时 latest 同源;amd64推荐
v4.10.19v4 线;部分标签有 amd64 / arm64需要 arm64 或暂留 v4
latest浮动标签勿写入跟做命令

完整列表见 标签页。升级只改镜像标签,密钥与命名卷保持不变

3.2 用轩辕镜像加速拉取

bash
docker pull docker.xuanyuan.run/jumpserver/jms_all:v5.0.0

Ubuntu 24.04 实测:

text
v5.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

持久化与上游一致:用命名卷 jsdatapgdata不要把空目录绑到 /var/lib/postgresql,否则会盖住镜像内 PostgreSQL,出现 17/main is not accessible 并卡在 wait for database(FAQ 有排障)。

4.1 准备目录

bash
sudo mkdir -p /www/wwwroot/jms-all
cd /www/wwwroot/jms-all

macOS 换成 ~/docker/jms-all。数据在命名卷里,不必再 mkdir 业务子目录。

4.2 生成密钥与访问地址写入 .env

SECRET_KEYBOOTSTRAP_TOKEN 用于加密与组件注册;升级时必须与首次一致,否则库里加密字段解不开。勿含特殊字符;长度建议分别 ≥ 50、≥ 24。

DOMAINS 填浏览器地址栏的 主机:端口(不要 http://)。局域网示例 192.168.1.35:8080;多个入口用英文逗号分隔。漏配或写错时,登录页会红框提示设置 DOMAINS

bash
cd /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

bash
cd /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:2222SSH / 终端入口
env_file读入密钥与 DOMAINS
jsdata / pgdata业务数据与内置 PostgreSQL

4.4 启动与验证

bash
cd /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_coreconnection 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 …
bash
curl -sI http://127.0.0.1:8080/

实测:

text
HTTP/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)。


五、浏览器首次登录

  1. 打开 http://<服务器IP>:8080(实测:http://192.168.1.35:8080)。
  2. 默认账号:admin / ChangeMe
  3. 按提示改密、完善资料后进入控制台。

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 终端:左侧资产树,右侧会话区。尚无资产时显示快捷键与「未连接」;完成纳管与授权后,右键资产即可连接。


七、升级与密钥注意

  1. 备份 .env 中的密钥:
bash
grep -E 'SECRET_KEY|BOOTSTRAP_TOKEN|DOMAINS' /www/wwwroot/jms-all/.env
  1. 备份命名卷(卷名以 docker volume ls | grep jms 为准,项目目录为 jms-all 时多为 jms-all_jsdata / jms-all_pgdata):
bash
mkdir -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 .
  1. 只改 compose.yaml 里的镜像标签,不要改 .envSECRET_KEY / BOOTSTRAP_TOKEN
  2. 滚动升级:
bash
cd /www/wwwroot/jms-all
docker compose pull
docker compose up -d

八、备选:docker run

无 Compose 时可用命名卷直接跑:

bash
docker 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 和密钥记下来;升级时密钥必须一致。

bash
docker 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://),再重建:

bash
cd /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。改回命名卷后:

bash
cd /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 pslogs --tail 200;确认内存、防火墙放行 8080 / 2222

升级后解不开数据?
核对 .env 密钥是否与首次一致,命名卷是否仍是原来的 jsdata / pgdata

要外置 MySQL / Redis 吗?
主路径用内置库即可。外置要求见 allinone/README

可以公网吗?
本文按内网写。公网请强密码、HTTPS、限制来源,并评估是否改用标准部署。


十、命令速查

bash
docker 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


十一、延伸阅读


阅读原文

评论交流

加载中

免责声明

本博客文章所提供的内容、技术方案、配置示例及部署指南等信息,仅供学习交流和技术参考使用。文章内容基于发布时的技术环境和版本信息编写,可能因时间推移、技术更新或环境差异而存在不适用的情况。

用户在参考本博客内容进行部署操作前,应当充分了解相关技术风险,并建议在测试环境中进行充分验证和测试,确认无误后再考虑在生产环境中使用。生产环境部署前,请务必进行数据备份,并制定相应的回滚方案。

用户因使用本博客内容进行部署操作而产生的任何损失、数据丢失、系统故障、安全风险或其他问题,均由用户自行承担全部责任。轩辕镜像官方不对因使用本博客内容而产生的任何直接或间接损失承担责任。

本免责声明的最终解释权归轩辕镜像官方所有。

最后更新:2026/9/22
专业版 · 高速稳定拉取镜像
50GB 仅 ¥8/年
高速镜像下载在线技术支持99.95% SLA 保障付费会员免广告