Dockerfile是一個文本格式的配置文件,用戶可使用Dockerfile來快速建立自定義的鏡像。
Dockerfile由一行行命令語句組成,並支持以#開頭的註釋行。
通常而言,Dockerfile分爲四部分:基礎鏡像信息、維護者信息、鏡像操做指令和容器啓動時執行的命令。nginx
下面是指令詳情:c++
說明:指定所建立鏡像的基礎鏡像,若是本地不存在,則默認會去Docker Hub下載指定鏡像。
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
任何Dockerfile中的第一條指令必須爲FROM指令。而且,若是在同一個Dockerfile中創造多個鏡像,可使用多個FROM指令,每一個鏡像一個。
docker
說明:指定維護者信息
格式:
MAINTAINER <name>
該信息會寫入生成鏡像的Author屬性域中。
shell
說明:運行指定命令
格式:
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指令將在當前鏡像的基礎上執行指定命令,並提交爲新的鏡像。
當命令較長時,可使用\來換行。
數據庫
說明:指定啓動容器時默認執行的命令。
格式:
CMD ["executable","param1","param2"] 使用exec執行,推薦使用的方式
CMD command param1 param2 在/bin/sh中執行,提供給須要交互的應用
CMD ["param1","param2"] 提供給ENTRYPOINT的默認參數
每一個Dockerfile只能有一條CMD命令,若是指定了多條命令,只有最後一條會被執行。
若是用戶啓動容器時,手動指定了運行的命令(做爲run的參數),則會覆蓋掉CMD指定的命令。
centos
說明:用來指定生成鏡像的元數據標籤信息。
格式:
LABEL <key>=<value> <key>=<value> <key>=<value>...
實例:
LABEL version="1.0"
LABEL description="This is test_label"
數組
說明:聲明鏡像內服務所監聽的端口
格式:
EXPOSE <port> [<port> <port> ...]
實例:
EXPORT 22 80 443
注意,該指令只是起到聲明做用,並不會自動完成端口映射。
若是你要完成映射仍是要在建立的時候使用-p/-P參數。
bash
說明:指定環境變量,在鏡像的生成過程當中會被後續RUN指令調用,在啓動的容器中也會存在。
格式:
ENV <key> <value>
ENV <key>=<value>
實例:
ENV PG_MAJOR 9.8.3
指令指定的環境變量在運行時能夠被覆蓋。
app
說明:複製指定的<src>路徑下的內容到容器中的<dest>路徑下。
格式:
ADD <src> <dest>
實例:
ADD *.c /code/
其中<src>能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄),也能夠是一個URL,
還能夠是一個tar文件(若是是tar文件會自動解壓到<dest>路徑下)。
<dest>能夠是鏡像內的絕對路徑,或者相對於工做目錄(WORKDIR)的相對路徑。
dom
說明:複製本地主機的<src>(Dockerfile所在目錄的相對路徑、文件或目錄)下的內容到鏡像中的<dest>下,目標路徑不存在時,會自動建立。
格式:
COPY <src> <dest>
當使用本地目錄爲源目錄時,推薦使用COPY
說明:指定鏡像的默認入口命令,該入口命令會在啓動容器時做爲根命令執行,因此傳入值做爲該命令的參數。
格式:
ENTRYPOINT ["executable","param1","param2"] exec調用執行
ENTRYPOINT command param1 param2 shell中執行
此時,CMD指令指定值將做爲根命令的參數。
每一個Dockerfile中只能有一個ENTRYPOINT,當指定多個時,只有最後一個有效。
在運行時,能夠被 --entrypoint參數覆蓋掉。
說明:建立一個數據卷掛載點。
格式:
VOLUME ["/data"]
能夠從本地主機或其餘容器掛載數據卷,通常用來存放數據庫和須要保存的數據等
說明:指定運行容器時的用戶名或UID,後續的RUN等指令也會使用指定的用戶身份。
格式:
USER daemon
當服務不須要管理員權限時,能夠經過該命令指定運行用戶,而且能夠在以前建立所須要的用戶。
RUN groupadd -r postgres && useradd -r -g postgress postgress
要零時獲取管理員權限可使用gosu或sudo
說明:爲後續的RUN、CMD和ENTRYPOINT指定配置的工做目錄。
格式:
WORKDIR /path/to/workdir
可使用多個WORKDIR指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑。
WORKDIR /a
WORKDIR b
WORKDIR c
則最終路徑爲/a/b/c
說明:指定一些鏡像內使用的參數(例如版本號信息),這些參數在執行docker build命令時才以--build-arg<varname>=<value>格式傳入。
格式:
ARG <name> [=<default value>]
說明:配置當前所建立的鏡像做爲其它鏡像的基礎鏡像時,所執行的建立操做指令。
格式:
ONBUILD [INSTRUCTION]
例如,Dockerfile使用以下類容建立的鏡像image-A
[...] ONBUILD ADD . /app/src [...]
若是基於鏡像image-A建立新的鏡像,那麼新的鏡像就會自動執行上面的ONBUILD指定的內容,相似於繼承的關係。
說明:指定所建立鏡像啓動的容器接收退出的信號值。
實例:
STOPSIGNAL signal
說明:配置所啓動容器如何進行健康檢查(如何判斷健康與否)
格式:
HEALTHCHECK [OPTIONS] CMD command 根據所執行命令返回值是否爲0來判斷
OPTION支持的選項:
--interval=DURATION(默認爲:30s) 過多久檢查一次
--timeout=DURAION(默認爲:30s) 每次檢查等待結果的超時
--retries=N(默認爲:3) 若是失敗了,重試幾回才最終肯定失敗
HEALTHCHECK NONE 禁止基礎鏡像中的健康檢查
說明:指定其它命令使用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;"]