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