Dockerfile是用來構建Docker鏡像的構建文件,是由一系列命令和參數構成的腳本。java
以咱們熟悉的CentOS爲例 ,tag爲latest, centos8, 8, centos8.1.1911, 8.1.1911
的Dockerfile:linux
FROM scratch ADD CentOS-8-Container-8.1.1911-20200113.3-layer.x86_64.tar.xz / LABEL org.label-schema.schema-version="1.0" \ org.label-schema.name="CentOS Base Image" \ org.label-schema.vendor="CentOS" \ org.label-schema.license="GPLv2" \ org.label-schema.build-date="20200114" \ org.opencontainers.image.title="CentOS Base Image" \ org.opencontainers.image.vendor="CentOS" \ org.opencontainers.image.licenses="GPL-2.0-only" \ org.opencontainers.image.created="2020-01-14 00:00:00-08:00" CMD ["/bin/bash"]
從應用軟件的角度來看,Dockerfile、Docker鏡像與Docker容器分別表明軟件的三個不一樣階段,docker
Dockerfile是軟件的原材料apache
Docker鏡像是軟件的交付品vim
Docker容器則能夠認爲是軟件的運行態。centos
Dockerfile面向開發,Docker鏡像成爲交付標準,Docker容器則涉及部署與運維,三者缺一不可,協力充當Docker體系的基石。tomcat
命令 | 說明 |
---|---|
FROM | 基礎鏡像,當前新鏡像是基於哪一個鏡像的 |
MAINTAINER | 鏡像維護者的姓名和郵箱地址 |
RUN | 容器構建時須要運行的命令 |
EXPOSE | 當前容器對外暴露出的端口 |
WORKDIR | 指定在建立容器後,終端默認登錄的進來工做目錄,一個落腳點 |
ENV | 用來在構建鏡像過程當中設置環境變量;<br/>ENV MY_PATH /usr/mytest<br/>這個環境變量能夠在後續的任何RUN指令中使用,這就如同在命令前面指定了環境變量前綴同樣;<br/>也能夠在其它指令中直接使用這些環境變量,<br/> <br/>好比:WORKDIR $MY_PATH |
ADD | 將宿主機目錄下的文件拷貝進鏡像且ADD命令會自動處理URL和解壓tar壓縮包 |
COPY | 相似ADD,拷貝文件和目錄到鏡像中。將從構建上下文目錄中 <源路徑> 的文件/目錄複製到新的一層的鏡像內的 <目標路徑> 位置;<br/>COPY src dest;<br/>COPY ["src", "dest"] |
VOLUME | 容器數據卷,用於數據保存和持久化工做 |
CMD | 指定一個容器啓動時要運行的命令;<br/>Dockerfile 中能夠有多個 CMD 指令,但只有最後一個生效,CMD 會被 docker run 以後的參數替換 |
ENTRYPOINT | 指定一個容器啓動時要運行的命令;<br/>ENTRYPOINT 的目的和 CMD 同樣,都是在指定容器啓動程序及參數 |
ONBUILD | 當構建一個被繼承的Dockerfile時運行命令,父鏡像在被子繼承後父鏡像的onbuild被觸發 |
Docker Hub 中 99% 的鏡像都是經過在 base 鏡像中安裝和配置須要的軟件構建出來的bash
自定義mycentos目的使咱們本身的鏡像具有以下:網絡
FROM centos MAINTAINER zzyy<zzyy167@126.com> ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install vim RUN yum -y install net-tools EXPOSE 80 CMD echo $MYPATH CMD echo "success--------------ok" CMD /bin/bash
docker build -t 新鏡像名字:TAG .
會看到 docker build 命令最後有一個 .
運維
.
表示當前目錄
docker build -f /mydocker/dockerfile2 -t mycentos:1.3 .
docker run -it 新鏡像名字:TAG
能夠看到,咱們本身的新鏡像已經支持vim/ifconfig命令,擴展成功了。
docker history 鏡像名
都是指定一個容器啓動時要運行的命令,差異以下:
FROM centos MAINTAINER zzyy<zzyybs@126.com> #把宿主機當前上下文的c.txt拷貝到容器/usr/local/路徑下 COPY c.txt /usr/local/cincontainer.txt #把java與tomcat添加到容器中 ADD jdk-8u171-linux-x64.tar.gz /usr/local/ ADD apache-tomcat-9.0.8.tar.gz /usr/local/ #安裝vim編輯器 RUN yum -y install vim #設置工做訪問時候的WORKDIR路徑,登陸落腳點 ENV MYPATH /usr/local WORKDIR $MYPATH #配置java與tomcat環境變量 ENV JAVA_HOME /usr/local/jdk1.8.0_171 ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8 ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8 ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin #容器運行時監聽的端口 EXPOSE 8080 #啓動時運行tomcat # ENTRYPOINT ["/usr/local/apache-tomcat-9.0.8/bin/startup.sh" ] # CMD ["/usr/local/apache-tomcat-9.0.8/bin/catalina.sh","run"] CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out