Docker_使用Dockerfile構建新鏡像

在使用docker的時候,有時候會發現從遠程上拉取的鏡像並不能滿足要求,那麼這個時候,就可以根據這個鏡像,編寫一個Dockerfile來構建出一個屬於自己的鏡像。


首先創建一個Dockerfile文件,內容如下

FROM centos:7                           #來自我本地的centos7
MAINTAINER lgz<[email protected]>    #維護者
VOLUME ["/project"]                     #新建一個數據卷
ENV WORK_PATH /project                  #設置環境變量
WORKDIR $WORK_PATH                      #設置進入容器的工作目錄
RUN yum -y install vim                  #安裝vim
RUN yum -y install net-tools            #安裝net-tools
CMD echo successfully build!!!
CMD /bin/bash

使用build命令構建

語法:docker build -f [自定義的Dockerfile絕對路徑] -t [鏡像名稱[:TAG]] . (命令末尾有個點,不要忽略)

測試命令:docker build -f /myDocker/Dockerfile -t lgz/centos:build2 .

[root@localhost myDocker]# docker build -f /myDocker/Dockerfile -t lgz/centos:build2 .
Sending build context to Docker daemon  3.072kB
Step 1/9 : FROM centos:7
 ---> 5e35e350aded
Step 2/9 : MAINTAINER lgz<[email protected]>
 ---> Running in bfa301e12fd9
Removing intermediate container bfa301e12fd9
 ---> fbbe4d72dbc3
Step 3/9 : VOLUME ["/project"]
 ---> Running in e9b189867994
Removing intermediate container e9b189867994
 ---> 1fc246e02fa0
Step 4/9 : ENV WORK_PATH /project
 ---> Running in f1df0cc7c99d
Removing intermediate container f1df0cc7c99d
 ---> 3235871c6ace
Step 5/9 : WORKDIR $WORK_PATH
 ---> Running in c66d8a0c23a1
Removing intermediate container c66d8a0c23a1
 ---> b8dcc6ba6d13
Step 6/9 : RUN yum -y install vim
 ---> Running in d74fe0dba30c
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.163.com
 * extras: centos.ustc.edu.cn
 * updates: mirrors.163.com
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.629-6.el7 will be installed
--> Processing Dependency: vim-common = 2:7.4.629-6.el7 for package: 2:vim-enhanced-7.4.629-6.el7.x86_64
--> Processing Dependency: which for package: 2:vim-enhance
...
...

構建成功

[root@localhost /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lgz/centos          build2              7906476eda5f        15 minutes ago      437MB
lgz/tomcat          build01             6ce2360a3c6c        25 hours ago        507MB
lgz/centos          build01             0b71e009561a        26 hours ago        203MB
tomcat              jdk8-openjdk        c81106060722        3 days ago          507MB
centos              7                   5e35e350aded        13 days ago         203MB

lgz/centos:build2 鏡像變更歷史

[root@localhost /]# docker history lgz/centos:build2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
7906476eda5f        28 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
634cd1ef5033        28 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
5b2fe886d44f        28 minutes ago      /bin/sh -c yum -y install net-tools             89.7MB              
4063988ef5fd        28 minutes ago      /bin/sh -c yum -y install vim                   145MB               
b8dcc6ba6d13        29 minutes ago      /bin/sh -c #(nop) WORKDIR /project              0B                  
3235871c6ace        29 minutes ago      /bin/sh -c #(nop)  ENV WORK_PATH=/project       0B                  
1fc246e02fa0        29 minutes ago      /bin/sh -c #(nop)  VOLUME [/project]            0B                  
fbbe4d72dbc3        29 minutes ago      /bin/sh -c #(nop)  MAINTAINER lgz<canueman@v…   0B                  
5e35e350aded        13 days ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop) ADD file:45a381049c52b5664…   203MB 

Dockerfile是用來構建Docker鏡像的構建文件,是由一系列的命令與參數構成的腳本。

Dockerfile內容基礎知識

  1. 每條保留字指令都必須爲大寫字母,且後面至少要跟隨一個參數
  2. 指令按照從上往下,依次執行
  3. #符號,表示註釋
  4. 每條指令都會創建一個新的鏡像層,並對鏡像進行提交

Docker執行Dockerfile的大致流程

  1. docker從基礎鏡像運行一個容器
  2. 執行一條指令並對容器作出修改
  3. 執行類似 docker commit的操作提交一個新的鏡像層
  4. docker再基於剛提交的鏡像運行一個新容器
  5. 執行 dockerfile中的下一條指令直到所有指令都執行完成

Dockerfile保留字指令

FROM

表示當前新生成的鏡像是基於哪個鏡像

MAINTAINER

鏡像維護者的姓名和郵箱地址

RUN

容器構建時需要運行的命令

EXPOSE

當前容器對外暴露的端口

WORKDIR

指定在容器創建後,終端默認登陸進來的工作目錄

ENV

用來在鏡像的構建過程中設置環境變量

ADD

將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包

COPY

類似ADD,拷貝文件和目錄到鏡像中
將從構建上下文目錄中<源路徑>的文件/錄複製到新的一層的鏡像內的<目標路徑>位置
兩種寫法:
1. COPY src dest;
2. COPY[“src”,“dest”]

VOLUME

容器數據卷,用於數據保存和持久化工作

CMD

指定一個容器啓動時要運行的命令
Dockerfile中可以有多個CMD指令,但只有最後一個生效,CMD會被 docker run之後的參數替換

ENTRYPOINT

指定一個容器啓動時要運行的命令
ENTRYPOINT的目的和CMD一樣,都是在指定容器啓動程序及參數

ONBUILD

當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的 onbuild 被觸發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章