docker-4 Dockerfile

什么是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

发布了58 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_32020035/article/details/84867295