云计算核心技术Docker教程:Dockerfile文件HEALTHCHECK命令详解

来源:TECHWEB  责任编辑:小易  

ENV 设置环境变量 ENV ENV指令可以用2113于为docker容器5261设置环境变量4102 ENV设置的环境变量,可以使用 docker inspect命令来查1653看。同时还可以使用docker run --env =来修改环境变量www.zgxue.com防采集请勿采集本网。

Dockerfile文件HEALTHCHECK指令是告诉 Docker 应该如何进行判断容器的状态是否正常,这是 Docker 1.12 引入的新指令。

利用docker images 查看本地镜像信息,方便我们使用 [root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE docker.io/ubuntu latest af88597ec24b 39 hours ago 187.9 MB [root@docker ~]# 列出的信息有 镜像名、标签

timg

HEALTHCHECK语法格式:

一、准备工作 现在有非常多的Java Web框架,但我这里并不打算使用它们。我只想要的是一个小的框架所以我选择了Spark,它是一个基于Java 8的极小的框架。Spark使用Maven作为构建工具。 二、源代码和配置文件 在这个例子中你要增加三个文件: Mave

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令

这主要是通过跑分软件实现的,下面介绍几个。 GPU-Z 这其实不算是跑分软件,但确实检测显卡的第一步,主要任务是检查显卡参数是否正确、检查超频是否成功、以及理论上的顶点纹理处理速度。 3D Mark11 老牌的显卡性能测试软件,内部可大致分成E

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

这是一个新颖的想法,在码农的IDE环境中,若是可以很方便地使用Docker,真是一件很有意思的事:对Dockerfile或者Compose YML文件进行语法高亮、自动补全、语法验证,甚至还可以直接在IDE中启动这个Docker容器来进行更深入的测试或者开发。让懒惰

在没有 HEALTHCHECK 指令前,Docker 引擎只可以通过容器内主进程是否退出来判断容器是否状态异常。很多情况下这没问题,但是如果程序进入死锁状态,或者死循环状态,应用进程并不退出,但是该容器已经无法提供服务了。在 1.12 以前,Docker 不会检测到容器的这种状态,从而不会重新调度,导致可能会有部分容器已经无法提供服务了却还在接受用户请求。

docker buid -t

而自 1.12 之后,Docker 提供了 HEALTHCHECK 指令,通过该指令指定一行命令,用这行命令来判断容器主进程的服务状态是否还正常,从而比较真实的反应容器实际状态。

当在一个镜像指定了 HEALTHCHECK 指令后,用其启动容器,初始状态会为 starting,在 HEALTHCHECK 指令检查成功后变为 healthy,如果连续一定次数失败,则会变为 unhealthy。

HEALTHCHECK 支持下列选项:

--interval=<间隔>:两次健康检查的间隔,默认为 30 秒;

--timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;

--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。

和 CMD, ENTRYPOINT 一样,HEALTHCHECK 只可以出现一次,如果写了多个,只有最后一个生效。

在 HEALTHCHECK [选项] CMD 后面的命令,格式和 ENTRYPOINT 一样,分为 shell 格式,和 exec 格式。命令的返回值决定了该次健康检查的成功与否:0:成功;1:失败;2:保留,不要使用这个值。

如果健康检查连续失败超过了重试次数,状态就会变为 (unhealthy)。

为了帮助排障,健康检查命令的输出(包括 stdout 以及 stderr)都会被存储于健康状态里,可以用 docker inspect 来查看。

当想让一2113个容器做两件事情,5261或者使一个Docker镜像包含来自两个不同镜像的依赖4102库时,就1653需要知道每个镜像的Dockerfile。本文介绍了如何通过docker history命令来对Docker镜像进行反向工程,得到它们的Dockerfile,并组织到一个Dockerfile里然后build,从而实现想做的事情。常言道,“不要重复发明轮子!”在使用Docker时,构建自己的镜像之前,最好在Docker Hub寻找一些可以直接使用的镜像做练习。把软件架构分布到一系列容器中,每一个容器只做一件事情,这样的效果非常好。构建分布式应用的最好的基石是使用来自Docker Hub的官方镜像,因为可以信任它们的质量。在某些情况下,可能想让一个容器做两件不同的事情。而在另外一些情况下,可能想让一个Docker镜像包含来自两个不同镜像的依赖库。如果有每个镜像的Dockerfile,这是非常简单的。将它们组织到一个Dockerfile里然后build就行。然而,大多数时间都在使用Docker Hub上准备好的镜像,不会有它们的源Dockerfile。我花时间找一个可以合并(或flatten)两个不同Docker镜像的工具,当然没有它们的Dockerfile。也就是说在找一个能做下面这件事的东西:image 1 -- \ ---> merged_image_12 /image 2 --此前在GitHub上有两个相关的讨论(1、2),尽管它们都被关闭了。这可能吗?那么,是否存在工具能够像这样做吗:docker merge image2 image2 merged_image?没有!你甚至不可以用下面的方式来构建Dockerfile:FROM image1FROM image2简而言之,在一个Dockerfile里不能有多个基础镜像。但是我需要这个功能!唯一的解决办法是取得这些镜像的Dockerfile,然后把它们组织到一个文件中,再进行构建。那么,我能在Docker Hub上获得一个镜像的Dockerfile吗? 幸运的是可以。它不能离线获取(译注:原文是online,但显然online时对于来自GitHub的自动构建镜像是可以直接获取的),但是你可以使用docker history命令,通过反向工程获取。怎么来使用?在你的机器上使用docker pull从Docker Hub下载镜像。docker pull image1docker pull image2然后使用docker history来取得构建这两个容器时运行的命令。docker history --no-trunc=true image > image1-dockerfiledocker history --no-trunc=true image2 > image2-dockerfile接下来打开这两个文件,你可以看到每个镜像的命令堆栈。这是因为Docker镜像通过层(阅读更多)的方式来构建。即你在Dockerfile中键入的每一个命令所构建的新镜像,都是在之前的命令产生的镜像之上。所以你可以对镜像进行逆向工程。限制不能对镜像进行反向工程的唯一场景,是镜像的维护者在他的Dockerfile中使用了ADD或COPY命令。你会看到这样一行:ADD file:1ac56373f7983caf22 或 ADD dir:cf6fe659e9d21535844 这是因为不知道维护者在他自己的机器上,包括镜像里使用了什么本地文件内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 如何合并两个Docker 镜像
  • dockerfile env 怎么从命令获取变量
  • 怎么查看docker镜像的dockerfile
  • 如何构建基于docker的开发环境
  • 如何查看docker镜像的dockerfile
  • 如何使用Docker 进行Java 开发
  • 如何查看docker 的dockerfile 使用
  • docker-compose.yml文件如何识别变量
  • docker 怎么运行dockerfile
  • Dockerfile 中的Volume有什么意义,光用docker run
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved