centos7下安裝docker(dockerfile常用的指令)


FROM:指定ase鏡像

 

MAINTAINER:設置鏡像作者,可以是任意字符

 

COPY:將文件從build  context復制到鏡像。支持兩種形式:1.COPY src dest 2.COPY [“src”,“dest”]

注意:src只能指定build context中的文件或目錄

 

 

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

ENV:設置環境變量,環境變量可被后面的指令使用。

例如:ENV MY_VERSION 1.3

   RUN yum install -y mypackage=$ENV MY_VERSION 1.3

 

EXPOSE:制定容器中的進程會監聽牧歌端口,Docker可以將該端口暴露出來

VOLUME:將文件或者是目錄聲明為volume

 

WORKDIR:為后面的RUN CMD ENTRYPOINT ADD   COPY   指令設置鏡像中的當前目錄

 

RUN: 在容器中運行相應的指令

CMD:容器啟動時運行的相應的命令,dockerfile中可以有多個cmd指令,但只有最后一個生效。CMD可以被docker run 之后的參數代替

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

下面做一個實驗

編輯dockerfile

 

創建鏡像進行驗證:

創建完成

進行驗證:

證明,運行容器時默認會進入WORKDIR指定的目錄下,RUN和COPY也會在WORKDIR下執行,輸出ENV的變量hello

 

注:build context值得是Dockerfile所在的目錄以及子目錄

分析RUN CMD ENTRYPOINTDE 區別

1.RUN:執行命令,創建新的鏡像層,通常執行安裝的命令

2.CMD:容器啟動后默認執行的命令,可以被docker run后面的參數代替

3.ENTRYPOINT:容器啟動時執行的命令,CMD的參數可以執行給ENTRYPOINT

RUN  CMD  ENTRYPOINT執行的時候會有兩種形式:SHELL 和 EXEC

SHELL格式:<說明><命令>

例如:RUN yum install -y tree

          CMD echo “hello”

          ENTRYPOINT echo “likun”

SHELL 會調用/bin/sh -c <命令>

例如:ENV  name  likun

         ENTRYPOINT echo “hello,$name”

執行 docker run <鏡像>

會輸出 hello,likun   這里的環境變量被likun代替

 

EXEC格式:<說明>["executable","param1","param2",...]

例如:RUN ["yum","install","tree"]

          CMD ["/bin/echo","hello world"]

          ENTRYPOINT ["/bin/echo","hello world"]

當命令執行的時候,會直接調用<命令>,不會被shell解析

例如:ENV name likun

           ENTRYPOINT [“/bin/echo”,“hello,$name”]

實驗充分證明:exec格式不會解析shell,以上的實驗直接將$HELLO輸出,而不是hi,hello

如果希望使用環境變量,可以做一下修改:

ENV HELLO "hello"

ENTRYPOINT ["/bin/sh",-c","echo hi,$HELLO"]

運行容器時輸出  hi,hello

下面做一下實驗:

修改Dockerfile

創建新的鏡像:

創建成功

運行鏡像:

直接輸出hi,hello

注:EXEC格式可讀性更強,更容易被理解。CMD 和ENTRYPOINT 推薦使用EXEC格式,RUN則兩種格式都可以

以上說明了兩中格式,下面研究一下他們的區別,什么時候用什么格式

RUN

RUN有兩種格式:

1.Shell格式:RUN

2.EXEC格式:RUN ["executable",“param1”,“param2”]

使用RUN安裝多個安裝包的例子

RUN yum insatll -y tree httpd vim

注意:1.yum install  update和yum install -y最好放在一個指令中執行,如:RUN yum install update && yum install -y tree,這樣能夠保證每次安裝的都是新的安裝包。如果他們分開使用的話會分別為yum install update 和yum install -y分別創建一個鏡像層,下次創建新的鏡像的時候會直接使用cache這個鏡像,不能保證安裝的是最新的安裝包。

2.也可以使用docker build -t 鏡像名字 --no-cache也可以保證install是最新的。

3.--no-cache適用於任何場景,update&install僅適用於安裝軟件

CMD

容器啟動且docker run 沒有指定其他命令時運行的命令

1.如果docker run指定了新的命令,CMD指定的默認命令將被忽略

2.如果Dockerfile中有多個CMD,,只有最后一個CMD生效

CMD有三種格式:

1.Exec格式:CMD ["executable","param1","param2"]這是CMD的推薦格式

2.CMD[“param1”,“param2”]為ENTRYPOINT提供額外的參數,此時ENTRYPOINT必須使用Exec格式,這種格式要與ENTRYPOINT配合使用,為ENTRYPOINT提供默認參數

3.SHELL格式:CMD command param1 param2 

param是參數的意思

進行實驗

同樣是修改Dockerfile

制作鏡像

查看鏡像

運行鏡像,輸出hi likun

在docker run it  centos-cmd:cmd加命令,CMD會被忽略,下面進行實驗

CMD直接被忽略,輸出hello docker

ENTRYPOINT:可以讓容器以應用程序或者服務的形式運行

ENTRYPOINT和CMD很像,都可以指定要執行的命令及參數。但是ENTRYPOINT不會被忽略,一定會被執行,即使docker run后面指定了其他命令。

ENTRYPOINT有兩種格式:

1.Exec格式:ENTRYPOINT [“executable”,“param1”,“param2”],這個是ENTRYPOINT的推薦格式

2.SHELL格式:ENTRYPOINT command param1 param2

注:在為ENTRYPOINT選擇格式時一定要注意,因為兩種格式差別很大。

再次強調:ENTRYPOINT的exec格式中的參數始終會被使用,CMD的參數會被docker run后面的參數替換;shell格式會忽略任何CMD或docker run提供的參數

 

 

總結

1.使用RUN 指令安裝應用和軟件包,構建鏡像

2.使用ENTRYPOINT運行應用程序或服務,比如運行一個MySQL,應該優先使用EXEC格式的ENTRYPOINT指令

3.CMD可為ENTRYPOINT提供額外的默認參數,同時可以利用docker run后面的參數進行更改。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM