Docker 环境下使用 Easysearch #
在使用 Docker 运行 Easysearch 之前,请确保已进行系统调优并安装好 Docker 服务,且 Docker 服务正常运行。
最快方式:启动临时的 docker 容器,可以从前台查看到 admin 随机生成的初始密码
- 注: Docker 环境一般用于临时验证,如需要长期使用请务必进行数据持久化
# 直接运行镜像使用随机密码(数据及配置未持久化)
docker run --name easysearch --ulimit memlock=-1:-1 -p 9200:9200 infinilabs/easysearch:2.5.0-3015
# 使用自定义密码,可以使用环境变量配置 (需要 1.8.2 及以后的版本才支持)
echo "EASYSEARCH_INITIAL_ADMIN_PASSWORD=$(printf "%s%s%s@%s" "$(tr -dc a-z</dev/urandom|head -c4)" "$(tr -dc A-Z</dev/urandom|head -c3)" "$(tr -dc 0-9</dev/urandom|head -c2)" "$(tr -dc a-z0-9</dev/urandom|head -c3)")" | tee .env
# 通过从环境变量文件设置初始密码(数据及配置未持久化)
docker run --name easysearch --env-file ./.env --ulimit memlock=-1:-1 -p 9200:9200 infinilabs/easysearch:2.5.0-3015
# 使用自定义密码及命名卷 (数据持久化到命名卷)
docker run -d --name easysearch \
--ulimit memlock=-1:-1 \
--env-file ./.env -p 9200:9200 \
-v easysearch-data:/app/easysearch/data \
-v easysearch-config:/app/easysearch/config \
-v easysearch-logs:/app/easysearch/logs \
infinilabs/easysearch:2.5.0-3015
数据持久化到本地(数据可长期使用) #
设置自定义密码,并从宿主机挂载数据目录、配置目录及日志目录,配置 jvm 内存为 512m。
- 在宿主机上创建目录
# 创建数据及日志存储目录
sudo mkdir -p /data/easysearch/{data,logs}
# 根据自己的需求,设置成安全的密码
echo "EASYSEARCH_INITIAL_ADMIN_PASSWORD=$(printf "%s%s%s@%s" "$(tr -dc a-z</dev/urandom|head -c4)" "$(tr -dc A-Z</dev/urandom|head -c3)" "$(tr -dc 0-9</dev/urandom|head -c2)" "$(tr -dc a-z0-9</dev/urandom|head -c3)")" | sudo tee /data/easysearch/.env
- 修改目录权限
非必须步骤,视具体操作环境而定,可参考文末的错误说明
# 注意:需要根据 Docker 运行环境判断是否需要调整权限,如在 MacOS 上使用 OrbStack 则不需要调整权限。
# 容器内 easysearch 用户的 uid 为 602,通过调整宿主机的目录权限,确保在容器内部 easysearch 用户有权限读写挂载的数据卷
sudo chown -R 602:602 /data/easysearch
不要用
--user指定运行用户。 容器应保持默认(root)启动:entrypoint 会先把/app/easysearch/{data,config,logs}的属主修正为602:602,再用gosu降权到easysearch(uid 602)启动 Java 进程。若以--user 602:602启动,gosu无法降权,容器会报failed switching to "easysearch": operation not permitted后立即退出。 因此上面的chown 602:602只是为保证数据目录可写(在容器无法自行 chown 的环境,如 rootless Docker 或开启了 root squash 的 NFS 上才有必要),运行用户本身不需要、也不能改成 602。
- 从镜像初始化 config 目录
必需步骤,不能省略。 绑定挂载不像命名卷那样会自动填充镜像内容。如果挂载的
config目录为空, 镜像自带的config/security/会被整体遮住,容器初始化时找不到/app/easysearch/config/security/user.yml,报ERROR: Admin password generation failed并立即退出 (docker logs中可见No such file or directory)。 本步骤同时会把证书等初始化产物一并导出,复制出的文件属主为容器内easysearch用户(uid 602)。
# 将镜像中的 config 目录复制到本地目录
docker run --rm --env-file /data/easysearch/.env -v /data/easysearch:/work infinilabs/easysearch:2.5.0-3015 cp -rf /app/easysearch/config /work
- 后台运行容器
#后台启动容器,并指定内存大小及挂载数据、日志目录,设定好容器名称及容器主机名称
#如需调整配置文件,可以修改以下配置文件
# 1. /data/easysearch/config/easysearch.yml
# 2. /data/easysearch/config/jvm.options
# 3. /data/easysearch/config/log4j2.properties
docker run -d --restart always -p 9200:9200 \
--ulimit memlock=-1:-1 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
-v /data/easysearch/data:/app/easysearch/data \
-v /data/easysearch/config:/app/easysearch/config \
-v /data/easysearch/logs:/app/easysearch/logs \
--name easysearch --hostname easysearch \
infinilabs/easysearch:2.5.0-3015
- 升级 Easysearch 版本
升级时必须同步版本相关的配置文件。 镜像内置的 JDK 与
config/jvm.options是按版本绑定的, 而config目录被持久化,旧版本留下的jvm.options会让新版本容器起不来。 以2.4.0(内置 JDK 21)升到2.5.0(内置 JDK 25)为例:
- 旧配置里的
-Djava.security.manager=allow在 JDK 25 上直接报A command line option has attempted to allow or enable the Security Manager,VM 初始化失败;- 新版新增的
-javaagent:lib/easysearch-security-agent-<版本>.jar在旧配置里不存在, 因此只改前一个参数也不够,会接着报java.lang.IllegalStateException: security agent is not loaded。结论:不要只改单个参数,直接用新版本镜像同步整份
jvm.options。
# 1. 先停止并删除正在运行的容器
docker stop easysearch && docker rm easysearch
# 2. 对比新旧 jvm.options 是否一致(容器内没有 diff/cmp,用 sha256sum 判断;哈希不同即需要同步)
docker run --rm -v /data/easysearch/config:/c infinilabs/easysearch:<新版本> \
sha256sum /app/easysearch/config/jvm.options /c/jvm.options
# 3. 用新版本镜像同步版本相关的配置
# 该命令以容器内 easysearch 用户执行,属主保持 602,无需再 chown
docker run --rm -v /data/easysearch/config:/c infinilabs/easysearch:<新版本> \
cp -f /app/easysearch/config/jvm.options /c/jvm.options
# 4. 按第 4 步、使用新的镜像版本重新运行容器
需要查看具体差异时,先把新版本的
jvm.options复制出来,再在宿主机上比对(容器内没有diff):docker run --rm -v /data/easysearch:/work infinilabs/easysearch:<新版本> \ cp -f /app/easysearch/config/jvm.options /work/jvm.options.new diff /data/easysearch/config/jvm.options /data/easysearch/jvm.options.new用命名卷存
config时(见文首"使用自定义密码及命名卷")同样需要同步,把上面的-v /data/easysearch/config:/c换成-v easysearch-config:/c即可。除
jvm.options外,其它配置文件是否也要同步,按上面第 2 条命令的哈希比对结果判断;含自定义内容的 文件(如easysearch.yml)不要直接覆盖。
验证安装 #
# 查看容器状态
docker ps --filter name=easysearch
# 查看容器日志(首次运行时可从日志中找到 admin 随机密码)
docker logs easysearch
# 测试连接
curl -ku admin:YOUR_PASSWORD https://localhost:9200
健康检查 #
Docker 运行时可以配置健康检查,自动监测 Easysearch 是否正常运行:
docker run -d --name easysearch \
--ulimit memlock=-1:-1 \
--env-file ./.env -p 9200:9200 \
-e ES_JAVA_OPTS="-Xms512m -Xmx512m" \
--health-cmd='curl -skf -u "admin:${EASYSEARCH_INITIAL_ADMIN_PASSWORD}" https://localhost:9200/_cluster/health || exit 1' \
--health-interval=30s \
--health-timeout=10s \
--health-retries=3 \
--health-start-period=60s \
-v easysearch-data:/app/easysearch/data \
-v easysearch-config:/app/easysearch/config \
-v easysearch-logs:/app/easysearch/logs \
infinilabs/easysearch:2.5.0-3015
查看健康状态:
docker inspect --format='{{.State.Health.Status}}' easysearch
常见问题 #
vm.max_map_count 错误 #
# 临时生效
sudo sysctl -w vm.max_map_count=262144
# 永久生效
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
更多系统参数请参考 系统调优。
容器启动后立即退出 #
# 查看退出原因
docker logs easysearch
# 常见原因:
# 1. 内存不足 — 调整 ES_JAVA_OPTS
# 2. 权限问题 — 调整挂载目录权限为 chown 602:602 /data/easysearch
# 3. 端口冲突 — 更换映射端口
# 4. 容器名称冲突 - 删除异常容器 docker rm easysearch
# 5. 用了 --user 指定运行用户 — 去掉 --user,容器需以默认 root 启动(entrypoint 用 gosu 降权)
# 6. 挂载的 config 目录为空 — 按"数据持久化到本地"第 3 步从镜像初始化 config
升级后容器无法启动 #
docker logs 中出现以下任一报错,通常是持久化的 config 目录里 jvm.options 与新版本镜像不匹配:
A command line option has attempted to allow or enable the Security Manager
java.lang.IllegalStateException: security agent is not loaded
按前文"数据持久化到本地"一节的第 5 步,用新版本镜像同步 config/jvm.options 后再重新运行容器。
只修改单个 JVM 参数不够,需整体同步该文件。
具体错误示例 #
- 权限错误
# 给目录赋予容器内 easysearch 用户操作权限,用户组和用户 ID 为 602
chown 602:602 /data/easysearch
- 站口占用错误
# 修改端口映射,映射关系为 主机端口:容器端口
- 首次安装后重置密码
# 由于随机密码被日志覆盖,找不到或想重新设置密码可使用以下命令来重置
docker exec -it easysearch bash -c "/app/easysearch/bin/reset_admin_password.sh"
查看容器内文件 #
# 进入容器
docker exec -it easysearch bash
# 容器内 Easysearch 路径
ls /app/easysearch/