如何修改docker官方鏡像內部內容并重新build鏡像
應用場景
在某些情況下,我們可能需要修改官方的docker鏡像,不過,首先需要搞明白,鏡像:image 和容器:container 的區(qū)別:
- 鏡像image:類似于java中的類
- 容器container:類似于java中的對象
因此,我們往往從docker hub下載官方鏡像,然后,把鏡像部署到服務器,然后,我們真正用到該服務的時候,往往是根據該鏡像生成一個容器,然后運行容器。
和java中類和對象的概念很像,鏡像就是類,根據類生成對象后,真正使用的是對象,對應docker就是容器。
修改官方docker鏡像
首先,明白了前面關于鏡像和容器的概念,我們就會明白,我們需要修改的是鏡像,如果我們只是在容器運行時做改動,則不會影響到鏡像。
下面就以我的一個例子來詳細說一下:
我的需求是更新matomo鏡像中的Apache http server版本
1.下載鏡像
首先,下載鏡像,可以從docker hub或者從自己的服務器下載。
我本來想著,既然更新的是matomo中的Apache http server版本,那我直接把matomo更新到最新不就好了?
可惜,結果不如我所想,最新的matomo中,Apache仍然版本過低,所以,只能修改官方鏡像了
2.啟動容器
查找所有鏡像:
docker images
找到你需要修改的鏡像,保存下鏡像id
然后,進入你要修改的鏡像(其實就是運行該鏡像的容器):
docker run -it ‘鏡像id' /bin/sh
此時,你會進入容器內部的shell命令行,其實就是一個微型的Linux系統(tǒng),然后就可以用Linux命令操作該容器,我在這里是升級了Apache版本:
你可以在這里做你需要的改動
apt-get update //獲取更新信息 apt-get upgrade //更新版本
如果發(fā)生以下錯誤
$ apt-get update
Reading package lists... Done
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
說明權限問題,有可能你不知道密碼,所以,此時,保持當前窗口中容器的運行,不要動,再打開一個終端。
在新的終端中,輸入
docker ps -a
根據鏡像id,找到你在另一個終端中正在運行的容器
注意:
為什么要掛著另一個終端,就是因為,有的容器如果退出,就找不到容器id了,下面的命令需要用到容器id
docker exec -u root -it <container_id> /bin/bash
此時就通過管理員賬戶登陸進了容器,然后在依次執(zhí)行上述的apt-get update和apt-get upgrade就行了
3.生成新鏡像
- 修改后,先執(zhí)行exit退出容器
- 然后查找剛才運行的容器信息:
docker ps -a
用docker commit命令從容器打包成鏡像:
其中,備注和作者其實不重要,隨便寫,容器id就是你在上一步查找容器信息時獲取的容器id,找你剛才修改的容器,鏡像repository就是你打包生成的新鏡像的repository
docker commit -m “備注” -a “作者” 容器id 鏡像repository
最后,再次docker images就能看到你剛剛生成的新鏡像了
最后加個小功能,如何修改鏡像的tag:
docker tag IMAGEID(鏡像id) REPOSITORY:TAG(倉庫:標簽)
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Docker Swarm結合Docker Compose部署集群的實現
本文主要介紹了Docker Swarm結合Docker Compose部署集群的實現,通過部署和配置幫助讀者更好地理解并應用這些工具,感興趣的可以了解一下2023-12-12

