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