在使用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內容基礎知識
- 每條保留字指令都必須爲大寫字母,且後面至少要跟隨一個參數
- 指令按照從上往下,依次執行
- #符號,表示註釋
- 每條指令都會創建一個新的鏡像層,並對鏡像進行提交
Docker執行Dockerfile的大致流程
- docker從基礎鏡像運行一個容器
- 執行一條指令並對容器作出修改
- 執行類似 docker commit的操作提交一個新的鏡像層
- docker再基於剛提交的鏡像運行一個新容器
- 執行 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 被觸發