Dockerfile指令详解

 更新时间:2016年10月08日 08:43:15   作者:毛宇鹏  
Dockerfile有十几条命令可用于构建镜像,下文将简略介绍这些命令。希望小伙伴们能够喜欢

什么是Dockerfile

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

当你在使用 Docker构建镜像的时候,每一个命令都会在前一个命令的基础上形成一个新层。这些基础镜像可以用于创建新的容器。本篇文章将手把手教您如何从基础镜像,一步一步,一层一层的从Dockerfile构建容器的过程。

Dockerfile示例

# Version 1.0
FORM ubuntu:14.04
MAINTAINER Mao "
hongtu1993@sina.cn"
RUN apt-get update && apt-get install -y nginx
RUN echo 'Hello,I am work' > /usr/share/nginx/html/index.html
EXPOSE 80 80

Docker执行步骤分析

以上Dockerfile示例中,每条指令都会创建一个新的镜像层并对镜像进行提交.Docker执行Dockerfile大致流程:

  1. Docker从基础镜像运行一个容器;
  2. 执行一条指令,对容器做出修改;
  3. 执行类似docker commit的操作,提交一个新的镜像层;
  4. Docker再基于刚提交的镜像运行一个新容器;
  5. 执行Dockerfile中的下一条指令,直到所有指令都执行完毕;

示例解析

  1. FROM:每个dockerfile的第一条命令是FROM.FROM指令指定一个已经存在的镜像,则代表FROM后续的指令都是基于该镜像(ubuntu14.04)进行的.
  2. MAINTAINER:该指令告诉Docker,作者和邮箱地址
  3. RUN:通俗地说,RUN指令会在shell里使用命令包装器 /bin/sh -c 来执行.如果在不支持shell的平台上运行,则可使用exec格式的RUN指令RUN ["apt-get","install","-y","nginx"]
  4. EXPOSE: 向外公开端口

Dockerfile指令汇总及解析

MAINTAINER
我建议这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

# MAINTAINER [name] [email]
MAINTAINER authors_name "
hongtu1993@sina.cn"

FROM

FROM命令可能是最重要的Dockerfile命令。改命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜 像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

# FROM [image name]

FROM ubuntu

ADD

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。

# ADD [source directory or URL] [destination directory]

ADD /my_app_folder /my_app_folder

RUN

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。

# RUN [command]

RUN apt-get update

CMD

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

# CMD application "argument", "argument", ..

CMD "echo" "Hello Mao!"

ENTRYPOINT

ENTRYPOINT帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo

# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

ENV

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

# ENV key value

ENV SERVER_WORKS 4

USER

USER命令用于设置运行容器的UID。

# USER [UID]

USER 751

VOLUME

VOLUME命令用于让你的容器访问宿主机上的目录。

# VOLUME ["/dir_1", "/dir_2" ..]

VOLUME ["/my_files"]

WORKDIR

WORKDIR命令用于设置CMD指明的命令的运行目录。

# WORKDIR /path

WORKDIR ~/

EXPOSE

EXPOSE指令用来告诉Docker这个容器在运行时会监听哪些端口,Docker在连接不同的容器(使用–link参数)时使用这些信息;
两个Docker的核心概念是可重复和可移植。镜像应该可以运行在任何主机上并且运行尽可能多的次数。在 Dockerfile中你有能力映射私有和公有端口,但是你永远不要通过Dockerfile映射公有端口。通过映射公有端口到主机上,你将只能运行一个容器化应用程序实例。(译者注:运行多个端口不就冲突啦)

# EXPOSE [port]

# private and public mapping
EXPOSE 80:8080

# private only
EXPOSE 80

最后我们来个简单的示例吧

使用Dockerfile自动构建Nginx容器

因为我们命令Docker用当前目录的Nginx的配置文件替换默认的配置文件,我们要保证这个新的配置文件存在。在Dockerfile存在的目录下,创建nginx.conf:

sudo nano nginx.conf

然后用下述内容替换原有内容:

worker_processes 1;
events { worker_connections 1024; }
http {
   sendfile on;
   server {
     listen 80;
     location / {
       proxy_pass http://httpstat.us/;
       proxy_set_header X-Real-IP $remote_addr;
     }
   }
}

让我们保存nginx.conf。之后我们就可以用Dockerfile和配置文件来构建镜像。

相关文章

  • Docker部署.NET6项目的实现步骤

    Docker部署.NET6项目的实现步骤

    Docker是现在比较流行的开源容器引擎,有了它让我们部署和维护系统更加方便,本文主要介绍了Docker部署.NET6项目,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 如何使用docker部署前端应用的方法步骤

    如何使用docker部署前端应用的方法步骤

    这篇文章主要介绍了如何使用docker部署前端应用的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • Docker容器的调试技巧之docker logs与docker service logs解读

    Docker容器的调试技巧之docker logs与docker service logs

    这篇文章主要介绍了Docker容器的调试技巧之docker logs与docker service logs,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 详解Docker中VLAN网络模式的配置

    详解Docker中VLAN网络模式的配置

    在Docker应用到生产环境的时候包括了原生Bridge NAT模式、LinuxBridge VLAN模式以及利用第三方的网络方案这三种,这篇文章给大家详细介绍了Docker中VLAN网络模式的配置,有需要的朋友们下面来一起看看吧。
    2016-10-10
  • 详解基于docker 如何部署surging分布式微服务引擎

    详解基于docker 如何部署surging分布式微服务引擎

    这篇文章主要介绍了详解基于docker 如何部署surging分布式微服务引擎,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • docker部署lnmp-wordpress的实现步骤

    docker部署lnmp-wordpress的实现步骤

    本文主要介绍了docker部署lnmp-wordpress的实现步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • docker搭建memcached的详细步骤

    docker搭建memcached的详细步骤

    Memcached 是一个通用的分布式内存缓存系统,它通常用于通过在 RAM 中缓存数据和对象来加速动态数据库驱动的网站,以减少必须读取外部数据源(例如数据库或 API)的次数,这篇文章主要介绍了docker搭建memcache,需要的朋友可以参考下
    2022-07-07
  • Docker安装Jenkins的实现步骤

    Docker安装Jenkins的实现步骤

    版本与jdk版本以及各类插件有对应关系,所以普通安装较为麻烦,本文主要介绍了Docker安装Jenkins的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Docker容器的加载分层原理及commit镜像

    Docker容器的加载分层原理及commit镜像

    这篇文章主要为大家介绍了Docker容器的加载分层原理及commit镜像,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 在Docker中部署Mysql并挂载配置文件的步骤详解

    在Docker中部署Mysql并挂载配置文件的步骤详解

    Docker是一种流行的容器化平台,可以简化应用程序的部署和管理,本文我们将给大家详细介绍在 Docker 中部署 MySQL 并挂载配置文件的详细步骤,需要的朋友可以参考下
    2023-09-09

最新评论