惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
S
Securelist
H
Heimdal Security Blog
Scott Helme
Scott Helme
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Hacker News
The Hacker News
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
Cyberwarzone
Cyberwarzone
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
C
CERT Recently Published Vulnerability Notes
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
人人都是产品经理
人人都是产品经理
C
Cisco Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Engineering at Meta
Engineering at Meta
Project Zero
Project Zero
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Cisco Talos Blog
Cisco Talos Blog
Last Week in AI
Last Week in AI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
O
OpenAI News
P
Proofpoint News Feed
Google Online Security Blog
Google Online Security Blog
Recent Announcements
Recent Announcements
Hacker News: Ask HN
Hacker News: Ask HN
美团技术团队
Stack Overflow Blog
Stack Overflow Blog
U
Unit 42
P
Privacy International News Feed
Google DeepMind News
Google DeepMind News
G
GRAHAM CLULEY
Apple Machine Learning Research
Apple Machine Learning Research
TaoSecurity Blog
TaoSecurity Blog
S
Security @ Cisco Blogs
C
Check Point Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Jina AI
Jina AI
S
Secure Thoughts
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 最新话题
T
Tenable Blog
Latest news
Latest news
I
InfoQ

Java技术经验分享

生产故障处理SOP分享 | Java技术经验分享 系统稳定性建设实践总结【转载】 | Java技术经验分享 valine访问leancloud国际版异常,评论失效修复 | Java技术经验分享 匆匆忙忙的2021 | Java技术经验分享 聊一下换工作 | Java技术经验分享 IoT系列(2):WIFI设备常见配网方案介绍 | Java技术经验分享 IoT系列(1):什么是物联网 | Java技术经验分享 Java8特性2 - StreamApi | Java技术经验分享 Java8特性1 - lambda表达式&函数式接口 | Java技术经验分享 设计模式(5)-适配器模式 | Java技术经验分享 设计模式(4)-建造者模式 | Java技术经验分享 设计模式(3)-原型模式与浅拷贝和深拷贝 | Java技术经验分享 设计模式(2)-工厂模式图文介绍 | Java技术经验分享 设计模式(1)-带你了解3类8种单例模式 | Java技术经验分享 Java时间处理5---Java8中时区相关类库介绍 | Java技术经验分享 Java时间处理4---Java8中LocalDate、LocalTime、LocalDateTime介绍 | Java技术经验分享 Java时间处理3---Java8中Instant、Duration、Period、Clock介绍 | Java技术经验分享 一些有意思的问答 | Java技术经验分享 Nacos系列博客说明 | Java技术经验分享 菜鸡程序员的2019年度总结 | Java技术经验分享 Java中“附近的人”实现方案讨论及代码实现 | Java技术经验分享 Java时间处理2----时区TimeZone类方法探究(Java8以前) | Java技术经验分享 Java时间处理1----Date和Calendar方法探究(Java8以前) | Java技术经验分享 FastJson中JSONString、JavaBean、JSONObject、JSONArray的转换关系及API示例 | Java技术经验分享 2019.11软考软件设计师归来心得体会及复习备考指南 | Java技术经验分享 你还没用过“约定式提交”吗?那你赶紧来补补知识吧 | Java技术经验分享 教你如何看懂UML中的类图及类图中的关系 | Java技术经验分享 设计模式总览 | Java技术经验分享 萌新入门Github请看这里,学不会远程教 | Java技术经验分享 Hexo的工作原理探究 | Java技术经验分享 Hexo-theme-butterfly修改调整记录教程 | Java技术经验分享 排序8:基数排序 | Java技术经验分享 排序7:归并排序 | Java技术经验分享 排序6:快速排序 | Java技术经验分享 排序5:冒泡排序 | Java技术经验分享 排序4:堆排序 | Java技术经验分享 排序3:选择排序 | Java技术经验分享 排序2:希尔排序 | Java技术经验分享 排序1:直接插入排序 | Java技术经验分享 推荐一款博客一文多发的良心工具OpenWrite | Java技术经验分享 近期学习计划 | Java技术经验分享 Nacos(九):Nacos集群部署和遇到的问题 | Java技术经验分享 Nacos(八):Nacos持久化 | Java技术经验分享 Nacos(七):Nacos共享配置 | Java技术经验分享 Nacos(六):多环境下如何“管理”及“隔离”配置和服务 | Java技术经验分享 Nacos(五):多环境下如何“读取”Nacos中相应的配置 | Java技术经验分享 Nacos(四):SpringCloud项目中接入Nacos作为配置中心 | Java技术经验分享 Nacos(三):Nacos与OpenFeign的对接使用 | Java技术经验分享 Nacos(二):SpringCloud项目中接入Nacos作为注册中心 | Java技术经验分享 Nacos(一):Nacos介绍 | Java技术经验分享 20190719小组分享 | Java技术经验分享 Java中equals和HashCode方法的分析 | Java技术经验分享 Java中==和equals方法的分析 | Java技术经验分享 Java中的自动拆装箱、装箱缓存 | Java技术经验分享 About-blog | Java技术经验分享 Java中的编译、反编译和反编译工具全家桶分享 | Java技术经验分享 finalize()的生命周期(执行过程) | Java技术经验分享 Java关键字之final、finally与finalize方法 | Java技术经验分享 Java中重写、重载 | Java技术经验分享 Java中面向对象的三大特征:继承、封装、多态 | Java技术经验分享 Docker环境下安装Gitlab | Java技术经验分享 Docker中私有仓库的搭建流程 | Java技术经验分享 Centos7下两种方式安装Docker-CE | Java技术经验分享 Vert.x创建一个Http服务 | Java技术经验分享 Vert.x创建TCP服务端及客户端 | Java技术经验分享 Vert.x Core(二)- Event Bus(事件总线) | Java技术经验分享 Vert.x-Core(一)- 基础篇 | Java技术经验分享 SpringBoot项目中实现国际化 | Java技术经验分享 Vert.x介绍 | Java技术经验分享 毕设选题项目本地运行环境搭建教程 | Java技术经验分享 Jupyter Notebooks的安装和使用介绍 | Java技术经验分享 算法笔试题:1元,5元,10元,20元,50元、100元面值人民币组合给定x元的问题 | Java技术经验分享 Quartz学习总结 | Java技术经验分享 SpringBoot2.x集成Redis | Java技术经验分享 SpringBoot2.x集成MongoDB | Java技术经验分享 [SpringCloud学习] - 浅谈微服务架构 | Java技术经验分享 基于hexo和coding免费搭建个人博客网站 | Java技术经验分享 Hello World | Java技术经验分享
DockerFile介绍 | Java技术经验分享
文章作者: LarsCheng · 2019-04-30 · via Java技术经验分享

前言

DockerFile文件通常用来构建自定义镜像,举个不恰当的栗子:

1
2
3
4
5
6
7
8
比如果现在有一个纯净版的windows10镜像,使用这个镜像我安装了一个纯净版的win10到我的电脑,
接着我安装了杀毒软件、IDEA、JDK、mysql、Redis、MongoDb、qq、微信等一些基础应用,
后来我的系统损坏了(无法修复),需要重装系统,
于是我又用纯净版的win10镜像重新装一次系统,
然后又重新安装一次杀毒软件、IDEA、JDK、mysql、Redis、MongoDb、qq、微信...

那我能不能自己创建一个自定义的系统镜像,就以win10纯净版为基础,
预装上IDEA、JDK、Mysql、Redis这些应用,下次重装系统时,安装完系统这些软件就装好了,答案是当然可以啊。

那么docker中同理,我想以jdk为基础镜像创建一个自定义镜像,把自定义创建过程写成一个脚本,通过这个脚本来一键生成自定义镜像,这个脚本就是DockerFile,调用这个脚本的Docker命令就是Docker build

DockerFile语法

FROM <镜像名>

所有的 Dockerfile 都用该以 FROM 开头,FROM 命令指明 Dockerfile 所创建的镜像文件以什么镜像为基础,FROM 以后的所有指令都会在 FROM 的基础上进行创建镜像;可以在同一个 Dockerfile 中多次使用 FROM 命令用于创建多个镜像。

FROM 10.200.0.230:5000/openjdk:8-jre
FROM ubuntu

MAINTAINER <你的名字邮箱>

用于指定镜像创建者和联系方式。

MAINTAINER zhengql zhengql@test.com
MAINTAINER lky6666 lky6666@test.com

RUN <命令>

用于容器内部执行命令。每个 RUN 命令相当于在原有的镜像基础上添加了一个改动层,原有的镜像不会有变化。

RUN echo zql666

ADD <原始位置><目标位置>

用于从将原始位置的文件复制到目标位置文件:原始位置 是相对被构建的源目录的相对路径,可以是文件或目录的路径,也可以是一个远程的文件 url,目标位置 是容器中的绝对路径。

COPY target/myDemo-1.0.0.jar /usr/src/

CMD

CMD 命令有三种格式:

  • CMD [“executable”,“param1”,“param2”]:推荐使用的 exec 形式。
  • CMD [“param1”,“param2”]:无可执行程序形式
  • CMD command param1 param2:shell 形式。

CMD 命令用于启动容器时默认执行的命令,CMD 命令可以包含可执行文件,也可以不包含可执行文件:不包含可执行文件的情况下就要用 ENTRYPOINT 指定一个,然后 CMD 命令的参数就会作为ENTRYPOINT的参数。

一个 Dockerfile 中只能有一个CMD,如果有多个,则最后一个生效。  
CMD 的 shell 形式默认调用 /bin/sh -c 执行命令。  
CMD命令会被 Docker 命令行传入的参数覆盖:
            docker run busybox /bin/echo Hello Docker 会把 CMD 里的命令覆盖。

ENTRYPOINT

ENTRYPOINT 命令的字面意思是进入点,而功能也恰如其意:他可以让你的容器表现得像一个可执行程序一样。

ENTRYPOINT 命令也有两种格式:

  • ENTRYPOINT [“executable”, “param1”, “param2”] :推荐使用的 exec 形式

  • ENTRYPOINT command param1 param2 :shell 形式

    一个 Dockerfile 中只能有一个 ENTRYPOINT,如果有多个,则最后一个生效。

EXPOSE

用来指定对外开放的端口。

EXPOSE 80 3306

WORKDIR

WORKDIR /path/to/work/dir 配合 RUN,CMD,ENTRYPOINT 命令设置当前工作路径。
可以设置多次,如果是相对路径,则相对前一个 WORKDIR 命令。默认路径为/。

1
2
3
4
5
6
FROM ubuntu
WORKDIR /etc
WORKDIR ..
WORKDIR usr
WORKDIR lib
ENTRYPOINT pwd

启动容器后得到/usr/lib

USER <UID/用户名>

容器内指定 CMD RUN ENTRYPOINT 命令运行时的用户名或UID

VLOUME

允许容器之间互相访问目录,VOLUME [’/data’] 允许其他容器访问当前容器的目录。

ENV

指定环境变量,会被RUN指令使用,并在容器运行时保存

ENV LC_ALL en_US.UTF-8

栗子分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#基于私有仓库中openjdk为基础镜像
FROM 10.200.0.230:5000/openjdk:8-jre

#设置工作路径
WORKDIR /usr/src/

#将jar包复制到指定目录
COPY target/myDemo-1.0.0.jar /usr/src/

#设置容器启动时要执行的命令
CMD ["java", "-Duser.timezone=GMT+08", "-jar", "myDemo-1.0.0.jar", "--spring.profiles.active=dev"]

#设置镜像所运行的时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

#设置环境变量
ENV LANG C.UTF-8

#暴露端口
EXPOSE 9041

参考

dockerFile官网手册