如何修改docker官方鏡像內(nèi)部內(nèi)容并重新build鏡像
應(yīng)用場景
在某些情況下,我們可能需要修改官方的docker鏡像,不過,首先需要搞明白,鏡像:image 和容器:container 的區(qū)別:
- 鏡像image:類似于java中的類
- 容器container:類似于java中的對象
因此,我們往往從docker hub下載官方鏡像,然后,把鏡像部署到服務(wù)器,然后,我們真正用到該服務(wù)的時候,往往是根據(jù)該鏡像生成一個容器,然后運行容器。
和java中類和對象的概念很像,鏡像就是類,根據(jù)類生成對象后,真正使用的是對象,對應(yīng)docker就是容器。
修改官方docker鏡像
首先,明白了前面關(guān)于鏡像和容器的概念,我們就會明白,我們需要修改的是鏡像,如果我們只是在容器運行時做改動,則不會影響到鏡像。
下面就以我的一個例子來詳細說一下:
我的需求是更新matomo鏡像中的Apache http server版本
1.下載鏡像
首先,下載鏡像,可以從docker hub或者從自己的服務(wù)器下載。
我本來想著,既然更新的是matomo中的Apache http server版本,那我直接把matomo更新到最新不就好了?
可惜,結(jié)果不如我所想,最新的matomo中,Apache仍然版本過低,所以,只能修改官方鏡像了
2.啟動容器
查找所有鏡像:
docker images
找到你需要修改的鏡像,保存下鏡像id
然后,進入你要修改的鏡像(其實就是運行該鏡像的容器):
docker run -it ‘鏡像id' /bin/sh
此時,你會進入容器內(nèi)部的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/
說明權(quán)限問題,有可能你不知道密碼,所以,此時,保持當(dāng)前窗口中容器的運行,不要動,再打開一個終端。
在新的終端中,輸入
docker ps -a
根據(jù)鏡像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(倉庫:標簽)
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker鏡像的導(dǎo)入和導(dǎo)出的實現(xiàn)
這篇文章主要介紹了docker鏡像的導(dǎo)入和導(dǎo)出的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01詳解Docker下搭建Jenkins構(gòu)建環(huán)境
這篇文章主要介紹了詳解Docker下搭建Jenkins構(gòu)建環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05Docker?link實現(xiàn)容器互聯(lián)的方式
通過link方式創(chuàng)建容器,然后我們可以使用被link容器的別名進行訪問。本文重點給大家介紹Docker?link實現(xiàn)容器互聯(lián)的方式,感興趣的朋友一起看看吧2021-12-12Docker Swarm結(jié)合Docker Compose部署集群的實現(xiàn)
本文主要介紹了Docker Swarm結(jié)合Docker Compose部署集群的實現(xiàn),通過部署和配置幫助讀者更好地理解并應(yīng)用這些工具,感興趣的可以了解一下2023-12-12