Docker入门教程(三)Dockerfile

时间:2022-02-07 10:55:33

Docker入门教程(三)Dockerfile

【编者的话】DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第三篇,介绍了Dockerfile的语法,DockerOne目前在代码高亮部分还有些Bug,我们会尽快修复,目前在代码部分有会些字符会被转义。

Docker系列教程的上一篇文章中,我们介绍了15个Docker命令,你应该对Docker有个大致的了解了。那15个命令在手动创建镜像时会用到,它们涵盖了镜像的创建、提交、搜索、pull和push的功能。

现在问题来了,既然Docker能自动创建镜像,那为什么要选择耗时而又乏味的方式来创建镜像呢?

Docker为我们提供了Dockerfile来解决自动化的问题。在这篇文章中,我们将讨论什么是Dockerfile,它能够做到的事情以及Dockerfile的一些基本语法。

易于自动化的命令

Dockerfile包含创建镜像所需要的全部指令。基于在Dockerfile中的指令,我们可以使用Docker build命令来创建镜像。通过减少镜像和容器的创建过程来简化部署。

Dockerfile支持支持的语法命令如下:

INSTRUCTION argument

指令不区分大小写。但是,命名约定为全部大写。

所有Dockerfile都必须以FROM命令开始。 FROM命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(译者注:CentOS和Ubuntu有些命令可是不一样的)。FROM命令可以多次使用,表示会创建多个镜像。具体语法如下:

FROM <image name>

例如:

FROM ubuntu

上面的指定告诉我们,新的镜像将基于Ubuntu的镜像来构建。

FROM命令,DockefFile还提供了一些其它的命令以实现自动化。在文本文件或Dockerfile文件中这些命令的顺序就是它们被执行的顺序。

让我们了解一下这些有趣的Dockerfile命令吧。
1. MAINTAINER:设置该镜像的作者。语法如下:

MAINTAINER <author name>

2. RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。语法如下:

RUN 《command》

3. ADD:复制文件指令。它有两个参数<source>和<destination>。destination是容器内的路径。source可以是URL或者是启动配置上下文中的一个文件。语法如下:

ADD 《src》 《destination》

4. CMD:提供了容器默认的执行命令。 Dockerfile只允许使用一次CMD指令。 使用多个CMD会抵消之前所有的指令,只有最后一个指令生效。 CMD有三种形式:

CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2

5. EXPOSE:指定容器在运行时监听的端口。语法如下:

EXPOSE <port>;

6. ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于CMD,Docker只允许一个ENTRYPOINT,多个ENTRYPOINT会抵消之前所有的指令,只执行最后的ENTRYPOINT指令。语法如下:

ENTRYPOINT ["executable", "param1","param2"]
ENTRYPOINT command param1 param2

7. WORKDIR:指定RUNCMDENTRYPOINT命令的工作目录。语法如下:

WORKDIR /path/to/workdir

8. ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:

ENV <key> <value>

9. USER:镜像正在运行时设置一个UID。语法如下:

USER <uid>

10. VOLUME:授权访问从容器内到主机上的目录。语法如下:

VOLUME ["/data"]

Dockerfile最佳实践

与使用的其他任何应用程序一样,总会有可以遵循的最佳实践。你可以阅读更多有关Dockerfile的最佳实践

以下是我们列出的基本的Dockerfile最佳实践:

  • 保持常见的指令像MAINTAINER以及从上至下更新Dockerfile命令;
  • 当构建镜像时使用可理解的标签,以便更好地管理镜像;
  • 避免在Dockerfile中映射公有端口;
  • CMDENTRYPOINT命令请使用数组语法。

在接下来的文章中,我们将讨论Docker Registry及其工作流程

原文链接:Part 3: Automation is the word using Dockerfile(翻译:田浩浩 审校:李颖杰)

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

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

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

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

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

  3. Docker&lpar;一&rpar;:Docker入门教程

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

  4. Docker&lpar;一&rpar;&colon;Docker入门教程

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

  5. &lbrack;转帖&rsqb;Docker 入门教程

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

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

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

  7. Docker 入门教程与实践

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

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

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

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

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

随机推荐

  1. 对 Python 语法不够了解导致的 bug

    对 Python 语法不够了解导致的 bug. `in` '20' in '11264,6144,4096,3072,2048,1024,300,30' Out[7]: True a_list = ' ...

  2. gitlab两种连接方式&colon;ssh和http配置介绍

    gitlab环境部署好后,创建project工程,在本地或远程下载gitlab代码,有两种方式:ssh和http (1)ssh方式:这是一种相对安全的方式 这要求将本地的公钥上传到gitlab中,如下 ...

  3. 【转载】&period;NET面试题系列&lbrack;0&rsqb; - 写在前面

    原文:.NET面试题系列[0] - 写在前面 索引: .NET框架基础知识[1] - .NET框架基础知识(1) http://www.cnblogs.com/haoyifei/p/5643689.h ...

  4. 非常实用的PHP代码片段推荐

    当使用PHP进行开发的时候,如果你自己收 藏 了一些非常有用的方法或者代码片段,那么将会给你的开发工作带来极大的便利.今天我们将介绍10个超级好用的PHP代码片段,希望大家能够喜欢! 1.  使用te ...

  5. &lbrack;Twisted&rsqb; Test

    由于Twisted程序采用事件驱动,并使用Deferred来处理事件,使用Python unittest的写测试并不容易.因此, Twisted拓展了unitest,并使用命令行工具来运行测试.这些组 ...

  6. Lowest Common Ancestor of a Binary Tree leetcode

    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree. According ...

  7. LBPL--基于Asp&period;net、 quartz&period;net 快速开发定时服务的插件化项目

    LBPL 这一个基于Asp.net. quartz.net 快速开发定时服务的插件化项目 由于在实际项目开发中需要做定时服务的操作,大体上可以理解为:需要动态化监控定时任务的调度系统. 为了实现快速开 ...

  8. Baidu音乐爬虫

    Baidu音乐歌曲爬虫: 1.分析Baidu音乐歌曲下载接口,组装参数 2.判断是否需要登录 a.使用cookie b.使用selenium 3.歌曲信息页面分析 4.数据表设计 歌曲类型表 歌曲表 ...

  9. 全栈开发工程师微信小程序-上&lpar;中&rpar;

    全栈开发工程师微信小程序-上(中) width: 750rpx; 750rpx代表与屏幕等宽,rpx的缩写responsive pixel,这个单位是可以根据屏幕大小进行自适应调整的像素单位. 小程序 ...

  10. CentOs7下搭建LAMP环境

    ● 环境搭建 参考: http://blog.csdn.net/zph1234/article/details/51248124 http://www.jb51.net/os/188488.html ...