docker學習筆記-06:自定義DockerFile生成鏡像

1、自定義centos的DockerFiledocker

一、從阿里源里拉的centos鏡像新建的容器實例中,沒有vim編輯器和ifconfig命令,因此自定義centos的DockerFile,建立本身想要的鏡像。json

FROM centos
MAINTAINER dyy <dyyjxcjdx@163.com>

ENV MYPATH /tmp      # 設置環境變量

WORKDIR $MYPATH   # $表示引用上面的路徑

RUN yum -y install vim   # 安裝vim
RUN yum -y install net-tools

EXPOSE 80   # 端口爲80

CMD echo $MYPATH
CMD echo "success------ok"
CMD /bin/bash

二、執行DockerFile生成自定義的鏡像,-f後面指定DockerFile文件的路徑,-t後面加新鏡像的名稱和TAG,最末尾要加上一個 「 . 」號。vim

docker build -f /mydocker/DockerFile2 -t mycentos:1.3 .       # 注意最後要加一個 . 號

三、基於自定義建立的鏡像,建立新的容器實例。centos

docker run -it mycentos:1.3

 

2、CMD和ENTRYPOINT的區別tomcat

一、CMDbash

(1)tomcat在Docker Hub上的DockerFile,最後一行爲CMD命令,表示啓動tomcat服務。app

CMD ["catalina.sh", "run"]

(2)若是在建立tomcat的容器實例時,在docker run 後面加了命令參數  ls -l:dom

docker run -it -p 7777:8080 tomcat ls -l

(3)那就至關於在DockerFile最後一行加了以下命令。那麼會把啓動tomcat服務的命令替換掉,那麼docker run 執行以後,不會啓動服務。curl

CMD ls -l

(4)因此DockerFile中能夠有多個CMD指令,但只有最後一個生效,CMD會被docker run 以後的參數替換。編輯器

二、ENTRYPOINT

(1)docker run以後的參數會被當作參數傳遞給ENTRYPOINT,以後造成新的命令組合。

(2)製做CMD版能夠查詢ip信息的容器,編輯DockerFile文件,文件內容以下:

FROM centos

RUN yum install -y curl

CMD ['curl','-s','https://ip.cn']     # 執行不了的話改成 CMD curl -s https://ip.cn

而後執行DockerFile文件,用docker build建立鏡像 myip01,再docker run獲得一個容器實例,輸出ip地址。

docker build -f /mydocker/DockerFile3 -t myip01 .
docker run -it myip01

問題是若是須要擴展功能,但願在獲得ip地址的同時獲得HTTP頭信息,那麼要加上 -i 參數。那麼用CMD就會出問題了。

(3)製做ENTRYPOINT版的查詢ip地址的容器,編輯的DockerFile文件的內容以下:

FROM centos

RUN yum install -y curl

ENTRYPOINT ["curl","-s","https://ip.cn"]

一樣的docker build ---> docker run 執行。但願在獲得ip地址的同時獲得HTTP頭信息,那麼要加上 -i 參數,此時不會出問題。

docker build -f /mydocker/DockerFile4 -t myip02 .
docker run -it myip02 -i

獲得結果:

HTTP/1.1 200 OK
Date: Tue, 10 Sep 2019 03:40:49 GMT
Content-Type: application/json; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=dcd0856220b503fa61946688c0a7210bb1568086849; expires=Wed, 09-Sep-20 03:40:49 GMT; path=/; domain=.ip.cn; HttpOnly
Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Server: cloudflare
CF-RAY: 513e61fadc756e54-SJC

{"ip": "220.248.17.218", "country": "上海市", "city": "聯通"}

 

3、ONBUILD命令

一、當構建一個將要被繼承的父鏡像的DockerFile時,加入ONBUILD命令。只要子鏡像繼承了父鏡像,就會執行ONBUILD後面的命令,也就是ONBUILD被觸發。

二、編寫DockerFile文件,用於建立新的父鏡像。

FROM centos

RUN yum install -y curl

ENTRYPOINT ["curl","-s","https://ip.cn"]
ONBUILD RUN echo "father onbuild -----886"

三、執行DockerFile建立父鏡像

docker build -f /mydocker/DockerFile4 -t myip_father .

四、編寫子鏡像的DockerFile文件,明確繼承自父鏡像。

FROM myip_father      # 繼承自父鏡像

RUN yum install -y curl

CMD curl -s https://ip.cn

五、執行子鏡像的DockerFile建立子鏡像。

docker build -f /mydocker/DockerFile5 -t myip_son .

獲得結果:Executing 1 build trigger     ------->代表onbuild被觸發

Sending build context to Docker daemon  6.144kB
Step 1/3 : FROM myip_father
# Executing 1 build trigger                    '''執行onbuild觸發器'''
 ---> Running in eb2da8cf92a0
father onbuild -----886
Removing intermediate container eb2da8cf92a0
 ---> 78a71071f237
Step 2/3 : RUN yum install -y curl
 ---> Running in 2e7f7f3070bf
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.cn99.com
Package curl-7.29.0-51.el7_6.3.x86_64 already installed and latest version
Nothing to do
Removing intermediate container 2e7f7f3070bf
 ---> 9083e355b88f
Step 3/3 : CMD curl -s https://ip.cn
 ---> Running in 84b3520173ef
Removing intermediate container 84b3520173ef
 ---> c83251bcff40
Successfully built c83251bcff40
Successfully tagged myip_son:latest
相關文章
相關標籤/搜索