首頁> 運維> Docker> 主體

建立Docker映像有幾種方式

青灯夜游
發布: 2022-02-23 18:22:36
原創
39534 人瀏覽過

建立Docker映像有2種方式:1.使用「docker commit」指令是基於已有容器手動建置映像;2、使用Dockerfile自動建置映像,Docker程式會透過讀取Dockerfile建置檔案中的指令自動產生鏡像。

建立Docker映像有幾種方式

本教學操作環境:linux5.9.8系統、docker-1.13.1版、Dell G3電腦。

有時候從Docker映像倉庫下載的映像不能滿足要求,我們可以基於一個基礎映像建立一個自己的映像.

映像建置介紹

在什麼情況下我們需要自己建造鏡像那?

(1)當我們找不到現有的映像,例如自己開發的應用程式

(2)需要在映像中加入特定的功能

docker構建映像有兩種方式:docker commit指令與Dockerfile建置檔案

docker commit建置映像

基於已有容器建置映像主要是透過docker commit指令來建立新的映像。

dockercommit建置進行主要有三個步驟:

  • 運行容器
  • #修改容器
  • 將容器儲存為新的映像

例如在centos鏡像中安裝vim編輯器並存為新的鏡像

(1)運行容器

[root@ken1 docker]# docker run -it centos Unable to find image 'centos:latest' locally latest: Pulling from library/centos a02a4930cb5d: Pull complete Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426 Status: Downloaded newer image for centos:latest
登入後複製

(2)安裝vim編輯器

#v編輯器確認沒有安裝

[root@69f501e858a6 /]# vim bash: vim: command not found
登入後複製

進行安裝

[root@69f501e858a6 /]# yum install vim -y
登入後複製

(3)儲存為新得鏡像

#首先查看目前執行的鏡像

[root@ken1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 69f501e858a6 centos "/bin/bash" 2 minutes ago Up 2 minutes quizzical_torvalds
登入後複製

使用commit存為新的鏡像

[root@ken1 ~]# docker commit 69f501e858a6 centos-vim sha256:42083b89a179368bc29a8f40d14f8824990183c8e4b28fd84411d440c26342e5
登入後複製

69f501e858a6是運行容器的ID使用name下面的名稱也行
centos-vim是新鏡像的名字

#查看一下是否有了centos-vim鏡像

重新啟動新的鏡像,驗證是否可以使用vim編輯器

可以發現新的映像可以使用vim編輯器了

[root@ken1 ~]# docker run -it centos-vim [root@61d090898bad /]# vim [root@61d090898bad /]# vim test
登入後複製

上面示範如何使用commit建立新的映像,但是docker並不建議使用這種方式建立映像,原因如下:

  • 這是一種手工建立映像的方式,容器出錯,而且效率低且可重複性弱
  • 更重要的是。使用者並不知道鏡像是如何創建出來的。裡面是否有惡意程式

Dockerfile建構映像

Dockerfile是由一組指令組成的文件,其每個指令對應Linux中的一條指令,Docker程式透過讀取Dockerfile中的指令最終會產生鏡像。

第一個Dockerfike

第一步:建立一個新的目錄

[root@ken1 ~]# mkdir /test
登入後複製

第二步:寫Dockerfile

名稱就叫Dockerfile,且第一個D需要大寫

[root@ken1 ~]# cat Dockerfile FROM centos RUN yum install vim -y
登入後複製

FROMcentos表示使用centos這個基礎映像

RUN表示在centos上安裝vim編輯器

第三步:建立鏡像

[root@ken1 ~]# docker build -t centos-vim2 .
登入後複製

-t後面指定新的映像的標籤名稱(tag)

. 最後的點指明docker context為目前目錄。 docker預設會從build context尋找Dockerfile文件,我們也可以透過-f參數指定Dockerfile的位置

第四步:檢視映像

檢視映像分層結構

docker history會顯示映像的建置歷史,也就是Dockerfile的執行過程。

Dcokerfile常用指令

  1.FROM

指定base鏡像

  2. MAINTAINER

設定鏡像的作者。可以是任意的字元

  3.COPY

將檔案從build context複製到鏡像

COPY支援兩種格式:COPY src dest 和COPY [“src”, ”dest”]

注意:src只能煞車build context中的檔案或目錄即在和Dockerfile同目錄下才可以

  4.ADD

#與COPY類似,從build context複製檔案到鏡像。

不同的是,如果src是歸檔檔案(tar,zip,tgz,xz),檔案會被自動接要到dest

  5.ENV

#設定環境變量,環境變數可被後面的指令使用,例如:

ENV name ken RUN echo $name

  6.EXPOSE

指定容器中的進程會監聽某個端口,Docker可以將該端口暴露出來

  7.VOLUME

將文件或目錄聲明為volume

  8.WORKDIR

#為後面的RUN ,ENTRYPINT,ADD,COPY指令設定映像中的目前工作目錄

  9.RUN

在容器中執行指定的指令

  10.CMD

容器启动时运行指定的命令

dockerfile中可以多个CMD指令,但是只要最后一个生效。CMD可以被docker run之后的参数替换

  11.ENTRYPOINT

设置容器启东市的命令

dockerfile中可以有多个ENTRYPOINT,但是只有最后一个生效。

CMD或者docker run之后的参数会被当做参数传递给ENTERYPOINT.

Dockerfile演示

下面演示一个比较全面的dockerfile

[root@ken1 test]# cat Dockerfile #my Dockerfile FROM busybox MAINTAINER ken WORKDIR /ken RUN touch test COPY ["ken1","."] ADD ["wordpress.tar.gz","."] ENV name "ken"
登入後複製

注意:Dockerfile支持以#开头的注释

构建镜像

[root@ken1 test]# docker build -t myimage . Sending build context to Docker daemon 4.281MB Step 1/7 : FROM busybox ---> 3a093384ac30 Step 2/7 : MAINTAINER ken ---> Running in 2a73a83507ce Removing intermediate container 2a73a83507ce ---> 8c3df9b3d823 Step 3/7 : WORKDIR /ken ---> Running in 31c6f9fe2195 Removing intermediate container 31c6f9fe2195 ---> a458cf986072 Step 4/7 : RUN touch test ---> Running in e1b08ebd363c Removing intermediate container e1b08ebd363c ---> 41601920009a Step 5/7 : COPY ["ken1","."] ---> 2ebfa0933fca Step 6/7 : ADD ["wordpress.tar.gz","."] ---> d0ad29d3aa34 Step 7/7 : ENV name "ken" ---> Running in fceae6e20e63 Removing intermediate container fceae6e20e63 ---> 7efe0600e48f Successfully built 7efe0600e48f Successfully tagged myimage:latest
登入後複製

查看镜像

运行该镜像

[root@ken1 test]# docker run -it myimage /ken # ls ken1 test wordpress /ken # echo $name ken
登入後複製
  • 可以发现当前工作目录为/ken,且自动创建
  • ken1是我们从docker context目录中复制过去的
  • test是使用touch创建的
  • wordpres压缩包已经被自动解压
  • $name为变量值为ken

推荐学习:《docker视频教程

以上是建立Docker映像有幾種方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!