背景介绍 #
许多用户在使用 Docker 部署 INFINI Console(本文使用 1.29.6 版本)时,可能会遇到一个常见问题:重启容器后,之前在 INFINI Console 中所连接的系统集群配置会丢失。这个问题通常源于未能正确配置 Docker 的数据持久化。原本通过 Docker 运行 INFINI Console 只是一个简单的测试示例,并未考虑多次重启使用,现官方文档也进行了更新,参考: 容器部署
接下来我们本地测试一下。
理解核心问题:Docker 容器与数据持久化 #
默认情况下,Docker 容器的文件系统是临时的。当容器被停止并删除后,容器内部所做的任何未被持久化的更改都会丢失。INFINI Console 的配置存储在其容器内部的特定目录中。为了在容器重启或重建后保留这些信息,我们必须将这些关键目录映射到宿主机(你的电脑)上的持久化存储位置。
准备工作 #
- 操作系统: macOS (本文示例)
- Docker 环境: OrbStack ( https://orbstack.dev/) 或 Docker Desktop for Mac。
请确保 Docker 服务已启动并正常运行。你可以通过在终端执行 docker --version
来验证。
docker --version
Docker version 25.0.5, build 5dc9bcc
步骤一:创建本地持久化目录和自定义 Docker 网络 #
首先,在宿主机上为 Console 和 Easysearch 创建用于存储配置、数据和日志的目录。同时,创建一个自定义 Docker 网络,以便容器之间可以通过名称进行通信。
# 1. 创建项目根目录和各个服务的持久化子目录
mkdir -p ~/infini_manual_setup/console/config ~/infini_manual_setup/console/data ~/infini_manual_setup/console/logs
mkdir -p ~/infini_manual_setup/easysearch/config ~/infini_manual_setup/easysearch/data ~/infini_manual_setup/easysearch/logs
cd ~/infini_manual_setup
# 2. 创建一个自定义的 Docker 桥接网络
docker network create infini_app_net
infini_app_net
是我们为这两个容器创建的自定义网络名称。
步骤二:提取初始配置文件 #
为了方便首次启动和后续自定义,我们需要从官方 Docker 镜像中提取默认的配置文件到我们本地创建的持久化目录中。
1. INFINI Console (1.29.6) 初始配置
根据 INFINI Console
官方 Docker 文档,其容器内配置文件位于 /config
。
docker pull infinilabs/console:1.29.6
docker run --rm \
-v $PWD/console/config:/temp_host_config \
infinilabs/console:1.29.6 \
sh -c "cp -a /config/. /temp_host_config/ && chmod -R ugo+rw /temp_host_config/"
2. INFINI Easysearch (1.13.0) 初始配置
INFINI Easysearch 镜像内部的配置文件位于 /app/easysearch/config
,并且需要初始管理员密码 INFINILabs01
。
重要提示:请务必为 Easysearch 设置安全的密码。
docker pull infinilabs/easysearch:1.13.0
docker run --rm \
-e EASYSEARCH_INITIAL_ADMIN_PASSWORD="INFINILabs01" \
-v $PWD/easysearch/config:/temp_host_config \
infinilabs/easysearch:1.13.0 \
sh -c "cp -a /app/easysearch/config/. /temp_host_config/ && chmod -R ugo+rw /temp_host_config/"
现在,你的本地 console/config
和 easysearch/config
目录应该包含了初始配置文件。
检查目录如下
tree -L 3 .
.
├── console
│ ├── config
│ │ ├── install_agent.tpl
│ │ ├── permission.json
│ │ ├── setup
│ │ └── system_config.tpl
│ ├── data
│ └── logs
└── easysearch
├── config
│ ├── admin.crt
│ ├── admin.key
│ ├── analysis-ik
│ ├── ca.crt
│ ├── ca.key
│ ├── easysearch.yml
│ ├── easysearch.yml.example
│ ├── instance.crt
│ ├── instance.key
│ ├── jvm.options
│ ├── jvm.options.d
│ ├── log4j2.properties
│ └── security
├── data
└── logs
步骤三:手动运行 INFINI Easysearch 容器 #
使用 docker run
命令启动 Easysearch,并配置端口映射、环境变量和最重要的——卷挂载。
docker run -d \
--name easysearch01 \
--network infini_app_net \
-p 9200:9200 \
-p 9300:9300 \
-e cluster.name="infini_local_cluster" \
-e node.name="easysearch-node01" \
-e cluster.initial_master_nodes="easysearch-node01" \
-e "ES_JAVA_OPTS=-Xms1g -Xmx1g" \
-e EASYSEARCH_INITIAL_ADMIN_PASSWORD="INFINILabs01" \
-v $PWD/easysearch/config:/app/easysearch/config \
-v $PWD/easysearch/data:/app/easysearch/data \
-v $PWD/easysearch/logs:/app/easysearch/logs \
--ulimit memlock=-1:-1 \
--ulimit nofile=65536:65536 \
infinilabs/easysearch:1.13.0
关键参数解释:
--name easysearch01
: 为容器指定一个名称。--network infini_app_net
: 连接到自定义网络。-p HOST_PORT:CONTAINER_PORT
: 端口映射。-e VARIABLE=VALUE
: 设置环境变量。-v $PWD/host/path:/container/path
: 实现持久化的核心。将宿主机当前工作目录 ($PWD
) 下的子目录映射到容器内的指定路径。
步骤四:手动运行 INFINI Console 容器 #
现在启动 Console 容器,同样配置网络、端口、环境变量和卷挂载。
docker run -d \
--name console01 \
--network infini_app_net \
-p 9000:9000 \
-v $PWD/console/config:/config \
-v $PWD/console/data:/data \
-v $PWD/console/logs:/log \
infinilabs/console:1.29.6
查看日志
docker logs -f easysearch01
docker logs -f console01
步骤五:验证服务和持久化 #
- 检查容器状态:
docker ps
(应能看到easysearch01
和console01
)。 - 访问 Console: 浏览器打开
http://localhost:9000
。 - 在 Console 中进行初始化配置
- 测试持久化 (重启 Console 容器):
docker stop console01
docker rm console01
# 重新运行步骤四中启动 Console 的 docker run 命令 (确保所有参数一致)
操作截图
再次访问 Console: 打开 http://localhost:9000
。如果一切正常,证明持久化成功。
步骤六:停止和清理(可选) #
- 停止容器:
docker stop console01 easysearch01
- 移除容器:
docker rm console01 easysearch01
- 移除网络:
docker network rm infini_app_net
- 移除本地持久化数据 (如果不再需要):
rm -rf ~/infini_manual_setup/console
rm -rf ~/infini_manual_setup/easysearch
总结 #
通过 docker run
命令并仔细配置卷挂载,我们成功地为 INFINI Console 和 Easysearch 构建了一个具有持久化能力的本地容器环境,有效解决了重启后配置丢失的问题。虽然手动操作参数较多,但它能让你更清晰地理解 Docker 的核心机制。
在后续的文章中,我们将探讨如何使用 Docker Compose 来简化这一过程。