docker-6.使用Dockerfile定制镜像

一般情况下,Dockerfile分为四部分:基础镜像信息、维护者、镜像操作指令和容器启动时执行的指令

例:

#This Dockerfile uses the centos image

#This is a nginx web server

#version 0.1

#time 2017年10月27日13:00:01

#指定基础镜像,可同时指定多个镜像

FROM centos

#维护者

MAINTAINER blog.rootr.cn [email protected]

#指定运行容器时的用户名或UID,RUN也会使用指定用户,获取临时管理员权限推荐使用gosu

#USER root

#为后续的RUN、CMD、ENTRYPOINT指令配置工作目录

WORKDIR /root

#镜像操作指令

RUN yum update -y

RUN yum install -y epel-release

#指定环境变量,供后面的RUN指令使用

ENV web_server_name nginx

RUN yum install -y $web_server_name

#复制指定的<src>到容器中的<dest>。<src>可以是Dockerfile所在目录的相对路径(文件或目录);也可以是URL(默认权限600)或tar文件(自动解压为目录)

RUN mkdir /usr/share/nginx/html/a

ADD http://192.168.200.1/index.html /usr/share/nginx/html/a/

RUN chmod 777 /usr/share/nginx/html/a/index.html

#复制本地主机的<src>到容器中的<dest>。<src>可以是Dockerfile所在目录的相对路径(文件或目录)。目标路径不存在自动创建

COPY index.html /usr/share/nginx/html/

#创建本地主机或其他容器的挂载点

VOLUME /data/backup

#声明容器需要暴露的端口号

EXPOSE 80 443

#配置容器启动后执行的命令,不会被用户启动容器指定的参数覆盖(每个Dockerfile只能有一条ENTRYPOINT指令)

#ENTRYPOINT command --parameter

#检查容器健康状况(每个Dockerfile只能有一条HEALTHCHECK指令) --interval:两次健康检查间隔 --timeout:超时时间 --retries:连续失败指定次数后,容器状态将更改为unhealthy

#命令的返回值决定了该次健康检查的成功与否: 0:成功; 1:失败; 2:保留,不要使用这个值。

HEALTHCHECK --interval=15s --timeout=5s --retries=3 \

CMD curl -fs http://127.0.0.1/ || exit 1

#容器启动时执行的指令(每个Dockerfile只能有一条CMD指令。如果用户启动容器时指定了参数,则不会被执行)

CMD ["nginx","-g","daemon off;"]

CMD、RUN、ENTRYPOINT的格式

*shell 格式: CMD <命令>

*exec 格式: CMD ["可执行文件", "参数1", "参数2"...]

shell 格式:实际的命令会被包装为 sh -c 的参数的形式进行执行。比如:

CMD echo $HOME在实际执行中,会将其变更为:

CMD [ "sh", "-c", "echo $HOME" ]

exec 格式:

Docker 不是虚拟机,容器中的应用都应该以前台执行,没有后台服务的概念。

而使用 service nginx start 命令,则是以后台守护进程形式启动nginx服务

CMD service nginx start 会被理解为 CMD ["sh", "-c", "service nginx start"] ,因此主进程实际上是 sh 。那么当service nginx start 命令结束后, sh也就结束了, sh 作为主进程退出了,自然就会令容器退出。

正确的做法是直接执行 nginx 可执行文件,并且要求以前台形式运行

创建镜像

docker build -t web:0.1 /root/docker/

docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

web                 0.1                 b370d7fc0bac        17 minutes ago      438 MB

docker run --name nginx -d -P web:0.1

docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                   PORTS                                           NAMES

49f07ad6a13e        web:0.1             "nginx -g ‘daemon off"   2 minutes ago       Up 2 minutes (healthy)   0.0.0.0:32799->80/tcp, 0.0.0.0:32798->443/tcp   nginx

curl 127.0.0.1:32799

test

curl 127.0.0.1:32799/a/

AAA

查看健康检查日志

docker inspect --format ‘{{json .State.Health}}‘ nginx | python -m json.tool

{

"FailingStreak": 0,

"Log": [

{

"End": "2017-10-30T14:20:07.95075839+08:00",

"ExitCode": 0,

"Output": "test\n",

"Start": "2017-10-30T14:20:07.902212787+08:00"

......

原文地址:https://www.cnblogs.com/liang-yao/p/8449464.html

时间: 2024-08-30 18:12:36

docker-6.使用Dockerfile定制镜像的相关文章

Docker基础-使用Dockerfile创建镜像

1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # This dockerfile uses the ubuntu image # VERSION 2 - EDITION 1 # Author: docker_user # Command format: Instruction [arguments / command ] .. # Base image to use, this nust be set as the first line FROM ubu

[转]Docker基础-使用Dockerfile创建镜像

本文转自:https://www.cnblogs.com/jie-fang/p/7927643.html 1.基本结构 Dockerfile由一行行命令语句组成,并支持以#开头的注释行.例如: # This dockerfile uses the ubuntu image # VERSION 2 - EDITION 1 # Author: docker_user # Command format: Instruction [arguments / command ] .. # Base imag

Dockerfile 定制镜像

从上一篇文章中我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置.文件等信息,但是命令毕竟只是命令,每次定制都得去重复执行这个命令,而且还不够直观,如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么这些问题不就都可以解决了吗?对的,这个脚本就是我们说的Dockerfile 介绍 Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. 这里以定

Docker 实战—使用 Dockerfile 构建镜像

GitHub Page:http://blog.cloudli.top/posts/Docker实战-使用-Dockerfile-构建镜像/ Dockerfile 指令详解请访问:https://www.cnblogs.com/cloudfloating/p/11737447.html 使用 Alpine Linux 作为基础镜像 Alpine 是一个非常轻量的 Linux 镜像,他只有大约 5MB 的大小,基于它构建镜像,可以大大减少镜像的体积. Alpine 的 Docker Hub 页面:

实战docker,编写Dockerfile定制tomcat8镜像,实现web应用在线部署

最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7-maven-plugin插件,可以直接在maven上编译,打包,部署一次性完成,这个方法的关键是在tomcat上创建一个用户账号,然后maven插件用此账号和密码来执行在线部署. 本次实践中,我们要动手制作一个镜像,这个镜像run起来后是个tomcat server,这个server支持maven

实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署

最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的webapps目录下,后来用上了tomcat7-maven-plugin插件,可以直接在maven上编译,打包,部署一次性完成,这个方法的关键是在tomcat上创建一个用户账号,然后maven插件用此账号和密码来执行在线部署. 本次实践中,我们要动手制作一个镜像,这个镜像run起来后是个tomcat server,这个server支持maven

使用 Dockerfile 定制镜像

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建. FROM nginx RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html FROM 指定基础镜像,在该镜像的基础上进行定制,FROM是必备的指令,并且必须是第一条指令 RUN 执行命令行命令 ,其有两种格式: shell格式:RUN

dockerfile定制镜像的使用

就是写个docker的脚本然后依次运行,有点类似于gitlab中持续化集成的一系列步骤的自动部署和程序的顺序执行. 以tomcat为例 ,通常我们在 usr/local/ 目录下 创建文件夹tomcat mkdir tomcat 然后需要创建一个大小写敏感的Dockerfile文件 可以vi 可以vim可以touch Dockerfile 然后编辑Dockerfile文件 第一行:from 容器名 这里from tomcat 原文地址:https://www.cnblogs.com/notabl

使用Dockerfile定制自己的docker镜像

我们都知道,在Linux系统下可以通过shell脚本来自动安装部署应用,这样不但免去了手动操作的麻烦,而且还可以通过一些自动化工具来实现批量安装部署.那么docker是否也可以通过脚本的方式定制镜像呢?当然可以,那就是Dockerfile,我们可以把创建应用镜像的操作都写入一个Dockerfile文件里,然后通过docker build命令来构建自已的镜像,这个过程类似shell脚本的功能.docker环境的安装部署可以参考我的另一篇博文<Centos 7部署docker环境.基本命令使用及简单