赞
踩
在微服务项目开发中,我们常借助自动化工具的方式帮助我们实现项目部署,我们可以使用Docker帮助我们构建自动化构建流程,以提高工作效率。而Docker file 就是将软件包构建打包成镜像的文本文件。
大写字母
且后面至少跟一个参数。Docker file面向开发,Docker镜像逐渐成为应用交互新标准。Docker容器还涉及到部署、运维,三者缺一不可。
下面是常见的保留字列表信息:
指令 | 说明 |
---|---|
FROM | 基础镜像,指定一个已经存在的镜像为模版,且必须是Dockerfile中第一个指令 |
MAINAINER | 镜像维护者信息 |
RUN | 容器构建时需要的指令,有两种格式,shell、exec |
EXPOSE | 暴露端口 |
WORKDIR | 指定创建容器后,终端默认进来的工作目录 |
USER | 默认为root用户,也可指定其他linux用户 |
ENV | 构建时设置的环境变量 |
ADD | 将宿主机目录下的文件拷贝的命令,此命令会自动解压tar包 |
COPY | 也是文件拷贝命令,但不会自动解压tar包 |
VOLUME | 容器数据卷 |
CMD | 指定容器启动后执行的命令,在Dockerfile中只会有最后一条CMD命令生效,且会被docker run 命令之后参数替换 |
基础镜像,指定一个已经存在的镜像为模版,且必须是Dockerfile中第一个指令。如果不以任何镜像为基础,那么写法为:FROM scratch,常用语法格式如下:
FROM <image>
FROM <image>:<tag>
指定镜像维护作者信息
MAINTAINER <name>
构建过程中可指定的shell命令,RUN命令有两种格式:
1. RUN <command>
2. RUN ["executable", "param1", "param2"]
第一种后面直接跟shell命令,linux系统上默认/bin/sh -c,windows系统上默认 cmd /S/C。
第二种类似函数调用,可以将executable理解成可执行文件,后面跟着两个参数。
暴露容器运行时的监听端口给外部,这在容器内端口与宿主机端口绑定时特别有用,语法:
EXPOSE <port>
设置容器登录进来的终端默认工作目录,对 RUN,CMD,ENTRYPOINT,COPY,ADD 命令生效,语法:
WORKDIR /path/to/workdir
设置容器启动的用户,可以是用户名或UID,语法:
USER <username>
USER <uid>
为容器设置环境变量,语法有如下两种:
ENV <key> <value>
ENV <key>=<value> ...
第一种与第二种的区别为:第二种可以设置多次值,在Dockerfile中使用环境变量主要有如下四种模块:
可以将宿主机的文件拷贝到容器中,如果将容器想象为一个linux服务器,那么此命令类似与cp命令,语法如下所示:
1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"]
与上面命令ADD相似,唯一区别就是COPY只能拷贝本地文件,且压缩包文件不会自动解压。
声明一个容器卷,将宿主机目录挂载到容器中,语法如下:
VOLUME ["dirpath"]
VOLUME dirpath
容器启动时候执行的命令参数,语法如下:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
与RUN命令类似,区别是RUN命令在镜像构建过程中有效。需要注意的是CMD命令执行的参数,会被docker run 命令之后的参数给替换掉。
与CMD功能类似,也是在容器启动后执行的命令,语法如下所示:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
第一种语法就是可执行文件加参数(EXEC调用,可在docker run 启动时传递参数),与CMD的区别就是命令不会被docker run 启动的命令进行覆盖,还有就是当与CMD共用时,CMD的内容会作为ENTRYPOINT 的参数。
首先准备jdk8 软件包,然后编写Dockerfile如下所示:
# 以centos7系统为源镜像
FROM centos:7
MAINTAINER "galen"
# 安装vim命令与相关网络命令
RUN yum install -y net-tools vim*
# 设置时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" > /etc/timezone
# 解决中文乱码问题
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8
# 设置工作目录环境变量
ENV WORKDIR /app/
# 拷贝jdk8安装包
ADD jdk-8u192-linux-x64.tar.gz ${WORKDIR}
# 设置工作目录
WORKDIR ${WORKDIR}
# 设置JDK环境变量
ENV JAVA_HOME ${WORKDIR}/jdk1.8.0_192
ENV PATH ${JAVA_HOME}:${PATH}
# 验证JDK安装是否成功
CMD ["java","-version"]
然后构建执行命令,执行如下命令:
# 命令格式:docker build -f <dockerfile 文件路径> -t <镜像名:tag名>
# 命令简写如下(需确保Dockerfile和软件tar包在同一个路径下)
docker build -t jdk:8 .
可以清晰看到jdk8镜像已经构建成功。
仓库和标签都为none的镜像,发生在打包或者运行出错才会发生,例如:迁移镜像时,使用新的镜像覆盖原来的镜像,会使旧的镜像变为none。
# 虚悬镜像查询
docker image ls -f dangling=true
# 删除虚悬镜像
docker image prune
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。