文章目录
- 1. 前言
- 2. Docker file 核心要点
- 2.1 注意事项
- 2.2 Docker file 执行流程
- 2.3 Docker Image、Docker file、Docker Container区别
- 2.4 Dockerfile常用保留字指令
- 2.4.1 FROM
- 2.4.2 MAINTAINER
- 2.4.3 RUN
- 2.4.4 EXPOSE
- 2.4.5 WORKDIR
- 2.4.6 USER
- 2.4.7 ENV
- 2.4.8 ADD
- 2.4.9 COPY
- 2.4.10 VOLUME
- 2.4.11 CMD
- 2.4.12 ENTRYPOINT
- 3. 使用Docker file制作JDK8镜像
- 4. 虚悬镜像
1. 前言
在微服务项目开发中,我们常借助自动化工具的方式帮助我们实现项目部署,我们可以使用Docker帮助我们构建自动化构建流程,以提高工作效率。而Docker file 就是将软件包构建打包成镜像的文本文件。
2. Docker file 核心要点
2.1 注意事项
- Docker file中 每一个关键保留字都必须是
大写字母
且后面至少跟一个参数。 - 每一条指令都是顺序执行的。
- 每一个指令都会创建一个新的镜像层,并进行提交。
- # 代表注释
2.2 Docker file 执行流程
- Docker从基础镜像运行一个容器。
- 运行文件中的一条指令并对容器作出修改。
- 执行类似于docker commit 的操作并提交一个新镜像。
- docker在基于刚刚提交的镜像上运行一个新容器。
2.3 Docker Image、Docker file、Docker Container区别
Docker file面向开发,Docker镜像逐渐成为应用交互新标准。Docker容器还涉及到部署、运维,三者缺一不可。
- Dockerfile:软件镜像构建文件,定义了镜像构建过程中涉及到每一个步骤。
- Docker Image:Dockerfile构建生成的一个Docker镜像。
- Docker Container:容器就是镜像运行起来的一个实例。
2.4 Dockerfile常用保留字指令
下面是常见的保留字列表信息:
指令 | 说明 |
---|---|
FROM | 基础镜像,指定一个已经存在的镜像为模版,且必须是Dockerfile中第一个指令 |
MAINAINER | 镜像维护者信息 |
RUN | 容器构建时需要的指令,有两种格式,shell、exec |
EXPOSE | 暴露端口 |
WORKDIR | 指定创建容器后,终端默认进来的工作目录 |
USER | 默认为root用户,也可指定其他linux用户 |
ENV | 构建时设置的环境变量 |
ADD | 将宿主机目录下的文件拷贝的命令,此命令会自动解压tar包 |
COPY | 也是文件拷贝命令,但不会自动解压tar包 |
VOLUME | 容器数据卷 |
CMD | 指定容器启动后执行的命令,在Dockerfile中只会有最后一条CMD命令生效,且会被docker run 命令之后参数替换 |
2.4.1 FROM
基础镜像,指定一个已经存在的镜像为模版,且必须是Dockerfile中第一个指令。如果不以任何镜像为基础,那么写法为:FROM scratch,常用语法格式如下:
FROM <image>
FROM <image>:<tag>
2.4.2 MAINTAINER
指定镜像维护作者信息
MAINTAINER <name>
2.4.3 RUN
构建过程中可指定的shell命令,RUN命令有两种格式:
1. RUN <command>
2. RUN ["executable", "param1", "param2"]
第一种后面直接跟shell命令,linux系统上默认/bin/sh -c,windows系统上默认 cmd /S/C。
第二种类似函数调用,可以将executable理解成可执行文件,后面跟着两个参数。
2.4.4 EXPOSE
暴露容器运行时的监听端口给外部,这在容器内端口与宿主机端口绑定时特别有用,语法:
EXPOSE <port>
2.4.5 WORKDIR
设置容器登录进来的终端默认工作目录,对 RUN,CMD,ENTRYPOINT,COPY,ADD 命令生效,语法:
WORKDIR /path/to/workdir
2.4.6 USER
设置容器启动的用户,可以是用户名或UID,语法:
USER <username>
USER <uid>
2.4.7 ENV
为容器设置环境变量,语法有如下两种:
ENV <key> <value>
ENV <key>=<value> ...
第一种与第二种的区别为:第二种可以设置多次值,在Dockerfile中使用环境变量主要有如下四种模块:
- $key
- ${key}
- ${key:-default value}
- ${key:+default value}
上面表达式中第一种与第二种相同,第三种表示变量不存在时候使用默认值,第三种是变量存在使用默认值
2.4.8 ADD
可以将宿主机的文件拷贝到容器中,如果将容器想象为一个linux服务器,那么此命令类似与cp命令,语法如下所示:
1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"]
- 路径可以是容器内绝对路径,也可以是相对于工作目录的相对路径,一般都是使用绝对路径。
- 如果源文件是tar文件,拷贝到容器后会被自动解压。
- 源文件也可以是一个url,此时ADD命令类似与wget命令
- 如果源文件是一个目录,会自动把目录下的文件复制到容器中,目录本身并不会被拷贝。
2.4.9 COPY
与上面命令ADD相似,唯一区别就是COPY只能拷贝本地文件,且压缩包文件不会自动解压。
2.4.10 VOLUME
声明一个容器卷,将宿主机目录挂载到容器中,语法如下:
VOLUME ["dirpath"]
VOLUME dirpath
2.4.11 CMD
容器启动时候执行的命令参数,语法如下:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
与RUN命令类似,区别是RUN命令在镜像构建过程中有效。需要注意的是CMD命令执行的参数,会被docker run 命令之后的参数给替换掉。
2.4.12 ENTRYPOINT
与CMD功能类似,也是在容器启动后执行的命令,语法如下所示:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2
第一种语法就是可执行文件加参数(EXEC调用,可在docker run 启动时传递参数),与CMD的区别就是命令不会被docker run 启动的命令进行覆盖,还有就是当与CMD共用时,CMD的内容会作为ENTRYPOINT 的参数。
3. 使用Docker file制作JDK8镜像
首先准备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镜像已经构建成功。
4. 虚悬镜像
仓库和标签都为none的镜像,发生在打包或者运行出错才会发生,例如:迁移镜像时,使用新的镜像覆盖原来的镜像,会使旧的镜像变为none。
# 虚悬镜像查询
docker image ls -f dangling=true
# 删除虚悬镜像
docker image prune