從容器建立、修改和更新Docker映象
目錄
背景
在軟體開發過程中,有時我們需要配置容器化解決方案並進行迭代式改進。在此過程中,從基本映象開始建立docker映象,並在最終確定軟體包之前通過將所有需要的元件新增到映象中來逐步改進。在這種情況下,我們從裸機映象開始,然後在過程中不斷新增其他層,然後將中間產品傳遞給其他版本。在此過程中,我們必須在修改映象後從容器中建立映象,然後將映象傳遞給進一步修改。在本文中,我們將研究建立映象,執行到容器中以及修改映象以及最終使用公共儲存庫和基於檔案的方法分發映象的過程。
除了要通過這種技術術語的意願,還需要進行以下操作。
- Docker Hub帳戶——可以在https://hub.docker.com/建立免費的註冊帳戶
- Docker——可安裝https://www.docker.com/products/docker-desktop上的Docker桌面。
- 終端(例如PowerShell)——任何終端都可以用於執行docker命令。在示例中,我們將使用PowerShell。在PowerShell中,$用於定義變數,而#用於開始註釋。
這些文章中的命令和示例是在Windows 10機器上使用Windows PowerShell和Docker版本20.10.2編寫的。
登入Docker Hub
docker啟動後,我們可以使用DockerId登入到docker。DockerID可以在驗證Docker映象的Docker登錄檔時用作使用者名稱。要求Docker客戶端連線到登錄檔以下載或上傳映象。Docker Hub是其中之一。可以在https://hub.docker.com/上建立一個帳戶。
讓我們啟動一個PowerShell或Terminal視窗並使用以下命令登入:
docker login --username benktesh #password will be entered in the prompt
執行上述命令並驗證使用者身份後,將顯示成功登入提示。
建立Docker映象
可以從頭開始建立Docker映象,或者我們可以使用公共可用映象開始。在這裡,我們將使用pull命令從Docker Hub獲得Ubuntu 18.04映象。請注意,可以從頭開始建立映象。請建立Docker映象以獲取有關建立映象的資訊。
Docker拉取Ubuntu:18.04
提取映象後,我們可以通過執行image ls命令來驗證該映象是否存在。
Docker image ls
同時,如果安裝了docker桌面,則映象列表將顯示映象的存在。
將映象作為容器執行
到目前為止,我們已經在本地下載了Ubuntu 18.04的映象。這類似於我們擁有虛擬機器但未執行的情況。要執行此映象,我們需要在容器內執行。可以使用以下命令通過以下方式將映象作為容器執行:指定容器名稱,例如基於映象”ubuntu“的ubuntu_container, 標籤為18.04,如下所示:
docker run -d --name ubuntu_container -i -t ubuntu:18.04
--name引數定義容器的名稱,而ubuntu:1804表示映象的repository:tag資訊。引數-d確保容器以分離模式執行。通過使用變數,可以使上述命令可重用。例如,在PowerShell中,我們可以為容器名稱和映象定義一個變數並使用它。
$container = “ubuntu_container” #defines variable for container name
$image = “ubuntuL18:04” #defines a variable for image label
定義了此類變數後,命令可以使用以下變數:
docker run -d --name $container -i -t $image
上面的命令返回執行一個容器並返回該容器的ID。我們可以檢查一下容器內部的內容。為此,我們可以通過執行以下操作在容器中開啟bash shell:
docker exec -it $container bash
這將開啟bash提示符,我們可以在其中執行cat /etc/os-release命令以查詢有關容器中執行的Ubuntu映象的發行資訊。結果表明,我們正在執行Ubuntu 18.04.5版(Bionic Beaver)。
我們驗證了我們的Ubuntu 1804在本地作為容器執行。發出退出命令可以使我們退出bash。
修改Docker映象
在容器執行之後,我們對其進行“填充”。例如,我們向容器添加了更多的層和應用程式以使其更有用。例如,我們可以新增一個應用程式,然後將映象與應用程式一起分發給客戶,或者將其作為增值映象提供給以後使用。為了模仿這一點,我們將修改該容器並從該容器中建立一個新映象,然後將其儲存到docker儲存庫中以進行公共分發。
為了說明起見,在當前容器中,當我們執行lsb_release -a時,響應為“未找到命令”,這意味著該容器未提供lsb_release的功能。接下來,我們將通過新增lsb_release來更新此容器,並使它可用於所有應用程式。
作為修改的一部分,我們將更新基本版本,並安裝lsb_release軟體包,並將修改標記為完成。我們將首先使用apt update更新Ubuntu。然後,我們將使用apt install lsb-core安裝lsb-core。安裝完成後,我們可以執行lsb_release -a查詢有關Ubuntu的最新資訊。
現在我們可以看到lsb_release -a可用。因此,從本質上講,我們對基本的Ubuntu映象進行了少量更新。
就像我們安裝的lsb-core一樣,應用程式可以作為容器解決方案的一部分安裝在此映象中。對於本文件,我們認為我們現在已經更新了映象,該映象可以被其他人重用,從而可以分發了。
從修改後的容器建立新映象以進行分發
到目前為止,我們已經獲得了一個從docker倉庫中提取的Ubuntu 18.04映象。我們建立了一個容器並更新了映象,並將lsb-core安裝到該容器中。我們通過執行docker映象來檢查映象的狀態,並通過執行docker ps -a來檢視容器的狀態,以分別檢視映象和容器的列表。注意ps代表程序狀態。
我們可以從當前執行的容器映象中建立一個新映象,其中包括通過執行docker commit $ container返回的已建立映象ID的sha256字串所做的更新。執行docker映象會顯示ID為返回的sha256的新建立的映象。此時,我們基於更新的容器映象建立了一個新映象。
我們可以通過提供適當的名稱來標記新建立的映象。我們將建立一個變數來儲存新名稱”ubuntu_modified:18.04”
$newImage = "ubuntu_modified:18.04"
現在,我們將承諾建立一個名為“ubuntu_modified:18:04”的新映象。
docker commit $container $newImage
該命令返回一個sha雜湊值以指示新建立的映象的ID。可以使用docker images命令檢視此映象
在列表中,我們可以看到名為“ubuntu_modified”的新建立映象,其映象ID與所標識的sha256匹配,並顯示了建立時間。請注意,對於新容器,該映象的大小大於原始映象的大小,因為我們已經為該映象安裝了新的更新。
現在,我們已經從修改後的容器中建立了一個新映象,可以刪除較舊的容器。首先,我們將停止容器,然後將其取出。
docker stop $container
docker rm $container
我們將通過執行docker ps命令驗證該容器確實已刪除。
現在,我們已經刪除了舊容器,我們將根據修改後的映象建立一個名為“modified_container”的新容器。現在,我們可以使用新建立的映象執行另一個容器。讓我們為新容器建立一個新變數
$newContainer = “modified_container”
使用以下命令啟動一個新容器:
docker run -d --name $newContainer -i -t $newImage
在新建立的容器上開啟一個bash shell。
docker exec -it $newContainer bash
執行lsb_release -acommand之後,請注意,該命令無需更新即可返回結果。執行退出將使我們擺脫困境。
和以前一樣,停止並刪除新建立的容器,因為我們不需要它。
docker stop $newContainer
docker rm $newContainer
分發Docker映象
現在,我們已經建立了容器映象,現在可以分發映象了。有兩種分配映象的方法。我們可以通過將映象推送到公共或私有儲存庫來分發它。為了說明起見,我們將使用Docker Hub儲存庫(https://hub.docker.com/repositories)放置要分發的映象。
使用儲存庫分發
首先,我們將標記映象以新增儲存庫資訊。docker.io是預設儲存庫。我們將建立一個變數$repositoryTag,其值為benktesh/ubuntu:1804,並標記最新的映象並執行docker push命令
$repositoryTag = “benktesh/ubuntu:18.04”
docker tag $newImage $repositoryTag
docker push $repositoryTag
一個簡單的docker push會將內容釋出到外部世界,因為它在儲存庫中是公開可用的,我們可以通過導航到benktesh/ubuntu(https://hub.docker.com/repository/docker/benktesh/ubuntu)。
現在,該檔案位於儲存庫中docker pull命令可用於獲取映象以供進一步使用。
通過建立Tar檔案進行分發
另一種方法是從映象或容器建立tar檔案。在這裡,我們將探討可以將docker映象另存為tar檔案的選項。
docker save -o ubuntu.tar $repositoryTag
上面的命令建立一個檔案ubuntu.tar,它帶有在變數$ repositoryTag中定義的,可以分發的標籤。可以使用以下簡單的docker命令將tar檔案載入到docker中以生成映象:
docker load -i ubuntu.tar
現在檔案已載入,可以使用了。
結論
在本文中,我們說明了如何通過使用公共儲存庫中的基礎映象建立docker映象,如何在容器中執行該映象,並通過必要的安裝和升級來更新該容器,然後根據容器化的映象修改來建立更新的映象。我們還展示瞭如何將映象推送到登錄檔進行分發,並研究了基於檔案的方法來儲存和載入映象tar檔案。
https://www.codeproject.com/Articles/5291837/Creating-Modifying-and-Updating-Docker-Image-from