构建Docker镜像应该遵循哪些原则?

以下为《Docker常见面试题》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

地址可以为国内镜像地址,也***内网镜像仓库地址。

30.Docker的配置文件放在那里。如何修改配置?

31.如何更改Docker的默认存储设置?

Docker的默认存放位置是/var/lib/docker,如果希望将Docker的本地文件存储到其他分区,可以使用Linux软连接的方式来做。

LXC利用Linux上相关技术实现容器,Docker则在如下的几个方面进行了改进:

移植性:通过抽象容器配置,容器可以实现一个平台移植到另一个平台;

镜像系统:基于AUFS的镜像系统为容器的分发带来了很多的便利,同时共同的镜像层只需要存储一份,实现高效率的存储;

版本管理:类似于GIT的版本管理理念,用户可以更方面的创建、管理镜像文件;

仓库系统:仓库系统大大降低了镜像的分发和管理的成本;

周边工具:各种现有的工具(配置管理、云平台)对Docker的支持,以及基于Docker的Pass、CI等系统,让Docker的应用更加方便和多样化。

[全文已结束,注意以上仅为全文的文字预览,不包含图片和表格以及排版]请点击下方选择您需要的文档下载。

以上为《Docker常见面试题》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

声明:本文乃“运维家”原创,转载请注明出处,更多内容请关注公众号“运维家”。

上一篇文章介绍了使用commit方式来构建自定义镜像,那么本文来介绍下主流方式,如何使用dockerfile来构建镜像。

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

本文使用nginx镜像来做示范,故而需要先下载一个nginx镜像;

文件名必须是Dockerfile,且该目录下不要存放无用的文件。

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。
RUN:用于执行后面跟着的命令行命令。有以下两种格式:
 # 命令行命令就是在终端shell中执行的命令
 exec格式:RUN [“可执行文件”,“参数1”,“参数2”]

注意:Dockerfile的指令,每执行一次都会在docker上新建一层,这样子就会造成制作出来的镜像变的很大,我们争取能一行写完的内容,就不要写多行,这也是很多人制作完镜像之后发现自己的镜像特别大的原因所在。

这是运维家进行测试的一个nginx镜像

复制文件,将宿主机的文件或者目录复制到容器指定目录中。

<目标路径>:不需要提前创建好,如果不存在,会自动创建

类似于RUN命令,不同之处如下:

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果dockerfile中存在多个CMD指令,那么只有最后一个生效。

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序,这句话什么意思呢,就是说你ENTRYPOINT指定的东西,如果需要参数,那么你用docker run的时候可以再指定。但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT

可以搭配CMD命令使用,实例如下:

# 容器中相当于执行了如下命令 # 容器中相当于执行了如下命令

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。这样子可以避免你把数据存放到docker容器里面,后面一不小心删除容器的情况。也可以避免容器随着数据的存放越来越大。

当然了,在启动容器的时候我们可以覆盖此项配置,使用 -v 参数即可修改挂载点。

申明端口,帮助镜像使用者理解守护端口,以方便配置映射;在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

指定工作目录,即切换目录,且此目录必须是提前创建好的。

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

用于延迟构建命令的执行。简单的来说,比如你此次创建的镜像A,使用了ONBUILD指定了一个命令,那么你在构建镜像A中是不会执行这个命令的;但是当有人用你的镜像A构建其他镜像的时候,就会执行ONBUILD指定的命令了。

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式。

上期的文章:发布后,有网友留言说我文章里演示的镜像是把项目文件和Go都打包到了镜像里,这样镜像的占用空间会比较大。

Go开发的程序在编译成二进制文件后是可以在没有安装Go环境的系统里执行的,如果只把编译完的二进制文件直接放到镜像里就能节省很多镜像空间了。我给的回复是文章的侧重点是Kubernetes的实践所以镜像方面就没有占太多篇幅。

确实真实线上项目的应用镜像一般都不像之前文章里讲那样构建,因为生产项目各方面要求更严格些。镜像构建的过程一般都是先用Docker容器把项目编译成二进制文件,然后把编译好的文件拷贝到一个新的容器镜像里,新镜像里一般只包含Linux系统运行需要的最基本的文件,不需要有Go环境,因此能减少很多占用空间。整个这个过程都发生在镜像构建的过程中,这样就能保证多环境的一致性,上面这个构建Docker镜像的方式叫做多阶段构建(multi

多阶段构建是17.05版本才有的功能,所以使用前要先确定下使用的Docker Engine的版本。

下面就来介绍一下怎么使用Docker的多阶段构建制作Go应用的镜像。

之前文章里镜像的Dockerfile长这样:

我们使用用多阶段构建的方式构建镜像后,Dockerfile会变成类似下面这样:

Go项目应用的Dockerfile通常大概类似这样,但是每个项目的细节可能有所不同。FROM golang:alpine指定了开始阶段的基础映像(其中包含Go工具和库,用于构建程序),AS build是给这个阶段取名为build

scratch行,它告诉Docker从一个全新的,完全空的容器镜像重新开始,然后将上个阶段编译好的程序复制到其中。这个才是我们随后将用于运行的Go应用程序的容器镜像。

scratch镜像是Docker项目预定义的最小的镜像。 Docker用于Go程序的多阶段构建很常见,使用scratch镜像可以节省大量空间,因为我们实际上不需要Go工具或其他任何东西来运行我们的编译好的程序,这可能也是Go在容器时代的一个优势吧。

使用scratch镜像制作的Go应用镜像在运行时会有一个不识别时区的问题,这个也是我们最近项目往Kubernetes上迁移时遇到的第一个问题,不过还好经过Google和查看Go加载时区的源码找到了解决方法,具体怎么解决的下期的文章再告诉大家。


有疑问加站长微信联系(非本文作者)

我要回帖

更多关于 创建docker镜像的方法 的文章

 

随机推荐