好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Docker 制作鏡像Dockerfile和commit操作

Docker 制作鏡像Dockerfile和commit操作

熱門標簽:新鄉牧野400電話申請 電銷智能機器人試用 智能電銷機器人真的有用么 中國地圖標注上各個省 激光標記地圖標注 百度地圖底圖標注 企業辦理400電話收費標準 高德地圖標注足跡怎么打標 撫州市城區地圖標注

構建鏡像

構建鏡像主要有兩種方式:

使用docker commit命令從運行中的容器提交為鏡像;

使用docker build命令從 Dockerfile 構建鏡像。

首先介紹下如何從運行中的容器提交為鏡像。我依舊使用 busybox 鏡像舉例,使用以下命令創建一個名為 busybox 的容器并進入 busybox 容器。

$ docker run --rm --name=busybox -it busybox sh

執行完上面的命令后,當前窗口會啟動一個 busybox 容器并且進入容器中。在容器中,執行以下命令創建一個文件并寫入內容:

/ # touch hello.txt && echo "I love Docker. " > hello.txt

此時在容器的根目錄下,已經創建了一個 hello.txt 文件,并寫入了 "I love Docker. "。

下面,我們新打開另一個命令行窗口,運行以下命令提交鏡像:

$ docker commit busybox busybox:hello

sha256:cbc6406aaef080d1dd3087d4ea1e6c6c9915ee0ee0f5dd9e0a90b03e2215e81c

然后使用上面講到的docker image ls命令查看鏡像:

$ docker image ls busybox
REPOSITORY     TAG         IMAGE ID      CREATED       SIZE
busybox       hello        cbc6406aaef0    2 minutes ago    1.22MB
busybox       latest       018c9d7b792b    4 weeks ago     1.22MB

此時我們可以看到主機上新生成了 busybox:hello 這個鏡像。

通過對比顯然使用Dockerfile的docker build更好。docker commit的缺點如下:

需要在容器內操作麻煩,效率低。

這一點也是最重要的,其他人或者過一段時間后自己也不知道這個鏡像是怎么做出來的,但是使用Dockerfile構建的鏡像,我們看到是執行了apt-get install命令。

第二種方式是最重要也是最常用的鏡像構建方式:Dockerfile。Dockerfile 是一個包含了用戶所有構建命令的文本。通過docker build命令可以從 Dockerfile 生成鏡像。

使用 Dockerfile 構建鏡像具有以下特性:

Dockerfile 的每一行命令都會生成一個獨立的鏡像層,并且擁有唯一的 ID

Dockerfile 的命令是完全透明的,通過查看 Dockerfile 的內容,就可以知道鏡像是如何一步步構建的

Dockerfile 是純文本的,方便跟隨代碼一起存放在代碼倉庫并做版本管理

看到使用 Dockerfile 的方式構建鏡像有這么多好的特性,你是不是已經迫不及待想知道如何使用了。別著急,我們先學習下 Dockerfile 常用的指令。

Dockerfile 指令 指令簡介
FROM Dockerfile 除了注釋第一行必須是 FROM ,FROM 后面跟鏡像名稱,代表我們要基于哪個基礎鏡像構建我們的容器。
RUN RUN 后面跟一個具體的命令,類似于 Linux 命令行執行命令。
ADD 拷貝本機文件或者遠程文件到鏡像內
COPY 拷貝本機文件到鏡像內
USER 指定容器啟動的用戶
ENTRYPOINT 容器的啟動命令
CMD CMD 為 ENTRYPOINT 指令提供默認參數,也可以單獨使用 CMD 指定容器啟動參數
ENV 指定容器運行時的環境變量,格式為 key=value
ARG 定義外部變量,構建鏡像時可以使用 build-arg = 的格式傳遞參數用于構建
EXPOSE 指定容器監聽的端口,格式為 [port]/tcp 或者 [port]/udp
WORKDIR 為 Dockerfile 中跟在其后的所有 RUN、CMD、ENTRYPOINT、COPY 和 ADD 命令設置工作目錄。

看了這么多指令,感覺有點懵?別擔心,我通過一個實例讓你來熟悉它們。這是一個 Dockerfile:

FROM centos:7 
COPY nginx.repo /etc/yum.repos.d/nginx.repo 
RUN yum install -y nginx 
EXPOSE 80 
ENV HOST=mynginx 
CMD ["nginx","-g","daemon off;"]

第一行表示我要基于 centos:7 這個鏡像來構建自定義鏡像。這里需要注意,每個 Dockerfile 的第一行除了注釋都必須以 FROM 開頭。

第二行表示拷貝本地文件 nginx.repo 文件到容器內的 /etc/yum.repos.d 目錄下。這里拷貝 nginx.repo 文件是為了添加 nginx 的安裝源。

第三行表示在容器內運行yum install -y nginx命令,安裝 nginx 服務到容器內,執行完第三行命令,容器內的 nginx 已經安裝完成。

第四行聲明容器內業務(nginx)使用 80 端口對外提供服務。

第五行定義容器啟動時的環境變量 HOST=mynginx,容器啟動后可以獲取到環境變量 HOST 的值為 mynginx。

第六行定義容器的啟動命令,命令格式為 json 數組。這里設置了容器的啟動命令為 nginx ,并且添加了 nginx 的啟動參數 -g 'daemon off;' ,使得 nginx 以前臺的方式啟動。

鏡像的實現原理

其實 Docker 鏡像是由一系列鏡像層(layer)組成的,每一層代表了鏡像構建過程中的一次提交。下面以一個鏡像構建的 Dockerfile 來說明鏡像是如何分層的。

FROM busybox

COPY test /tmp/test

RUN mkdir /tmp/testdir

上面的 Dockerfile 由三步組成:

第一行基于 busybox 創建一個鏡像層;

第二行拷貝本機 test 文件到鏡像內;

第三行在 /tmp 文件夾下創建一個目錄 testdir。

這里我的 Docker 使用的是 overlay2 文件驅動,進入到/var/lib/docker/overlay2目錄下使用tree .命令查看產生的鏡像文件:

$ tree .
 
# 以下為 tree . 命令輸出內容
 
|-- 3e89b959f921227acab94f5ab4524252ae0a829ff8a3687178e3aca56d605679
 
|  |-- diff # 這一層為基礎層,對應上述 Dockerfile 第一行,包含 busybox 鏡像所有文件內容,例如 /etc,/bin,/var 等目錄
 
... 此次省略部分原始鏡像文件內容
 
|  `-- link 
 
|-- 6591d4e47eb2488e6297a0a07a2439f550cdb22845b6d2ddb1be2466ae7a9391
 
|  |-- diff  # 這一層對應上述 Dockerfile 第二行,拷貝 test 文件到 /tmp 文件夾下,因此 diff 文件夾下有了 /tmp/test 文件
 
|  |  `-- tmp
 
|  |    `-- test
 
|  |-- link
 
|  |-- lower
 
|  `-- work
 
|-- backingFsBlockDev
 
|-- bec6a018080f7b808565728dee8447b9e86b3093b16ad5e6a1ac3976528a8bb1
 
|  |-- diff # 這一層對應上述 Dockerfile 第三行,在 /tmp 文件夾下創建 testdir 文件夾,因此 diff 文件夾下有了 /tmp/testdir 文件夾
 
|  |  `-- tmp
 
|  |    `-- testdir
 
|  |-- link
 
|  |-- lower
 
|  `-- work
 
...

通過上面的目錄結構可以看到,Dockerfile 的每一行命令,都生成了一個鏡像層,每一層的 diff 夾下只存放了增量數據,如圖 2 所示。

分層的結構使得 Docker 鏡像非常輕量,每一層根據鏡像的內容都有一個唯一的 ID 值,當不同的鏡像之間有相同的鏡像層時,便可以實現不同的鏡像之間共享鏡像層的效果。

總結一下, Docker 鏡像是靜態的分層管理的文件組合,鏡像底層的實現依賴于聯合文件系統(UnionFS)。充分掌握鏡像的原理,可以幫助我們在生產實踐中構建出最優的鏡像,同時也可以幫助我們更好地理解容器和鏡像的關系。

總結

到此,相信你已經對 Docker 鏡像這一核心概念有了較深的了解,并熟悉了 Docker 鏡像的常用操作(拉取、查看、“重命名”、刪除和構建自定義鏡像)及底層實現原理。

鏡像操作命令:

拉取鏡像,使用 docker pull 命令拉取遠程倉庫的鏡像到本地 ;

重命名鏡像,使用 docker tag 命令“重命名”鏡像 ;

查看鏡像,使用 docker image ls 或 docker images 命令查看本地已經存在的鏡像;

刪除鏡像,使用 docker rmi 命令刪除無用鏡像 ;

構建鏡像,構建鏡像有兩種方式。第一種方式是使用 docker build 命令基于 Dockerfile 構建鏡像,也是我比較推薦的鏡像構建方式;第二種方式是使用 docker commit 命令基于已經運行的容器提交為鏡像。

鏡像的實現原理:

鏡像是由一系列的鏡像層(layer )組成,每一層代表了鏡像構建過程中的一次提交,當我們需要修改鏡像內的某個文件時,只需要在當前鏡像層的基礎上新建一個鏡像層,并且只存放修改過的文件內容。分層結構使得鏡像間共享鏡像層變得非常簡單和方便。

以上這篇Docker 制作鏡像Dockerfile和commit操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

標簽:南通 邯鄲 臨汾 忻州 延安 辛集 海西 西安

巨人網絡通訊聲明:本文標題《Docker 制作鏡像Dockerfile和commit操作》,本文關鍵詞  Docker,制作,鏡像,Dockerfile,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Docker 制作鏡像Dockerfile和commit操作》相關的同類信息!
  • 本頁收集關于Docker 制作鏡像Dockerfile和commit操作的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产高清视频青青青在线| 国产成本人三级在线观看网站| 三级视频网站在线观看| 播放久久国产乱子伦精品| GOGOGO高清在线播放免费| 浴室狂欢未删减完整版| 美女扒开下面无遮挡免费视频| 亚洲娇小被黑人撑爆小说| 在公车上拨开内裤进入| 国产自啪啪| 精品一区二区三区水蜜桃| 男人亲吻女人私密视频| 夫妻合作换灯泡妻子全程驮着丈夫| 一男一女一级毛片视频| 色戒mp4| 女性被深耕后的表现| 啊轻点灬大ji巴太粗太长啊| 97国语精品自产拍在线观看一| 女人的隐私秘?祼??酒店| 大香萑| 女主人裙里的舌奴| 黄色一级大片| 亚洲精品无码成人AⅤ电影荒村| 兔兔达达兔影视| 被两个男人3p爽到高潮了电影| 久久综合网丁香五月嘟嘟韩剧网 | 国产精品毛片一区| 欧美人与动zozo欧美人z0| Xⅹⅹ欧美精品性受C0m| 亚洲 欧美 国产 综合美91| 国产高清在线精品一区免费97| 绝桥智多星| 欧美寡妇性猛交XXX无码漫画| 国产高清在线精品一区二区app | 77777人妻少妇毛片A片| 1024人妻一区二区三区高清| 皇上和太子一起c太子妃| 女同学用脚撩我的小jⅠji | 国产在线麻豆秘?二次苍井空| 男女超爽视频| 朋友夫妇交换做爰HD|