Dockerfile:由一系列用於根據基礎鏡像構建新的鏡像文件的專用指令序列組成php
指令:選定基礎鏡像、安裝必要的程序、複製配置文件和數據文件、自動運行的服務以及要暴露的端口等html
命令:docker buildmysql
語法:指令行、註釋行和空白行nginx
指令行:由指令及指令參數構成web
指令:其字符不區分大小寫;約定俗成,要使用全大寫字符sql
註釋行:#開頭的行,必須單獨位於一行當中docker
空白行:會被忽略vim
指令:centos
FROM指令:必須是第一個非註釋行,用於指定所用到的基礎鏡像tomcat
語法格式: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"]