Dockerfile是用来构建
docker
镜像的文件,是一个命令参数脚本。DockerFile是面向开发的,发布项目的时候需要做镜像,就要编写dockerfile文件。如果对docker还不太了解的小伙伴,请先移步
浅谈Docker
。
构建步骤:
编写一个dockerfile文件
docker build 构建一个镜像
docker run 运行镜像
docker push 发布镜像(DockerHub、阿里云从仓库等)
Dockerfile
基础知识
1、每个指令都必须是大写字母;
2、执行顺序从上到下;
3、#表示注释;
4、每一个指令都会提交一个新的镜像层,并提交。
# DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 拷贝文件(支持正则表达式)到镜像,并自动解压(如果是压缩包)
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
一个SpringBoot的小例子
FROM java:8
#此处的*为正则表达式,表示以.jar结尾的同步录下的文件(这里的jar是maven打包好的)
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
常用命令的用法
FROM
– – -指定基础镜像
如果本地不存在基础镜像,则首先从DockerHub拉去下来。
FROM java:8 # java可替换成任意镜像名,":"是可选项,后接版本,如果不指定版本则默认使用latest
MAINTAINER
– – – 指定Dockerfile制作人的信息
MAINTANIER "yxzhang <5xxxxxxxxxx@qq.com>"
COPY
– – – 把宿主机的文件复制到镜像中
COPY src desc
其中src表示宿主机上的路径(支持通配符,如*和?;通常使用相对路径);
desc表示目标镜像中的路径(通常使用绝对路径,如果不存在会被自动创建,包括父目录)。
Note:如果src是目录,则其内部文件或子目录会被递归复制,但src目录自身不会被复制。
ADD – – – 与COPY命令类似
ADD src desc
与COPY不同的是,ADD可以访问url路径,会访问网络进行下载,档到本地后打包到镜像。
此外,如果src是压缩包的话,会自动进行解压;但通过url获取的tar文件不会被展开。
WORKDIR
– – – 指定工作目录
WORKDIR /usr/local/
默认的镜像工作目录是在根目录下,如果使用WORKDIR命令指定了工作目录在 /usr/local/ 下,则如果使用命令 ADD nginx-1.14.2.tar.gz ./ ,此时nginx压缩包就被拷贝到 /usr/local/ 下面,而非默认的根路径下。
VOLUME – – – 卷挂载
VOLUME /data/mysql
运行时会在会随机在宿主机的目录下生成一个卷目录,该命令只能定义docker管理的卷。如果要实现指定路径形式的挂载,需要在创建好镜像以后用
docker run -v aaa:bbb
的方式指定。
EXPOSE
– – – 为容器打开指定的要监听的端口以实现与外部通信
EXPOSE port
port 为 0-65535 中的一个整数,暴露容器将要提供服务所开放的端口。例如 nginx 暴露的端口为80。但通过这种方式,宿主机每次与容器映射的端口是随机的,也可以在 docker run -p 8888:80 进行端口的映射绑定。
ENV
用于为镜像定义所需要的环境变量,并可以被Dockerfile中位于其后面的其他命令调用,例如:
ENV JAVAPATH /usr/local # 指定JAVAPATH变量的值为/usr/local/
ENV PATH $JAVAPATH/bin # 利用 $ 引用上面的JAVAPATH
RUN
构建镜像时需要执行的命令。例如在一个拉去下来的centos中安装vim工具:
FROM centos
RUN yum -y install vim
CMD
指定容器在运行时(执行docker run)的时候要执行的命令,只有最后一条命令生效,可被替代。
CMD ["ls","-a"]
ENTRYPOINT
用法和 CMD 相似,但是我们可以在 docker run 后面追加参数,会作为 ENTRYPOINT 的参数,即不会被覆盖。如果 docker run 后面没有额外的东西,但是 CMD 有,那么cmd的全部内容会作为 entrypoint 的参数。
更详细的关于CMD和ENTRYPOINT区别的内容可以参考
这篇文章
。