最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

docker使用Dockerfile構(gòu)建鏡像的方法

 更新時間:2018年12月03日 10:29:21   作者:蝸牛的博客  
這篇文章主要介紹了docker使用Dockerfile構(gòu)建鏡像的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

構(gòu)建鏡像

前面我們使用各種鏡像進行測試演示,很多情況下我們是需要自己的鏡像,滿足自己業(yè)務(wù)需要的鏡像,這就需要我們能夠定制自己需要的鏡像,構(gòu)建 Docker 鏡像有以下兩種方法。

  • 使用 docker commit 命令。
  • 使用 docker build 命令和 Dockerfile 構(gòu)建文件。

現(xiàn)在我們不推薦使用 docker commit 命令,而應(yīng)該使用更靈活、更強大的 Dockerfile 來構(gòu)建 Docker 鏡像。

1、使用 commit 命令構(gòu)建

docker commit 命令是創(chuàng)建新鏡像最直觀的方法,其過程包含三個步驟:

  • 運行容器;
  • 修改容器;
  • 將容器保存為新的鏡像。

先從創(chuàng)建一個新容器開始,這個容器我們就使用很常見的 ubuntu 鏡像,操作步驟如下

1.1 運行一個要進行修改的容器

root@ubuntu:~# docker run -ti ubuntu /bin/bash
root@733a4b080491:/#

1.2 安裝 Apache 軟件包

root@733a4b080491:/# apt-get update
... ...
root@733a4b080491:/# apt-get install -y apache2
... ...

我們啟動了一個容器,并在里面安裝了 Apache 。我們將會拿這個容器作為一個 Web 服務(wù)器來運行,我們需要把它保存下來,這樣就不用每次都運行這個步驟了。

1.3 提交定制容器

root@ubuntu:~# docker ps -a
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS      PORTS    NAMES
733a4b080491  ubuntu    "/bin/bash"   11 minutes ago  Exited (0) 5 seconds ago      suspicious_mestorf
root@ubuntu:~# docker commit 733a4b080491 wzlinux/ubuntu_with_apache
sha256:902ac2c87147fefc5b70c741ce9550dcda426cea9f824f442d5cc2744bdc90ae
root@ubuntu:~# docker images
REPOSITORY     TAG     IMAGE ID   CREATED    SIZE
wzlinux/ubuntu_with_apache latest    902ac2c87147  33 seconds ago  261MB
ubuntu      latest    20c44cd7596f  10 days ago   123MB

可以看到,我們使用 docker commit 提交了修改過的容器,從 size 上可以看到鏡像因為安裝軟件而變大了,docker commit 提交的只是創(chuàng)建容器的鏡像與容器的當前狀態(tài)之間有差異的部分,這使得該更新非常輕量。

以上演示了如何用 docker commit 創(chuàng)建新鏡像。然而,Docker 并不建議用戶通過這種方式構(gòu)建鏡像。因為這是一種手工創(chuàng)建鏡像的方式,容易出錯,效率低且可重復(fù)性弱。比如要在 debian base 鏡像中也加入 apache,還得重復(fù)前面的所有步驟。更重要的:使用者并不知道鏡像是如何創(chuàng)建出來的,里面是否有惡意程序。也就是說無法對鏡像進行審計,存在安全隱患。

不過,為了對 Docker 有一個更全面的了解,我們還是要了解一下如何使用 docker commit 構(gòu)建 Docker 鏡像。因為即便是用 Dockerfile(推薦方法)構(gòu)建鏡像,底層也 docker commit 一層一層構(gòu)建新鏡像的。學習 docker commit 能夠幫助我們更加深入地理解構(gòu)建過程和鏡像的分層結(jié)構(gòu)。

2、使用 Dockerfile 構(gòu)建

Dockerfile 使用基本的基于DSL(Domain Specific Language)語法的指令來構(gòu)建一個 Docker 鏡像,我們推薦使用 Dockerfile 方法來代替 docker commit,因為通過前者構(gòu)建鏡像更具備可重復(fù)性、透明性以及冪等性。

一旦有了 Dockerfile,我們就可以使用 docker build 命令基于該 Dockerfile 中的指令構(gòu)建一個新的鏡像。

2.1 我們的第一個 Dockerfile

用 Dockerfile 創(chuàng)建上面的 ubuntu_with_apache,內(nèi)容如下。

# Version 0.0.1
FROM ubuntu
RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list
RUN apt-get -y update && apt-get -y install apache2
EXPOSE 80

執(zhí)行 docker build 命令時,Dockerfile 中的所有指令都會被執(zhí)行并且提交,并且在該命令成功結(jié)束后返回一個新鏡像。

root@ubuntu:~/sample# docker build -t ubuntu_with_apache_dockerfile .  ①
Sending build context to Docker daemon 6.144kB  ②
Step 1/5 : FROM ubuntu   ③
 ---> 20c44cd7596f
Step 2/5 : RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list
 ---> Running in bac6dc3b900f
 ---> c66ad94ad8a4
Removing intermediate container bac6dc3b900f
Step 3/5 : RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list
 ---> Running in 5158558b6403
 ---> 0a4c480147c5
Removing intermediate container 5158558b6403
Step 4/5 : RUN apt-get -y update && apt-get -y install apache2    ④
 ---> Running in f547ce7a1b39   ⑤
 ……
 ……
 ---> 118bde35120a   ⑥
Removing intermediate container f547ce7a1b39  ⑦
Step 5/5 : EXPOSE 80
 ---> Running in e546786de05b
 ---> f55d7b07365b
Removing intermediate container e546786de05b
Successfully built f55d7b07365b   ⑧
Successfully tagged ubuntu_with_apache_dockerfile:latest


① 運行 docker build 命令,-t 將新鏡像命名為 ubuntu-with-apache-dockerfile,命令末尾的 . 指明 build context 為當前目錄。Docker 默認會從 build context 中查找 Dockerfile 文件,我們也可以通過 -f 參數(shù)指定 Dockerfile 的位置。

② 從這步開始就是鏡像真正的構(gòu)建過程。 首先 Docker 將 build context 中的所有文件發(fā)送給 Docker daemon。build context 為鏡像構(gòu)建提供所需要的文件或目錄。

Dockerfile 中的 ADD、COPY 等命令可以將 build context 中的文件添加到鏡像。此例中,build context 為當前目錄 /sample,該目錄下的所有文件和子目錄都會被發(fā)送給 Docker daemon。

所以,使用 build context 就得小心了,不要將多余文件放到 build context,特別不要把 /、/usr 作為 build context,否則構(gòu)建過程會相當緩慢甚至失敗。

③ Step 1:執(zhí)行 FROM,將 ubuntu 作為 base 鏡像。ubuntu 鏡像 ID 為 452a96d81c30。

④ Step 4:執(zhí)行 RUN,安裝 apache,具體步驟為 ⑤ ~ ⑬。

⑤ 啟動 ID 為 e38bc83df8b1 的臨時容器,在容器中通過 apt-get 安裝 apache。

⑥ 安裝成功后,將容器保存為鏡像,其 ID 為 fbc9af08328d。這一步底層使用的是類似 docker commit 的命令。

⑦ 刪除臨時容器 02a4f3243dda。

⑧ 鏡像構(gòu)建成功。

通過 docker images 查看鏡像信息。

root@ubuntu:~/sample# docker images
REPOSITORY      TAG     IMAGE ID   CREATED    SIZE
ubuntu_with_apache_dockerfile latest    f55d7b07365b  27 minutes ago  261MB
wzlinux/ubuntu_with_apache  latest    902ac2c87147  About an hour ago 261MB
ubuntu       latest    20c44cd7596f  10 days ago   123MB

2.2 查看鏡像分成結(jié)構(gòu)

ubuntu_with_apache_dockerfile 是通過在 base 鏡像的頂部添加幾個新的鏡像層而得到的。

上圖是從原文中拷貝的,下圖是在我的電腦上面實驗得到的數(shù)據(jù),IMAGE的ID不同,但是其他都是相同的。


查看我本機的Ubuntu的IMAGE歷史如下:


從輸出的結(jié)果可以看出來,每個命令都會生成一個鏡像層。

docker history 會顯示鏡像的構(gòu)建歷史,也就是 Dockerfile 的執(zhí)行過程。

ubuntu_with_apache_dockerfile 與 ubuntu 鏡像相比,確實只是多了幾層,Dockerfile 中的每個指令都會創(chuàng)建一層,docker history 也向我們展示了鏡像的分層結(jié)構(gòu),每一層由上至下排列。

2.3 鏡像的緩存特性

由于每一步的構(gòu)建過程都會將結(jié)果提交為鏡像,所以 Docker 的構(gòu)建鏡像過程就顯得非常聰明。它會將之前的鏡像層看作緩存。

比如我們把 EXPOSE 80 改為 EXPOSE 8080。

root@ubuntu:~/sample# docker build -t ubuntu_with_apache_8080 .   
Sending build context to Docker daemon 6.144kB
Step 1/5 : FROM ubuntu 
---> 20c44cd7596f
Step 2/5 : RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g'  /etc/apt/sources.list
 ---> Using cache ---> c66ad94ad8a4Step 3/5 : RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list 
---> Using cache 
---> 0a4c480147c5
Step 4/5 : RUN apt-get -y update && apt-get -y install apache2 
---> Using cache 
---> 118bde35120a
Step 5/5 : EXPOSE 8080 
---> Running in c89f8210c56a 
---> ac88967e578e
Removing intermediate container c89f8210c56a
Successfully built ac88967e578e
Successfully tagged ubuntu_with_apache_8080:latest

我們可以看到,之前的指令都是一樣的,所以 docker 直接利用之前的緩存,只構(gòu)建我們更改的指令,新的鏡像層如下。


如果我們希望在構(gòu)建鏡像時不使用緩存,可以在 docker build 命令中加上 --no-cache 參數(shù)。

Dockerfile 中每一個指令都會創(chuàng)建一個鏡像層,上層是依賴于下層的。無論什么時候,只要某一層發(fā)生變化,其上面所有層的緩存都會失效。也就是說,如果我們改變 Dockerfile 指令的執(zhí)行順序,或者修改或添加指令,都會使緩存失效。比如我們在前面添加指令 MAINTAINER wzlinux "admin@wzlinux.com"。如下:

# Version 0.0.1
FROM ubuntu
MAINTAINER wzlinux "admin@wzlinux.com"
RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list
RUN apt-get -y update && apt-get -y install apache2
EXPOSE 80

然后使用docker進行構(gòu)建,查看其過程。

root@ubuntu:~/sample# docker build -t ubuntu_with_apache_author .

Sending build context to Docker daemon 6.144kB
Step 1/6 : FROM ubuntu
 ---> 20c44cd7596f
Step 2/6 : MAINTAINER wzlinux "admin@wzlinux.com" 
---> Running in 637bb3457407 
---> 829b24531d69
Removing intermediate container 637bb3457407
Step 3/6 : RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list 
---> Running in 416ae8aefb61 
---> 84643fe8447a
Removing intermediate container 416ae8aefb61
Step 4/6 : RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list 
---> Running in 58d8375fd5c3 
---> 1cb5776982d3
Removing intermediate container 58d8375fd5c3
Step 5/6 : RUN apt-get -y update && apt-get -y install apache2 
---> Running in 0514a7d04814
 ……
 ……
Processing triggers for sgml-base (1.26+nmu4ubuntu1)
 ... 
---> 30eb21527fee
Removing intermediate container 0514a7d04814
Step 6/6 : EXPOSE 80 
---> Running in 476ca5f98886 
---> 30672998f3d0
Removing intermediate container 476ca5f98886
Successfully built 30672998f3d0
Successfully tagged ubuntu_with_apache_author:latest


從輸出的結(jié)果生成了很多新的鏡像層,緩存已經(jīng)失效。

2.4 調(diào)試 Dockerfile

包括 Dockerfile 在內(nèi)的任何腳本和程序都會出錯。有錯并不可怕,但必須有辦法排查,那我們測試一下在構(gòu)建的過程中指令出現(xiàn)錯誤怎么辦,比如我們把第二個sed指令寫錯了,寫錯了sd。

# Version 0.0.1
FROM ubuntu
MAINTAINER wzlinux "admin@wzlinux.com"
RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list
RUN sd -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list
RUN apt-get -y update && apt-get -y install apache2
EXPOSE 80

執(zhí)行 docker build,如下。


Dockerfile 在執(zhí)行第四步 RUN 指令時失敗。我們可以利用第三步創(chuàng)建的鏡像 84643fe8447a 進行調(diào)試,方式是通過 docker run -it 啟動鏡像的一個容器。

root@ubuntu:~/sample# docker run -ti 84643fe8447a /bin/bash
root@422ecce78664:/# sd
bash: sd: command not found

其實我們肯定不會傻到連 sd 不存在也不知道,我這里只是作為一個例子,其他更難的排錯方法我們就使用這種方式。

2.5 Dockerfile 指令

FROM
指定 base 鏡像。

MAINTAINER
設(shè)置鏡像的作者,可以是任意字符串。

COPY
將文件從 build context 復(fù)制到鏡像。
COPY 支持兩種形式:
COPY src destCOPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目錄。

ADD
與 COPY 類似,從 build context 復(fù)制文件到鏡像。不同的是,如果 src 是歸檔文件(tar, zip, tgz, xz 等),文件會被自動解壓到 dest。

ENV
設(shè)置環(huán)境變量,環(huán)境變量可被后面的指令使用。例如:

ENV MY_VERSION 1.3RUN apt-get install -y mypackage=$MY_VERSION

EXPOSE
指定容器中的進程會監(jiān)聽某個端口,Docker 可以將該端口暴露出來。

VOLUME
將文件或目錄聲明為 volume。

WORKDIR
為后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令設(shè)置鏡像中的當前工作目錄。

RUN
在容器中運行指定的命令。

CMD
容器啟動時運行指定的命令。
Dockerfile 中可以有多個 CMD 指令,但只有最后一個生效。CMD 可以被 docker run 之后的參數(shù)替換。

ENTRYPOINT
設(shè)置容器啟動時運行的命令。
Dockerfile 中可以有多個 ENTRYPOINT 指令,但只有最后一個生效。CMD 或 docker run 之后的參數(shù)會被當做參數(shù)傳遞給 ENTRYPOINT。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Docker容器實現(xiàn)MySQL多源復(fù)制場景分析

    Docker容器實現(xiàn)MySQL多源復(fù)制場景分析

    這篇文章主要介紹了Docker容器實現(xiàn)MySQL多源復(fù)制,通過本文學習可以掌握多源復(fù)制的好處,通過使用場景分析給大家介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • mysql8.4.0實現(xiàn)主從復(fù)制部署

    mysql8.4.0實現(xiàn)主從復(fù)制部署

    主從復(fù)制是 MySQL 中一種用于實現(xiàn)數(shù)據(jù)冗余、提高可用性和性能的重要機制,本文主要介紹了mysql8.4.0實現(xiàn)主從復(fù)制部署,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 如何使用Docker Desktop部署GitLab

    如何使用Docker Desktop部署GitLab

    本文介紹了如何使用Docker Desktop在Windows系統(tǒng)上部署GitLab,包括環(huán)境準備、安裝Docker、配置GitLab鏡像、容器配置等步驟,感興趣的朋友一起看看吧
    2025-03-03
  • Docker的基本命令使用筆記

    Docker的基本命令使用筆記

    這篇文章主要介紹了Docker的基本命令使用筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Docker修改容器內(nèi)部文件的3種簡單方法

    Docker修改容器內(nèi)部文件的3種簡單方法

    docker容器化技術(shù)在打包生產(chǎn)和發(fā)布中占據(jù)著更高的地位,其高效簡便很有亮點,下面這篇文章主要給大家介紹了關(guān)于Docker修改容器內(nèi)部文件的3種簡單方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-05-05
  • docker中鏡像映射和端口映射的實現(xiàn)步驟

    docker中鏡像映射和端口映射的實現(xiàn)步驟

    本文介紹了在Docker中進行鏡像映射和端口映射,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11
  • docker將本地鏡像發(fā)布到阿里云的實現(xiàn)方法

    docker將本地鏡像發(fā)布到阿里云的實現(xiàn)方法

    本文主要介紹了docker將本地鏡像發(fā)布到阿里云的實現(xiàn)方法,文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • docker的一些基本指令

    docker的一些基本指令

    這篇文章主要介紹了docker的一些常用操作,幫助大家更好的理解和學習使用docker,感興趣的朋友可以了解下
    2021-04-04
  • 手工制作docker鏡像-包含多個服務(wù)ssh+nginx

    手工制作docker鏡像-包含多個服務(wù)ssh+nginx

    這篇文章主要介紹了手工制作docker鏡像-包含多個服務(wù)ssh+nginx,需要的朋友可以參考下
    2024-07-07
  • Docker命令中的各種參數(shù)使用(run、v、rm、-w、-u、-e)

    Docker命令中的各種參數(shù)使用(run、v、rm、-w、-u、-e)

    本文主要介紹了Docker命令中的各種參數(shù)使用(run、v、rm、-w、-u、-e),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06

最新評論

上林县| 霍林郭勒市| 滕州市| 新营市| 正阳县| 铁力市| 玉环县| 泸水县| 江孜县| 沙雅县| 雷山县| 大埔县| 鹤庆县| 濮阳县| 若尔盖县| 昌都县| 航空| 安平县| 石狮市| 蒙城县| 出国| 溆浦县| 镇江市| 唐山市| 广安市| 浦东新区| 门源| 花莲县| 大余县| 长子县| 长治县| 宁津县| 卢龙县| 临清市| 横山县| 徐州市| 江口县| 中阳县| 罗山县| 禄丰县| 镇宁|