docker——Dockerfile(一)


Dockerfile是一個文本格式的配置文件,用戶可以使用Dockerfile來快速創建自定義的鏡像。
Dockerfile由一行行命令語句組成,並支持以#開頭的注釋行。
一般而言,Dockerfile分為四部分:基礎鏡像信息維護者信息鏡像操作指令容器啟動時執行的命令

一、Dockerfile指令說明:

下面是指令詳情:

1.FROM

說明:指定所創建鏡像的基礎鏡像,如果本地不存在,則默認會去Docker Hub下載指定鏡像。
格式:
  FROM <image>
  FROM <image>:<tag>
  FROM <image>@<digest>

任何Dockerfile中的第一條指令必須為FROM指令。並且,如果在同一個Dockerfile中創造多個鏡像,可以使用多個FROM指令,每個鏡像一個。

2.MAINTAINER

說明:指定維護者信息
格式:
  MAINTAINER <name>

該信息會寫入生成鏡像的Author屬性域中。

3.RUN

說明:運行指定命令
格式:
  RUN <command>
  RUN ["executable","param1","param2"] (RUN ["可執行文本","參數1","參數2"]) 指令會被解析為Json數組,因此必須用雙引號。
實例:
  RUN echo hello
  RUN ["/bin/bash","-c","echo hello"]

RUN <command> 默認會在shell終端中運行命令,即/bin/sh -c
RUN ["","",""] 使用exec執行,不會啟動shell環境
每條RUN指令將在當前鏡像的基礎上執行指定命令,並提交為新的鏡像。
當命令較長時,可以使用\來換行。

4.CMD

說明:指定啟動容器時默認執行的命令
格式:
  CMD ["executable","param1","param2"] 使用exec執行,推薦使用的方式
  CMD command param1 param2 在/bin/sh中執行,提供給需要交互的應用
  CMD ["param1","param2"] 提供給ENTRYPOINT的默認參數

每個Dockerfile只能有一條CMD命令,如果指定了多條命令,只有最后一條會被執行
如果用戶啟動容器時,手動指定了運行的命令(作為run的參數),則會覆蓋掉CMD指定的命令。

5.LABEL

說明:用來指定生成鏡像的元數據標簽信息
格式:
  LABEL <key>=<value> <key>=<value> <key>=<value>...
實例:
  LABEL version="1.0"
  LABEL description="This is test_label"

6.EXPOSE

說明:聲明鏡像內服務所監聽的端口
格式:
  EXPOSE <port> [<port> <port> ...]
實例:
  EXPORT 22 80 443

注意,該指令只是起到聲明作用,並不會自動完成端口映射。
如果你要完成映射還是要在創建的時候使用-p/-P參數。

7.ENV

說明:指定環境變量,在鏡像的生成過程中會被后續RUN指令調用,在啟動的容器中也會存在。
格式:
  ENV <key> <value>
  ENV <key>=<value>
實例:
  ENV PG_MAJOR 9.8.3

指令指定的環境變量在運行時可以被覆蓋。

8.ADD

說明:復制指定的<src>路徑下的內容到容器中的<dest>路徑下
格式:
  ADD <src> <dest>
實例:
  ADD *.c /code/

其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件或目錄),也可以是一個URL,
還可以是一個tar文件(如果是tar文件會自動解壓到<dest>路徑下)。
<dest>可以是鏡像內的絕對路徑,或者相對於工作目錄(WORKDIR)的相對路徑。


9.COPY

說明:復制本地主機的<src>(Dockerfile所在目錄的相對路徑、文件或目錄)下的內容到鏡像中的<dest>下,目標路徑不存在時,會自動創建。
格式:
  COPY <src> <dest>

當使用本地目錄為源目錄時,推薦使用COPY


10.ENTRYPOINT

說明:指定鏡像的默認入口命令,該入口命令會在啟動容器時作為根命令執行,所以傳入值作為該命令的參數
格式:
  ENTRYPOINT ["executable","param1","param2"] exec調用執行
  ENTRYPOINT command param1 param2 shell中執行

此時,CMD指令指定值將作為根命令的參數。
每個Dockerfile中只能有一個ENTRYPOINT,當指定多個時,只有最后一個有效。
在運行時,可以被 --entrypoint參數覆蓋掉。

11.VOLUME

說明:創建一個數據卷掛載點。
格式:
VOLUME ["/data"]

可以從本地主機或其他容器掛載數據卷,一般用來存放數據庫和需要保存的數據等

12.USER

說明:指定運行容器時的用戶名或UID,后續的RUN等指令也會使用指定的用戶身份。
格式:
  USER daemon

當服務不需要管理員權限時,可以通過該命令指定運行用戶,並且可以在之前創建所需要的用戶。
RUN groupadd -r postgres && useradd -r -g postgress postgress
要零時獲取管理員權限可以使用gosu或sudo


13.WORKDIR

說明:為后續的RUN、CMD和ENTRYPOINT指定配置的工作目錄。
格式:
  WORKDIR /path/to/workdir

可以使用多個WORKDIR指令,后續命令如果參數是相對路徑,則會基於之前命令指定的路徑。
  WORKDIR /a
  WORKDIR b
  WORKDIR c
則最終路徑為/a/b/c

14.ARG

說明:指定一些鏡像內使用的參數(例如版本號信息),這些參數在執行docker build命令時才以--build-arg<varname>=<value>格式傳入。
格式:
  ARG <name> [=<default value>]

15.ONBUILD

說明:配置當前所創建的鏡像作為其它鏡像的基礎鏡像時,所執行的創建操作指令。
格式:
  ONBUILD [INSTRUCTION]

例如,Dockerfile使用如下類容創建的鏡像image-A

    [...]    
ONBUILD ADD . /app/src
    [...]

如果基於鏡像image-A創建新的鏡像,那么新的鏡像就會自動執行上面的ONBUILD指定的內容,類似於繼承的關系。

16.STOPSIGNAL

說明:指定所創建鏡像啟動的容器接收退出的信號值
實例:
  STOPSIGNAL signal

17.HEALTHCHECK

說明:配置所啟動容器如何進行健康檢查(如何判斷健康與否)
格式:
  HEALTHCHECK [OPTIONS] CMD command 根據所執行命令返回值是否為0來判斷
OPTION支持的選項:
  --interval=DURATION(默認為:30s) 過多久檢查一次
  --timeout=DURAION(默認為:30s) 每次檢查等待結果的超時
  --retries=N(默認為:3) 如果失敗了,重試幾次才最終確定失敗

HEALTHCHECK NONE 禁止基礎鏡像中的健康檢查

18.SHELL

說明:指定其它命令使用shell時的默認shell類型
實例:
  SHELL ["executable","parameters"]

默認值為 ["/bin/sh","-c"]



二、創建鏡像

編寫完Dockerfile之后,可以通過docker build來創建鏡像。下面兩種寫法都是可行的

docker build -t centos_nginx:v1 /docker_demo
docker build -t centos_nginx:v1

如果沒有指定Dockerfile的路徑,那么就會默認讀取當前目錄下(包括子目錄)的Dockerfile。
並將該路徑下的所有內容發送給Docker服務端,由服務端來創建鏡像。
如果使用非內容路徑下的Dockerfile,可以使用-f選項來指定其路徑。
要指定生成鏡像的標簽信息,可以使用-t選項。
建議放置Dockerfile的目錄為空目錄。

 

三、簡單應用

centos鏡像+nginx.tar

切換目錄:

cd /

創建工作路徑:

mkdir docker_demo

創建Dockerfile文件:

touch Dockerfile

編輯文件:

# base image
FROM docker.io/centos

# MAINTAINER
MAINTAINER 467661568@qq.com

# put nginx-1.9.0.tar.gz into /usr/local/src and unpack nginx
#將當前目錄下的包復制到/usr/local/src目錄下
ADD nginx-1.9.0.tar.gz /usr/local/src

# running required command
#執行命令,安裝依賴包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel
RUN yum install -y libxslt-devel -y gd gd-devel GeoIP GeoIP-devel pcre pcre-devel
RUN useradd -M -s /sbin/nologin nginx

# change dir to /usr/local/src/nginx-1.9.0
#指定工作路徑
WORKDIR /usr/local/src/nginx-1.9.0

# execute command to compile nginx
#安裝軟件包
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install

#聲明被監控的端口
EXPOSE 80

創建鏡像:

docker run -d -P centos_nginx:v1 /usr/local/nginx/sbin/nginx -g "daemon off;"

/usr/local/nginx/sbin/nginx:nginx的啟動命令

訪問32774端口:

 

注意:
daemon on | off 默認on
是否以守護進程的方式運行nginx。守護進程是指脫離終端在后面運行的進程。


變化一:
添加一個環境變量

ENV PATH /usr/local/nginx/sbin:$PATH

這樣在創建容器的時候,就可以省去前面的路徑

docker run -d -P centos_nginx:v1 nginx -g "daemon off;"


變化二:
添加一個CMD(啟動容器時默認執行的命令)

CMD /bin/sh -c 'nginx -g "daemon off;"'    

這樣在創建容器的時候就不需要那么麻煩。

docker run -d -P centos_nginx:v1

 

變化三:
添加一個ENTRYPOINT指令,默認的入口命令,CMD命令將作為其參數

ENTRYPOINT ["nginx"]

CMD ["-g","daemon off;"]

 


免責聲明!

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



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