Docker 使用Dockerfile构建自己的docker服务(三)

先介绍一下DockerFile文件的一些指令说明

DockerFile的指令
FROM 基础镜镜像,一切从这里开始构建
MAINTAINER 镜像是谁写的,姓名+邮箱
RUN  镜像构建的时候需要运行的$令
ADD  步骤,tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR  镜像的工作目录
VOLUME  挂载的目录
EXPOSE 保留端口配置
CMD  指定这个容器启动的时候曼运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD 当构建一个被继承DockerFile 这个时候就会运行ONBUILD 的指令。触发指令。
COPY 类似ADD。将我们文件拷贝到镜像中
ENV 构建的时候设置环境变量
1.FROM <image>例子:FROM centosFROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从Docker的公共库pull镜像下来。FROM必须是Dockerfile中非注释行的第一个指令,即一个Dockerfile从FROM语句开始FROM可以在一个DOCKERfile中出现多次,如果有需求在一个Dockerfile中创建多个镜像2.MAINTAINER <name>例子:MAINTAINER zxg zhutoyearn@163.com指定创建镜像的用户3.RUN <"executable","parm1","param2">两种使用方式:
RUN
RUN  "executable", "param1", "param2"例子:RUN yum install wget -y每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建,类似源码的 版本控制 。exec 方式会被解析为一个 JSON 数组,所以必须使用双引号而不是单引号。exec 方式不会调用一个命令 shell,所以也就不会继承相应的变量,如:RUN [ "echo", "$HOME" ]  #错误,这个个方法不会输出HOME变量,下面为正确方式RUN [ "sh", "-c", "echo", "$HOME" ]RUN 产生的缓存在下一次构建的适合是不会失效的,会被重用,可以使用--no-cache选择,即docker build-no-cache,如此便不会缓存4.CMD <"executable",>三种使用方式:
CMD  "executable","param1","param2"
CMD  "param1","param2"
CMD command param1 param2 (shell form)例子:CMD["nginx"] 
CMD指定在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。CMD的目的是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令,则会覆盖掉CMD指定的命令。CMD会在启动容器的时候执行,build 时不执行,而RUN只是在构建镜像的时候执行,后续镜像构建完成之后,启动容器就与RUN无关了,这个初学者容易弄混这个概念,这里简单注解一下。5.EXPOSE <port>[<port>...]告诉docker服务端容器对外映射的本地端口,需要在docker run的使用使用-p或者-P选项生效例子:EXPOSE 80
6.ENVENV <key> <value>ENV <key>=<value>。。。指定一个环节变量,会被后续RUN指令使用,并在容器运行时保留例子:ENV myname zxgENV myhome beijingENV myname="zxg" myhome=beijing7.ADDADD <src>...<dest>ADD复制本地主机文件、目录或者远程文件URLS从并且添加到容器指定路径中支持通过Go的正则模式匹配,具体规则可参见Go filepath.Match例子:ADD hom* /mydir/  #adds all files starting with ”hom“ADD hom?.txt /mydir/ #?is replaced with any single characterADD index.html /usr/share/nginx/html/index.html注意如下:
路径必须是绝对路径,如果 不存在,会自动创建对应目录
路径必须是 Dockerfile 所在路径的相对路径
如果是一个目录,只会复制目录下的内容,而目录本身则不会被复制8.COPYCOPY <src>...<dest>COPY复制新文件或者目录并且添加到容器指定路径中,用法和ADD相同,唯一区别时不能指定远程文件URLS。9.ENTRYPOINTENTRYPOINT "executable","param1","param2"ENTRYPOINT command param1 param2(shell form)配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖,而CMD是可以被覆盖的。如果需要覆盖,则可以使用docker run --entrypoint选项。每个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效。Exec form ENTRYPOINT 例子通过ENTRYPOINT使用 exec form 方式设置稳定的默认命令和选项,而使用CMD添加默认之外经常被改动的选项。FROM ubuntuENTRYPOINT ["top", "-b"]CMD ["-c"]通过 Dockerfile 使用ENTRYPOINT展示前台运行 Apache 服务FROM debian:stableRUN apt-get update && apt-get install -y --force-yes apache2EXPOSE 80 443VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]Shell form ENTRYPOINT 例子这种方式会在/bin/sh -c中执行,会忽略任何CMD或者docker run命令行选项,为了确保docker stop能够停止长时间运行ENTRYPOINT的容器,确保执行的时候使用exec选项。FROM ubuntuENTRYPOINT exec top -b如果在ENTRYPOINT忘记使用exec选项,则可以使用CMD补上:FROM ubuntuENTRYPOINT top -bCMD --ignored-param1 # --ignored-param2 ... --ignored-param3 ... 依此类推10.VOLUMEVOLUME ["/data"]创建一个可以从本地主机或其他容器挂载的挂载点,后续具体介绍11.USERUSER daemon指定运行容器时的用户名或UID,后续RUN、CMD、ENTERPOINT也会使用指定用户12.WORKDIRWORKDIR /path/to/workdir为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径WORKDIR /aWORKDIR bWORKDIR cRUN pwd最终路径是/a/b/cWORKDIR指令可以在ENV设置变量之后调用环境变量:ENV DIRPATH /pathWORKDIR $DIRPATH/$DIRNAME最终路径则为 /path/$DIRNAME13.ONBUILDONBUILD [INSTRUCTION]配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令例如:Dockerfile 使用如下的内容创建了镜像image-A:[...]ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build --dri /app/src[...]

 

这里我们使用java项目做演示

准备项目jar包,我们这里的jar包就是一个自己编写java监控程序

[root@test1 monitor-1.0-SNAPSHOT]# ll
total 24
-rwxrwxrwx 1 zhonghong zhonghong 8124 Jul  7 19:25 monitor-1.0-SNAPSHOT.jar
-rwxrwxrwx 1 zhonghong zhonghong  578 Aug 20 16:38 monitor-1.0-SNAPSHOT.log
drwxrwxrwx 2 zhonghong zhonghong  201 Jul  7 17:29 lib
-rwxrwxrwx 1 zhonghong zhonghong  183 Aug 20 16:58 run.sh

monitor-1.0-SNAPSHOT.jar 是我们要执行的jar包

lib目录下是我们java项目所需要的所有依赖jar包

 创建dockerfile

[root@test1 monitor-1.0-SNAPSHOT]# cat dockerfile 
FROM java:8
COPY *.jar /
COPY lib/*.jar /lib/
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-cp","/lib/*:/monitor-1.0-SNAPSHOT.jar","wiki.hadoop.monitor.TaskMonitor","111"]

 生成docker image

docker build -t test-docker .

运行docker

docker run -d -P --name test-docker-name test-docker

查看docker运行的日志,发现我们的程序运行正常

> docker logs test-docker-name
02:22:39,009 INFO  wiki.hadoop.monitor.util.Log                               - [{"uid":"clementhii8","name":"许志国 Clement Hii","usr_level":"1"},{"uid":"sammifuhiulam","name":"傅曉琳 Sammi Fu","usr_level":"1"}]
02:22:39,009 INFO  wiki.hadoop.monitor.util.Log                               - 获取正常,2020-08-22 02:22:39
02:22:39,009 INFO  wiki.hadoop.monitor.util.Log                               - 46===================================================================
02:22:39,009 INFO  wiki.hadoop.monitor.util.Log                               - 休眠30s
02:23:09,054 INFO  wiki.hadoop.monitor.util.Log                               - [{"uid":"osuperpower","name":"長權","usr_level":"1"},{"uid":"BBC-中文網-132411143477916","name":"Log In or Sign Up to View","usr_level":"1"}]
02:23:09,054 INFO  wiki.hadoop.monitor.util.Log                               - 获取正常,2020-08-22 02:23:09
02:23:09,054 INFO  wiki.hadoop.monitor.util.Log                               - 45===================================================================
02:23:09,054 INFO  wiki.hadoop.monitor.util.Log                               - 休眠30s
02:23:39,101 INFO  wiki.hadoop.monitor.util.Log                               - [{"uid":"willisfonghohin","name":"方浩軒 Willis Fong","usr_level":"1"},{"uid":"Au-Kam-San-區錦新-111358238886242","name":"Au Kam San 區錦新","usr_level":"1"}]
02:23:39,101 INFO  wiki.hadoop.monitor.util.Log                               - 获取正常,2020-08-22 02:23:39
02:23:39,101 INFO  wiki.hadoop.monitor.util.Log                               - 47===================================================================
02:23:39,101 INFO  wiki.hadoop.monitor.util.Log                               - 休眠30s

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构实验之栈一:进制转换

题目描述 输入一个十进制整数&#xff0c;将其转换成对应的R&#xff08;2<R<9)进制数,并输出。输入 第一行输入需要转换的十进制数&#xff1b;第二行输入R。输出 输出转换所得的R进制数。示例输入 1279 8 示例输出 2377 #include <stdio.h> #include <stdlib.…

Delta3d动态角色层

DAL 采用一种灵活的、非侵入式的机制来暴露游戏角色的属性信息。 其中两大基础组件就是角色代理和角色属性。角色代理组件就是对底层游戏角色的一个封装&#xff0c;维护单个游戏角色的所有属性信息。而属性组件通过提供对单个游戏角色的所有属性的属性数据访问器来暴露角色的属…

Hbase Shell Filter 过滤

Get 和 Scan 操作都可以使用过滤器来设置输出的范围&#xff0c;类似于 SQL 里面的 Where 查询条件。使用 show_filters 命令可以查看当前 HBase 支持的 过滤器类型。 show_filters使用过滤器的语法格式&#xff1a; scan 表名,{Filter > ”过滤器(比较运算符,’比较器’)…

equals 和 == 的区别?知乎转载

作者&#xff1a;知乎用户 链接&#xff1a;https://www.zhihu.com/question/26872848/answer/34364603 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 简单易懂 Java 语言里的 equals方法其实是交给开发者去覆写…

ElasticSearch sql 插件安装

PS&#xff1a;6.3 开始 ElasticSearch 自身已经支持SQL查询。 github地址&#xff1a;https://github.com/NLPchina/elasticsearch-sql 一、在线安装 直接执行 ./bin/elasticsearch-plugin install https://github.com/NLPchina/elasticsearch-sql/releases/download/6.3.…

Delta3d组件机制

dtGame::GMComponent主要用于处理系统中的消息&#xff0c;给系统动态的添加功能&#xff0c;增加系统的可维护性&#xff0c; 简单来说&#xff0c;一个游戏管理器组件就是一个由游戏管理器管理的可以处理和发送消息的对象。它不像游戏角色&#xff0c;游戏管理器组件接受系统…

zookpeer实现对服务器动态上下线的监听

服务器动态上下线程序的工作机制 服务器代码&#xff1a; 补充&#xff1a;volatile关键字&#xff1a;java中一切都是对象&#xff0c;当多个线程操作同一个对象时候&#xff0c;该对象会放在堆内存中&#xff0c;而多个线程相当于在多个栈中&#xff0c;当A线程想要去除对…

ElasticSearch6.x 7.x Elasticdump 在线安装、离线安装

官网&#xff1a;elasticdump - npm ElasticDump是一个ElasticSearch的数据导入导出开源工具包&#xff0c;方便使用。 官方地址&#xff1a;官方地址&#xff1a;https://github.com/taskrabbit/elasticsearch-dump 一. 安装npm&#xff0c;node # 下载安装包 wget https:/…

用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C对象的各种方法、第三方库和原理&#xff0c;学习了LuaBridge库为Lua绑定C/C对象&#xff0c;下面是学习笔记&#xff0c;实质是对该库的 Reference Manual 基本上翻译了一遍&#xff0c;学习过程中测试代码&#xff0c;放在 我的github 上。 LuaBridge的…

H5动画制作流程没写完。。。

通过 keyframes 规则&#xff0c;您能够创建动画。创建动画的原理是&#xff0c;将一套 CSS 样式逐渐变化为另一套样式。在动画过程中&#xff0c;您能够多次改变这套 CSS 样式。以百分比来规定改变发生的时间&#xff0c;或者通过关键词 "from" 和 "to"&a…

串的基本操作

#include <iostream> #include <algorithm> #include <cstring> #define sqtrmax 1000 using namespace std; typedef struct { char *data; int length; } sqtr; void StrAssign (sqtr &S, char *chars); //赋值 void Destroy(sq…

Result window is too large, from + size must be less than or equal to: [10000] but was [12390]. See

ES 查询报错 Caused by: java.lang.IllegalArgumentException: Result window is too large, from size must be less than or equal to: [10000] but was [12390]. See the scroll api for a more efficient way to request large data sets. This limit can be set by chan…

Delta3d插件机制

Delta3d插件机制主要通过以下两个类实现&#xff1a; class MainWindow;/**Abstract interface class for STAGE plugins*/class Plugin{public:virtual ~Plugin() {} /** Is called after instantiation */virtual void Create() {}/** Is called before destruction */virt…

java中泛型学习总结

为什么需要使用泛型: 1):存储任意类型的数据在集合中 ,但是取出来都是Object类型的,此时就得强转.List list new ArrayList();list.add(1); //Interger类型Object ele list.get(0); //现在需要调用Interger类中的方法I nterger num (Interger) ele;System.out.println(num);…

数据结构实验之栈:行编辑器

题目描述 一个简单的行编辑程序的功能是&#xff1a;接受用户从终端输入的程序或数据&#xff0c;并存入用户的数据区。 由于用户在终端上进行输入时&#xff0c;不能保证不出差错&#xff0c;因此&#xff0c;若在编辑程序中&#xff0c;“每接受一个字符即存入用户数据区”的…

CDH、CM下载403,Cloudera收费无法下载解决,CDH安装包下载

CDH下载 6.3.2 链接: https://pan.baidu.com/s/1e1LmRY7aHQSCMJq3Lz6DtA 密码: 1vje --来自百度网盘超级会员V6的分享6.3.1 链接: https://pan.baidu.com/s/1Xsj_zDvuJ12q3pGTY77BRg 密码: f9h3 --来自百度网盘超级会员V6的分享6.2.1 链接: https://pan.baidu.com/s/10s7…

别说“我已经很努力了”

转自&#xff1a;http://blog.csdn.net/foruok/article/details/40247543 我们程序员的努力与挣扎有时非常尴尬&#xff0c;如果没有结果&#xff0c;都是徒然&#xff0c;都是说不得说不得…… 我自己做项目经理时&#xff0c;干的项目也经常延期……非常惭愧。而延期其实对研…

Java集合框架-概述

Java集合框架的由来: 其实在Java2(jdk1.2)之前&#xff0c;Java是没有完整的集合框架的。它只有一些简单的可以自扩展的容器类&#xff0c;比如Vector&#xff0c;Stack&#xff0c;Hashtable等。 为什么存在容器类: 容器类(集合类)可以存储多个数据,既然数组可以存储多个数据…

MySQL Binlog增量同步工具go-mysql-transfer实现详解

go-mysql-transfer产品手册:https://www.kancloud.cn/wj596/go-mysql-transfer/2111996 一、 概述 工作需要研究了下阿里开源的MySQL Binlog增量订阅消费组件canal&#xff0c;其功能强大、运行稳定&#xff0c;但是有些方面不是太符合需求&#xff0c;主要有如下三点&#x…

数据结构实验之栈五:下一较大值(一)

题目描述 对于包含n&#xff08;1<n<1000&#xff09;个整数的序列&#xff0c;对于序列中的每一元素&#xff0c;在序列中查找其位置之后第一个大于它的值&#xff0c;如果找到&#xff0c;输出所找到的值&#xff0c;否则&#xff0c;输出-1。 输入 输入有多组&#xf…