什么是dockerfile
Dockerfile是用来构建Docker镜像的构建文件,是一系列命令和参数构成的脚本
构建三步骤
编写Dockerfile文件–>docker build–>docker run
类比java
maven build–>jar–>java -jar ms…
centos示例文件
FROM scratch
MAINTAINER The CentOS Project <[email protected]>
ADD c68-docker.tar.xz /
LABEL name="Centos Base Image" \
vendor="CentOS" \
license="GPLv2" \
build-date="2016-06-02"
# Default command
CMD ["/bin/bash"]
DockerFile构建过程
基本知识
1.每条保留字指令必须大写且后面要跟随至少一个参数
2.指令按照从上到下顺序执行
3.#表示注释
4.每条指令会构建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程
1.docker从基础镜像运行一个容器
2.执行命令并对容器做出修改
3.执行类似docker commit的操作提交一个新的镜像层
4.docker再基于刚提交的镜像运行一个新容器
5.执行dockerfile中的下一条指令知道所有指令执行完成
小总结
Dockerfile,Docker镜像,Docker容器代表软件的三个不同阶段。
Dockerfile是软件原材料,源码
Docker镜像是软件交付品,类似于class
Docker容器是软件的运行态,直接提供服务
Dockerfile面向开发,Docker镜像是交付标准,Docker容器是部署和运维
dockerfile的指令
FROM,MAINTAINER,RUN,EXPOSE,WORKDIR,ENV,ADD,COPY,VOLUME,CMD,ENTRYPOINT,ONBUILD
Dockerfile的指令可以分为三类,BUILD,Both,Run
BUILD | Both | Run |
---|---|---|
FROM | WORKDIR | CMD |
MAINTAINER | USER | ENV |
COPY | EXPOSE | |
ADD | VOLUME | |
RUN | ENTRYPOINT | |
ONBUILD |
BUILD
FROM
基础镜像,当前新镜像基于那个镜像。所有镜像都基于scratch,它相当于Object
FROM 镜像名
或
FROM 镜像名:标签
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
(RUN命令可以使用\以式多行)
RUN 命令(shell形式)
或
RUN ["可执行命令","参数1","参数2"](exec形式)
ADD
将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY 文件路径,文件放置到容器内的路径
COPY
类似ADD,拷贝文件和目录到镜像中
将从dockerfile当前目录下的文件/目录复制到新的一层镜像内
COPY 上下文根目录的相对路径,文件放置到容器内的路径
ONBUILD
当构建一个被继承的Dockerfile时运行命令,福镜像在被子继承后,父镜像的onbuild将会被触发
Both
WORKDIR
指定在创建容器后,终端进来后的工作目录
WORKDIR $MY_PATH
RUN
EXPOSE
当前容器对外暴露出的端口
ENV
用来设置环境变量,后续指令可以使用
ENV key value
或
ENV key=value
VOLUME
容器数据卷,用于数据保存和持久化工作的
CMD
指定一个容器启动时需要运行的命令
可以存在多个CMD命令,但只会有最后一个生效,CMD会被docker run之后的参数替换
CMD的格式:
CMD 命令(shell形式)
CMD ["可执行命令",“参数1”,"参数2"](exec形式)
ENTRYPOINT
指定一个容器启动时需要运行的命令
和CMD一样,都是在指定容器启动程序和参数
ENTRYPOINT命令(shell形式)
ENTRYPOINT["可执行命令",“参数1”,"参数2"](exec形式)
CMD和ENTRYPOINT的区别
CMD
dockerfile可以有多个CMD指令,但只会有最后一个生效,CMD会被docker run之后的参数覆盖
如 docker run -it p 8888:8080 tomcat ls -l
此处的ls -l会覆盖dockerfile里的命令
ENTRYPOINT
docker run之后的参数会被当做参数传递给ENTRYPOINT,形成新的命令
如CMD ["curl","-s","http://ip.cn"]
这个不允许docker run添加参数,而ENTRYPOINT["curl","-s","http://ip.cn"]
可以使用docker run 镜像id -i
,-i参数将会附加到命令后面,形成一个新的命令
示例文件
FROM centos
MAINTAINER zzyy<[email protected]>
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
FROM centos
MAINTAINER zzyy<[email protected]>
COPY c.txt /usr/local/cincontainer.txt
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
RUN yum -y install vim
ENV MYPATH /usr/local
WORKDIR $MYPATH
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.ar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr.local/apache-tomcat-9.08
ENV CATALINA_BASE /usr.local/apache-tomcat-9.08
ENV PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
EXPOSE 8080
#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