Docker 容器修改--以修改 Sense 镜像为例
通过学习本文可以了解到docker容器基础操作命令、修改容器中信息和容器打包镜像。本文就以修改镜像
s12v/sense
为例进行演示。
说明:
s12v/sense
镜像是无需配置
ElasticSearch
地址的客户端,通过其可以连接到任意
ElasticSearch
单机或集群,相对于
kibana
有着独特的优点,但在未进行处理时连接 ElasticSearch 高版本时会出现问题,具体原因是在发生 http 请求时请求头设置不正确,需要修改文件
/opt/kibana/optimize/bundles/commons.bundle.js
。接下来将一步一步完成修改。
- 拉取镜像
# 拉取镜像
sudo docker pull s12v/sense
- 启动镜像
# 启动
sudo docker run --name sense -p 15601:5601 -d s12v/sense
- 访问是否启动正常
启动后等待一小会,访问地址:
http://localhost:15601/app/sense
,我们可以看到界面:

说明我们启动成功了。现在在
Server
输入 es 地址,如下图所示:
点击 “执行”后可看到右侧报错
Content-Type header [application/x-www-form-urlencoded; charset=UTF-8] is not supported
从中可以看到,容器以正常启动,但使用其进行 es 操作时会报错,综上所述,在不进行任何修改的
s12v/sense
镜像连接高版本 es 时是会报不支持的请求头错误。
查看请求信息:
从上我们可知道
commons.bundle.js
存在问题,接下来需要我们进行修改 js 文件。
- 修改容器
首先进入容器并搜索文件
commons.bundle.js
# 进入docker内 容器id
sudo docker exec -it e3ad9ff8e54c /bin/bash
# 搜索文件
find / -name commons.bundle.js
结果如下:
[[email protected] /]# sudo docker exec -it e3ad9ff8e54c /bin/bash
[email protected]:/# find / -name commons.bundle.js
/opt/kibana/optimize/bundles/commons.bundle.js
[email protected]:/#
从中我们可以知道该文件路径为:
/opt/kibana/optimize/bundles/commons.bundle.js
,我们继续将文件复制到本机并修改。
# 从docker复制文件到本机 容器id
sudo docker cp e3ad9ff8e54c:/opt/kibana/optimize/bundles/commons.bundle.js /
修改点:
将
application/x-www-form-urlencoded
改成
application/json
,如下图所示
接着将修改好的文件复制到容器中
# 停止容器
sudo docker stop sense
# 从本机复制文件到docker 容器id
sudo docker cp /commons.bundle.js e3ad9ff8e54c:/opt/kibana/optimize/bundles/commons.bundle.js
# 启动容器
sudo docker start sense
等待一下会再次执行上一步骤发现可以查询了,如下图所示,如果没有解决或展示的与图不符,请清空浏览器缓存。
修改成功后,为了方便以后使用,可以将修改后的容器保存成镜像,下次就直接 load 就行,无需再次修改。
- 将容器打包成镜像保存
将修改的 sense 容器打包成新镜像
# 创建一个新镜像
sudo docker commit e3ad9ff8e54c oy/s12v/sense
#将镜像保存成 tar 归档文件
sudo docker save -o /oy-s12v-sense.tar oy/s12v/sense
- 镜像 tar 文件验证
首先使用命令
sudo docker rmi oy/s12v/sense
将原镜像删除;接着
可以运行命令
docker load -i /oy-s12v-sense.tar
加载到 docker;紧接着使用命令
sudo docker run --name sense2 -p 25601:5601 -d oy/s12v/sense
启动镜像;最后访问地址:
http://localhost:25601/app/sense
进行查询,如图所示:
说明容器修改成功,保存成新镜像成功!!!
- 问题记录
在第二步启动时报错如下:
docker: Error response from daemon: driver failed programming external connectivity on endpoint sense (443e930dd31e504a24c05e0d36f1d2c2a0c90cbd23982b66d8184c346d89251d): (COMMAND_FAILED: '/usr/sbin/iptables -w2 -t nat -A DOCKER -p tcp -d 0/0 --dport 15601 -j DNAT --to-destination 172.17.0.3:5601 ! -i docker0' failed: iptables: No chain/target/match by that name.
大体意思是docker服务定义的自定义链DOCKER由于某种原因被清掉了,重启docker服务及可重新生成自定义链DOCKER,通过运行命令
sudo iptables -L -n
可查看 docker 链。
解决:运行命令:
sudo systemctl restart docker