Dockerfile

Dockerfile是一个文本文件,用来定制镜像。

镜像是分层存储的,前一层会是下一层的基础。而镜像的定制就是定制每一层镜像在上一层做了什么改变。

Dockerfile其内包含一条条指令,每条指令构建一层,定义对上一层做了什么改变。

以定制spring cloud的eureka注册中心为例:

工程结构为idea默认生成的eureka工程,使用maven package 生成jar包:

Dockerfile如下:

#以java8为父镜像
FROM java:8 #将maven打包的jar包复制到/register.jar
ADD ./target/register-0.0.1-SNAPSHOT.jar /register.jar #暴露容器的8761端口
EXPOSE 8761 #执行java -jar /register.jar命令
CMD ["java", "-jar", "/register.jar"]

在当前目录执行docker build -t register .

可以看到每一条指令都生成了一个镜像,我们可以使用docker images -a查看所有的镜像。

但我们再次执行docker build -t register .时会发现每一条指令都显示Using cache,这就是镜像分层存储的意义——构建缓存。

常用指令

  1. FROM 指定基础镜像
  2. RUN 执行命令
    1. RUN ,如:RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
    2. RUN ["可执行文件", "参数1", "参数2"]
  3. COPY 复制文件
    1. COPY [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
    2. 源路径可以是多个,甚至可以是通配符,其通配符规则要满足 Go 的 filepath.Match 规则
  4. ADD 更高级的复制文件
    1. ADDCOPY基本一致,区别在ADD源路径可以是url,且如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
    2. 在 Docker 官方的 Dockerfile 最佳实践文档 中要求,尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已,而 ADD 则包含了更复杂的功能,其行为也不一定很清晰。最适合使用 ADD 的场合,就是所提及的需要自动解压缩的场合。
  5. CMD 容器启动命令
  6. ENTRYPOINT 入口点
    1. ENTRYPOINTCMD的目的一样,都是指定容器启动程序与参数。
    2. 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令
  7. ENV 设置环境变量
  8. ARG 构建参数
  9. VOLUME 定义匿名卷
  10. EXPOSE 暴露端口

详细介绍,可以查看Docker——从入门到实践

镜像构建上下文

上面我们构建镜像时使用docker build -t register ..就是在指定构建的上下文,其作用在于执行docker build 命令时会将该目录下的内容打包交给 Docker 引擎,以便后续的ADD/COPY找到需要复制的文件。

下图红线标记可以看出发送了43mb的文件给Docker引擎。

ps:只会打包构建上下文下的文件和文件夹,不会打包父目录,所以使用ADD ../register.jar会报找不到文件。

参考资料

Docker——从入门到实践

Docker,一个傲娇的男人

Docker 入门教程(3)——Dockerfile的更多相关文章

  1. Docker入门教程(三)Dockerfile

    Docker入门教程(三)Dockerfile [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOn ...

  2. Docker入门教程(六)另外的15个Docker命令

    Docker入门教程(六)另外的15个Docker命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第六篇,继续介绍Docker命令.之前的第二篇文章 ...

  3. Docker入门教程(四)Docker Registry

    Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...

  4. Docker入门教程(一)介绍

    http://dockone.io/article/101 Docker入门教程(一)介绍 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第一篇,介绍了 ...

  5. Docker(一):Docker入门教程

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...

  6. Docker(一):Docker入门教程

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...

  7. Docker 入门教程与实践

    title: Docker 入门教程与实践 tags: Docker ---- 在Windows上安装Docker客户端 1.下载Docker TollBox: https://docs.docker ...

  8. [转帖]Docker 入门教程

    Docker 入门教程 http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html 自己学的还是太肤浅啊.. 作者: 阮一峰 日期: 201 ...

  9. docker 入门教程(5)——总结与学习资料

    总结 registry:docker镜像仓库,集中存储和管理镜像,类似maven仓库. image:docker镜像,定义容器运行的文件和参数,可以看作是面向对象编程的类. container:doc ...

  10. Docker入门教程(九)10个镜像相关的API

    Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...

随机推荐

  1. 3.尚硅谷_MyBatis_HelloWorld.avi

    CREATE TABLE `tbl_employee` ( `id` int(11) NOT NULL AUTO_INCREMENT, `last_name` varchar(255) DEFAULT ...

  2. Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量

    使线程同步 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的了解应当在其 ...

  3. Spring AOP学习笔记05:AOP失效的罪因

    前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到 ...

  4. 【总结】LINQ查询基本操作列表

    每个LINQ查询都以from子句开始,from子句包括以下两个功能. 指定查询将采用数据源. 定义一个本地变量,表示数据源中单个元素. string[] values = { "中国&quo ...

  5. 你真的了解CSS继承吗?看完必跪

    也许你瞧不起以前的 css ,但是你不该再轻视眼下的 css .近年来 css 的变量系统已逐步得到各大浏览器厂商支持,自定义选择器等强势袭来,嵌套系统/模块系统也在路上…为了更好的掌握 css 这门 ...

  6. JSTL版本问题

    JSTL的版本有很多,和Servlet,jsp,tomcat都有版本兼容的问题,以下是收藏的相关帖子 JSTL不同版本和EL表达式的关联  https://www.cnblogs.com/yangzh ...

  7. 小白入门NAS—快速搭建私有云教程系列(一)

    什么是NAS 在日常的工作生活中,我们有大量的资料.文件需要存储在电脑或者其他终端设备中,但是这种方式需要电脑配备高容量的硬盘,而且需要随时随地的带着,这样是不是很麻烦? 那么,今天,我来介绍一种家庭 ...

  8. tbody滚动条占位导致与thead表头错位

    tbody出滚动条导致表头错位,上网上搜了一下,发现全是答非所问,能隐藏滚动条,还用问??我当前作出的效果是当tbody内容在正常情况下显示时,不显示滚动条,当内容区域高度超过外部容器时,滚动条自动显 ...

  9. 传参问题-HttpMessageNotReableException

    很久没写后台代码,用postMan测试后台接口的时候出现了一个问题: 问题如下: 显而易见是参数问题,我的参数如下图: 我调整参数样式为: 但还是存在问题. 最后调整成用双引号,结果对了.之前没有注意 ...

  10. Python——读取大文件(GB)

    最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. Prelimi ...