Dockerfile:由一系列用於根據基礎鏡像構建新的鏡像文件的專用指令序列組成
指令:選定基礎鏡像、安裝必要的程序、復制配置文件和數據文件、自動運行的服務以及要暴露的端口等
命令:docker build
語法:指令行、注釋行和空白行
指令行:由指令及指令參數構成
指令:其字符不區分大小寫;約定俗成,要使用全大寫字符
注釋行:#開頭的行,必須單獨位於一行當中
空白行:會被忽略
指令:
FROM指令:必須是第一個非注釋行,用於指定所用到的基礎鏡像
語法格式:FROM <image>[:<tag>] 或 FROM <image>@<digest>
例如:FROM busybox:latest FROM centos:6.9
注意:盡量不要在一個dockerfile文件中使用多個FROM指令
MAINTANIER指令:用於提供信息的指令,用於讓作者提供本人的信息;不限制其出現的位置,但建議緊跟在FROM之后
語法格式: MAINTANIER <author's detail>
例如:MAINTANIER john <john@gmail.com>
COPY指令:用於從docker主機復制文件至正在創建的映像文件中
語法格式:COPY <src> ... <dest> 或者 COPY ["<src>",... "<dest>"] (文件名中有空白字符時使用此種格式)
<src>:要復制的源文件或目錄,支持使用通配符
<dest>:目標路徑,正在創建的鏡像文件的文件系統路徑;建立使用絕對路徑,否則,則相對於WORKDIR而言
所有新復制生成的目錄文件的UID和GID均為0
例如:COPY server.xml /etc/tomcat/server.xml COPY *.conf /etc/httpd/conf.d/
注意:<src>必須是build上下文中的路徑,因此,不能使用類似“../some_dir/some_file”類的路徑
<src>如果是目錄,遞歸復制會自動行;如果有多個<src>,包括在<src>上使用了通配符這種情形,此時<dest>必須
是目錄,而且必須得以/結尾
<dest>如果事先不存在,它將被自動創建,包括其父目錄
ADD指令:類似於COPY指令,額外還支持復制TAR文件,以及URL路徑
語法格式:ADD <src> ... <dest> ADD ["<src>",... "<dest>"]
例如:ADD haproxy.cfg /etc/haproxy/haproxy.cfg ADD logstash_*.cnf /etc/logstash/
ADD http://www.magedu.com/download/nginx/conf/nginx.conf /etc/nginx/
注意:以URL格式指定的源文件,下載完成后其目標文件的權限為600
如果<src>是URL,且<dest>不以/結尾,則<src>指定的文件將被下載並直接被創建為<dest>;如果<dest>以/結尾,則
URL指定的文件將被下載至<dest>中,並保留原名
如果<src>是一個host本地的文件系統上的tar格式的文件,它將被展開為一個目錄,其行為類似於tar -x命令;但是,如果
通過URL下載到的文件是tar格式的,是不會自動進行展開操作的
<src>如果是目錄,遞歸復制會自動行;如果有多個<src>,包括在<src>上使用了通配符這種情形,此時<dest>必須是目
錄,而且必須得以/結尾
<dest>如果事先不存在,它將被自動創建,包括其父目錄
ENV指令:定義環境變量,此些變量可被當前dockerfile文件中的其它指令所調用,調用格式為$variable_name或
${variable_name}
語法:ENV <key> <value> 一次定義一個變量
ENV <key>=<value> ... 一次可定義多個變量 ,如果<value>中有空白字符,要使用\字符進行轉義或加引號
例如:ENV myName="Obama Clark" myDog=Hello\ Dog 等同於 ENV myName Obama Clark
ENV myDog Hello Dog
ENV定義的環境變量在鏡像運行的整個過程中一直存在,因此,可以使用inspect命令查看,甚至也可以在docker run啟動此
鏡像時,使用--env選項來修改指定變量的值
USER指令:指定運行鏡像時,或運行Dockerfile文件中的任何RUN/CMD/ENTRYPOINT指令指定的程序時的用戶名或UID
語法格式:USER <UID>|<Username>
注意:<UID>應該使用/etc/passwd文件存在的用戶的UID,否則,docker run可能會出錯
WORKDIR指令:用於為Dockerfile中所有的RUN/CMD/ENTRYPOINT/COPY/ADD指令指定工作目錄
語法格式:WORKDIR <dirpath>
注意:WORDIR可出現多次,也可使用相對路徑,此時表示相對於前一個WORKDIR指令指定的路徑;WORKDIR還可以調用
由ENV定義的環境變量的值
例如:WORKDIR /var/log WORKDIR $STATEPATH
VOLUME指令:用於目標鏡像文件中創建一個掛載點目錄,用於掛載主機上的卷或其它容器的卷
語法格式:VOLUME <mountpoint> VOLUME ["<mountpoint>", ...]
注意:如果mountpoint路徑下事先有文件存在,docker run命令會在卷掛載完成后將此前的文件復制到新掛載的卷中
RUN指令:用於指定docker build過程中要運行的命令,而不是docker run此dockerfile構建成的鏡像時運行
語法格式:RUN <command> 或 RUN ["<executeable>", "<param1>", "<param2>", ...]
例如:RUN yum install iproute nginx && yum clean all
CMD指令:類似於RUN指令,用於運行程序;但二者運行的時間點不同;CMD在docker run時運行,而非docker build
CMD指令的首要目的在於為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束;不過,CMD指令指定的程序
可被docker run命令行參數中指定要運行的程序所覆蓋
語法格式:CMD <command> 或 CMD ["<executeable>", "<param1>", "<param2>", ...] 或 CMD [ "
<param1>", "<param2>", ...]
當時用第一種格式時,運行的容器不能被docker stop命令停止,第二種格式可以使用docker stop命令停止
第三種為ENTRYPOINT指令指定的程序提供默認參數
注意:如果dockerfile中存在多個CMD指令,僅最后一個生效
CMD ["/usr/sbin/httpd", "-c","/etc/httpd/conf/httpd.conf"]
ENTRYPOINT指令:類似於CMD指令,但其不會被docker run的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當
作參數送給ENTRYPOINT指令指定的程序
但是,如果運行docker run時使用了--entrypoint選項,此選項的參數可當作要運行的程序覆蓋ENTRYPOINT指令指定的程
序
語法格式:ENTRYPOINT <command> 或 ENTRYPOINT ["<executeable>", "<param1>", "<param2>", ...]
例如:CMD ["-c"] ENTRYPOINT ["top", "-b"]等同於 ENTRYPOINT ["top", "-b","-c"]
EXPOSE指令:用於為容器指定要暴露的端口
語法格式:EXPOSE <port>[/<protocol>] [<port>[/<protocol>]] ...
<protocol>為tcp或udp二者之一,默認為tcp
例如:EXPOSE 11211/tcp 11211/udp
ONBUILD指令:定義觸發器
當前dockerfile構建出的鏡像被用作基礎鏡像去構建其它鏡像時,ONBUILD指令指定的操作才會被執行
語法格式:ONBUILD <INSTRUCTION>
例如:ONBUILD ADD my.cnf /etc/mysql/my.cnf
注意:ONBUILD不能自我嵌套,且不會觸發FROM和MAINTAINER指令
一個示例:vim busybox.dockerfile
#test
FROM busybox:latest
MAINTAINER John <john@gmail.com>
COPY index.html /web/html/index.html
EXPOSE 80/tcp
CMD ["httpd","-f","-h","/web/html"]
接下來創建html文件:vim index.html
<h1>Frome Docker Container(Dockerfile)<h1/>
使用docker help build查看命令幫助
創建一個工作目錄:mkdir docker 將dockerfile文件移動到工作目錄下mv busybox:dockerfile docker/
將html文件也移動到工作目錄下mv index.html docker/
創建docker文件 docker build -f /root/docker/busybox\:dockerfile -t busybox:webserver /root/docker/ -f指定dockerfile
文件,-t指定REPOSITORY和TAG
運行創建的image:docker run -d --name web -P busybox:webserver -d表示在后台運行,-P表示暴露所有端口,這個必須有
示例2:httpd
FROM centos:latest
MAINTAINER John <john@gmail.com>
RUN sed -i -e 's@^mirrorlist.*repo=os.*$@baseurl=http://172.16.0.1/cobbler/ks_mirror/$releasever/@g' -e
'/^mirrorlist.*repo=updates/a enabled=0' -e '/^mirrorlist.*repo=extras/a enabled=0' /etc/yum.repos.d/CentOS-
Base.repo && \
yum -y install httpd php php-mysql php-mbstring && \
yum clean all && \
echo -e '<?php\n\tphpinfo();\n?>' > /var/www/html/info.php
EXPOSE 80/tcp
CMD ["/usr/sbin/httpd","-f","/etc/httpd/conf/httpd.conf","-DFOREGROUND"]