docker es打包自定义镜像

说明


目录说明

本文档涉及三个工作目录:

路径 用途
/server/es/origin 存放从官方镜像复制出来的原始配置文件
/server/es/build 构建上下文目录,用于打包自定义镜像
/server/es/result 打包完成后,用于测试启动容器的空路径

一、创建 Docker 网络

sudo docker network create docker_network_es

二、从官方镜像复制配置文件到 origin 目录

1. 创建 origin 目录

sudo mkdir -p /server/es/origin

2. 启动临时容器

sudo docker run -d \
  --name elasticsearch-origin \
  --network docker_network_es \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms4g -Xmx4g" \
  elasticsearch:9.0.1

3. 复制配置文件

sudo docker cp elasticsearch-origin:/usr/share/elasticsearch/config/. /server/es/origin/

4. 停止并删除临时容器

sudo docker stop elasticsearch-origin && sudo docker rm elasticsearch-origin

三、修改配置文件参数

编辑 /server/es/origin/elasticsearch.yml:

sudo vim /server/es/origin/elasticsearch.yml

修改/新增以下参数:

# 集群名称
cluster.name: docker-cluster

# 节点名称
node.name: node-1

# 单节点模式
discovery.type: single-node

# 网络绑定
network.host: 0.0.0.0
http.port: 9200

# 关闭安全认证(本地开发环境)
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
xpack.security.transport.ssl.enabled: false

四、准备构建目录并打包镜像

1. 创建构建目录

sudo mkdir -p /server/es/build

2. 复制配置文件到构建目录

sudo cp -r /server/es/origin/* /server/es/build/
sudo cp -r /server/es/origin/.??* /server/es/build/ 2>/dev/null

3. 复制时区文件

sudo cp /etc/localtime /server/es/build/localtime
sudo cp /etc/timezone /server/es/build/timezone

4. 修改权限(构建前处理)

cd /server/es/build
sudo chown -R 1000:0 .

5. 创建 Dockerfile

sudo vim /server/es/build/Dockerfile

内容:

FROM elasticsearch:9.0.1

ENV discovery.type=single-node \
    ES_JAVA_OPTS="-Xms4g -Xmx4g -Duser.timezone=Asia/Shanghai"

COPY localtime /etc/localtime
COPY timezone  /etc/timezone
COPY . /usr/share/elasticsearch/config

EXPOSE 9200 9300

CMD ["/usr/local/bin/docker-entrypoint.sh"]

6. 构建镜像

cd /server/es/build
sudo docker build -t es-bw:9.0.1 .

五、在 result 目录用新镜像测试

1. 准备测试目录

sudo mkdir -p /server/es/result/data
cd /server/es/result

2. 启动临时容器复制配置文件

sudo docker run -d --name es-verify es-bw:9.0.1 sleep 120

sudo docker cp es-verify:/usr/share/elasticsearch/config/. ./config/

sudo docker rm -f es-verify

3. 修权限

sudo chown -R 1000:0 config
find config -type f -exec chmod 644 {} \;
find config -type d -exec chmod 755 {} \;
sudo chown -R 1000:0 data

4. 确认配置文件内容正确

cat config/elasticsearch.yml

确认包含你修改的参数。

六、启动最终容器

sudo docker run -d \
  --restart=always \
  --name elasticsearch \
  --network docker_network_es \
  -p 9200:9200 \
  -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ELASTIC_PASSWORD=YourStrongPassw0rd" \
  --privileged \
  -v $(pwd)/config:/usr/share/elasticsearch/config \
  -v $(pwd)/data:/usr/share/elasticsearch/data \
  es-bw:9.0.1

七、验证服务

sleep 25

# 查看日志
sudo docker logs elasticsearch --tail 15

# 检查集群健康
curl http://localhost:9200/_cluster/health?pretty

# 检查节点信息
curl http://localhost:9200/

八、目录结构总结

/server/es/
├── origin/             # 从官方镜像复制出的原始配置文件
│   ├── elasticsearch.yml
│   ├── jvm.options
│   ├── log4j2.properties
│   └── ...
│
├── build/              # 构建上下文(用于打包镜像)
│   ├── Dockerfile
│   ├── elasticsearch.yml      # 已修改参数
│   ├── jvm.options
│   ├── log4j2.properties
│   ├── localtime              # 时区文件
│   └── timezone               # 时区文件
│
└── result/             # 测试运行目录
    ├── config/         # 从镜像复制出的配置(可修改)
    └── data/           # ES 运行数据(自动生成)

九、关键注意事项

事项 说明
数据目录不能 COPY data 目录必须让 ES 首次启动自己初始化,否则会锁冲突
权限必须 1000:0 ES 以 uid=1000 运行,config/data 都必须是 1000:0
不要用 chmod 777 777 权限会被 ES 安全机制拒绝,必须精确 644/755 + owner 1000
配置修改在宿主机 挂载后改 /server/es/result/config/elasticsearch.yml,重启即生效
修改配置后重启 sudo docker restart elasticsearch
安全关闭 xpack.security.enabled: false 仅限本地开发,生产必须开启
posted @ 2026-09-29 13:42  Hey,Coder!  阅读(2)  评论(0)    收藏  举报