Docker(十一)-Docker commit創建鏡像


創建鏡像有很多方法,用戶可以從 Docker Hub 獲取已有鏡像並更新,也可以利用本地文件系統創建一個。

修改已有的鏡像


查看已有的鏡像:

$ sudo docker images
REPOSITORY  TAG       IMAGE ID            CREATED             SIZE
ubuntu      latest    2a4cca5ac898 9 days ago 111MB 

下面進入到ubuntu容器中:

$ sudo docker run -t -i ubuntu /bin/bash
root@543a324ea841:/# 

注意: 記住容器的 ID,稍后還會用到。

在容器中添加 添加 Python3 開發環境。

root@543a324ea841:/# apt update // 更新軟件源 root@543a324ea841:/# apt install python3 // 安裝 python3 root@543a324ea841:/# exit // 退出 Ubuntu 容器 exit 

當結束后,我們使用 exit 來退出,現在我們的容器已經被我們改變了,使用 docker commit 命令來提交更新后的副本。

$ sudo docker commit -m "Add python3" -a "Docker Newbee" 543a324ea841 ubuntu sha256:7c0cf1cc5ef36a86252e94eea39c645f53be7dfda87bdcded6d2999917190ffd 
  • -m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;

  • -a 可以指定更新的用戶信息;

之后是用來創建鏡像的容器的 ID;最后指定目標鏡像的倉庫名。 創建成功后會返回這個鏡像的ID信息。

查看鏡像:

$ sudo docker images

REPOSITORY   TAG         IMAGE ID            CREATED              SIZE
ubuntu       latest      7c0cf1cc5ef3        About a minute ago   111MB
ubuntu       <none> 2a4cca5ac898 9 days ago 111MB 

之后,可以使用新的鏡像來啟動容器

$ sudo docker run -t -i ubuntu:latest /bin/bash root@8e40ef590fb1:/# 

利用 Dockerfile 來創建鏡像


使用 docker commit 來擴展一個鏡像比較簡單,但是不方便在一個團隊中分享。我們可以使用 docker build 來創建一個新的鏡像。為此,首先需要創建一個Dockerfile,包含一些如何創建鏡像的指令。

新建一個目錄和一個 Dockerfile

$ mkdir py
$ cd py
py$ touch Dockerfile

Dockerfile 中每一條指令都創建鏡像的一層,例如:

$ vim Dockerfile

# this is a comment FROM ubuntu:16.04 MAINTAINER Docker py <pyuser@docker.com> RUN apt-get install -y python3 RUN apt-get install -y python3-pip RUN python3 -m pip install selenium 

Dockerfile 基本的語法是

  • 使用 # 來注釋
  • FROM 指令告訴 Docker 使用哪個鏡像作為基礎
  • 接着是維護者的信息
  • RUN 開頭的指令會在創建中運行,比如安裝一個軟件包,在這里使用apt 來安裝了一些軟件

編寫完成 Dockerfile 后可以使用 docker build 來生成鏡像。

sudo docker build -f Dockerfile -t ubuntu-py:v1 . 
  • -t標記來添加 tag,指定新的鏡像的用戶信息。

  • “.” 是 Dockerfile 所在的路徑(當前目錄),也可以替換為一個具體的 Dockerfile 的路徑

可以看到build 進程在執行操作。它要做的第一件事情就是上傳這個 Dockerfile 內容,因為所有的操作都要依據 Dockerfile 來進行。 然后, Dockfile 中的指令被一條一條的執行。每一步都創建了一個新的容器,在容器中執行指令並提交修改(就跟之前介紹過的docker commit一樣)。當所有的指令都執行完畢之后,返回了最終的鏡像 id。所有的中間步驟所產生的容器都被刪除和清理了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM