1. 程式人生 > 其它 >docker-Dockerfile入門

docker-Dockerfile入門

技術標籤:dockerdockerlinux

使用Dockerfile描述待構建映象的說明和需要執行的指令。

定製一個nginx映象

編寫Dockerfile

Dockerfile內容:

FROM nginx
RUN echo 'this is a local nginx image' > /usr/share/nginx/html/index.html

FROM指示基礎映象
RUN表示指令,有兩種格式

  1. RUN <命令列命令> 就是直接跟終端操作
  2. RUN [“可執行檔案”, “引數1”, “引數2”] 例如RUN ["./test.php", “dev”, “offline”] 等價於 RUN ./test.php dev offline

Dockerfile的指令每執行一次都會在docker上新建一層,層多了,映象就變大了。

FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上執行會建立3層映象。可簡化為以下格式:(只會建立1層映象)
FROM centos
RUN yum install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
\ && tar -xvf redis.tar.gz

構建映象

-t是目標映象名
點號是本次執行的上下文路徑。docker的執行模式是C/S,本機是C,docker引擎是S。本機打包上下文路徑下的所有檔案發給docker引擎,docker引擎才能使用。如果不指明的話,上下文路徑就是Dockerfile所在的位置。所以,應該避免在上下文路徑裡存放無用檔案,以防打包時間過長。

[email protected]:~/Desktop$ docker build -t nginx:v3 .
Sending build context to Docker daemon  265.1MB
Step 1/2 :
FROM nginx ---> 5a3221f0137b Step 2/2 : RUN echo 'this is a local nginx image' > /usr/share/nginx/html/index.html ---> Running in daa66a298414 Removing intermediate container daa66a298414 ---> 870948baf772 Successfully built 870948baf772 Successfully tagged nginx:v3 [email protected]:~/Desktop$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx v3 870948baf772 About a minute ago 126MB pxt/ubuntu 1214 e2878e512eef 2 hours ago 168MB ...

其他指令

COPY

複製指令:從上下文目錄中複製檔案、資料夾到容器內指定路徑

COPY [--chown=<user>:<group>] <源路徑1>...  <目標路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>",...  "<目標路徑>"]

[–chown]是可選的,用於指定owner和group。
源路徑支援萬用字元。
目標路徑是容器裡的路徑,如果不存在,會自動建立。

ADD

與COPY類似。需求相同的話更推薦COPY。
ADD的優點:如果原始檔是tar壓縮檔案,格式為gzip bzip2 xz時,ADD能在目標路徑自動解壓
ADD的缺點:複製tar就必須解壓。構建可能變慢。

CMD

類似RUN,但是CMD在docker run時執行,RUN是在docker build時執行。

  1. CMD是為啟動的容器指定的、預設要執行的程式,程式執行結束,容器也就隨之結束了。
  2. CMD指令指定的程式可以被docker run命令列引數中指定要執行的程式覆蓋。
  3. 如果Dockerfile中存在多個CMD指令,則只有最後一個生效。
CMD <shell 命令> # 實際執行時也會轉化為第二種格式。預設可執行檔案是sh
CMD ["<可執行檔案或命令>","<param1>","<param2>",...] # 推薦
CMD ["<param1>","<param2>",...]  # 該寫法是為 ENTRYPOINT 指令指定的程式提供預設引數

ENTRYPOINT

類似於CMD指令,但是不會被docker run的命令列引數中指定的指令覆蓋,且命令列引數會被當成引數送給ENTRYPOINT指令指定執行的程式。如果執行 docker run 時使用了 --entrypoint 選項,此選項的引數可當作要執行的程式覆蓋 ENTRYPOINT 指令指定的程式。同樣的,如果Dockerfile中有多條ENTRYPOINT指令,也是隻有最後一個生效。
優點:在執行docker run時可以指定ENTRYPOINT指令的引數

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

假設構建nginx:test的Dockerfile是這樣:

FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定參
CMD ["/etc/nginx/nginx.conf"] # 變參 

1.不傳參執行

$ docker run nginx:test

容器內執行的就是 nginx -c /etc/nginx/nginx.conf,那麼CMD是給ENTRYPOINT傳參的。
2.傳參執行

$ docker run nginx:test -c /etc/nginx/new.conf

容器內執行的是nginx -c /etc/nginx/new.conf,CMD和ENTRYPOINT的引數都被忽略,用docker run 帶的引數。(前提是new.conf已經在容器裡了)

ENV

定義和設定環境變數。在後續指令中可用。

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2> ...

在這裡插入圖片描述

ARG

與ENV作用一致。但是ARG的設定只對Dockerfile內有效,即只在docker build過程中有效,構建好的映象中不存在此環境變數。docker build也可以用–build-arg <引數名>=<值>來覆蓋。

ARG <引數名>[=<預設值>]

VOLUME

定義匿名資料卷。在啟動容器時忘記掛載資料卷,會自動掛載到匿名卷。docker run的-v引數可以覆蓋。
作用:1.避免重要的資料因重啟容器而丟失;2.避免容器不斷變大。

VOLUME ["<路徑1>", "<路徑2>"...]
VOLUME <路徑>

EXPOSE

宣告埠。
作用:1.幫助映象的使用者理解這個映象服務的守護埠,以便配置對映。2.使用docker run -P隨機對映時,會自動對映到EXPOSE的埠。

EXPOSE <埠1> [<埠2>...]

WORKDIR

指定工作目錄。docker build過程中,每一個RUN命令都是新建的一層,只有WORKDIR指定的目錄會在每一層中存在。這個目錄應該是提前建立好的。

WORKDIR <工作路徑目錄>

USER

指定執行後續命令的使用者和使用者組。只用來切換使用者。且該使用者應該已存在了。

USER <使用者名稱>[:<使用者組>]

HEALTHCHECK

用於指定某個程式或指令來監控docker容器服務的執行狀態。

HEALTHCHECK [選項] CMD <命令>:設定檢查容器健康狀況的命令
HEALTHCHECK NONE:如果基礎映象有健康檢查指令,使用這行可以遮蔽掉其健康檢查指令
HEALTHCHECK [選項] CMD <命令> : 這邊 CMD 後面跟隨的命令使用,可以參考 CMD 的用法。

ONBUILD

用於延遲構建命令的執行。就是本次build不會執行ONBUILD後跟的指令,但是有新的Dockerfile使用這個映象時,這個指令會被執行。

ONBUILD <其他指令>