Docker入门之使用Dockerfile 构建镜像(七)

1. 前言

在微服务项目开发中,我们常借助自动化工具的方式帮助我们实现项目部署,我们可以使用Docker帮助我们构建自动化构建流程,以提高工作效率。而Docker file 就是将软件包构建打包成镜像的文本文件。

2. Docker file 核心要点

2.1 注意事项

  1. Docker file中 每一个关键保留字都必须是 大写字母 且后面至少跟一个参数。
  2. 每一条指令都是顺序执行的。
  3. 每一个指令都会创建一个新的镜像层,并进行提交。
  4. # 代表注释

2.2 Docker file 执行流程

  1. Docker从基础镜像运行一个容器。
  2. 运行文件中的一条指令并对容器作出修改。
  3. 执行类似于docker commit 的操作并提交一个新镜像。
  4. docker在基于刚刚提交的镜像上运行一个新容器。

2.3 Docker Image、Docker file、Docker Container区别

Docker file面向开发,Docker镜像逐渐成为应用交互新标准。Docker容器还涉及到部署、运维,三者缺一不可。
在这里插入图片描述

  1. Dockerfile:软件镜像构建文件,定义了镜像构建过程中涉及到每一个步骤。
  2. Docker Image:Dockerfile构建生成的一个Docker镜像。
  3. 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
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值