什么是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大致流程:
示例解析
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和配置文件来构建镜像。
Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令。下面我们继续讲解其他的指令。
我在docker文档上读到了如何使用ONBUILD指令,但一点也不清楚。 有人能给我解释一下吗?
让我们举个例子。 https://github.com/dockerfile/nginx/blob/master/dockerfile http://www.tech-d.net/2014/11/03/docker-indepth-volumes/ 如何在生成期间将主机卷装入Dockerfile中的docker容器 http://jpetazzo.github.io/2015/01/19/Dock
问题内容: 所有人,我正在尝试将文件从主机持久复制到映像,以便基于该映像启动的每个容器都可以使用这些文件。在debian wheezy 64bit上以virtualbox guest身份运行。 Dockerfile非常简单(安装八度映像): 发出构建命令后,我得到以下跟踪: Docker绝对拒绝将此文件从主机复制到映像中。不用说文件loadjson.m存在(猫显示),我所有更改路径(相对,绝对等)
问题内容: 以下是我的“ Dockerfile”的内容 在此文件中,我期望“ VOLUME。/ usr / src / app”指令将主机上当前工作目录的内容安装在要安装在容器的/ usr / src / app文件夹中的主机中。 请让我知道这是正确的方法吗? 问题答案: 官方Docker教程说: 数据卷是一个或多个容器中的一个特别指定的目录,绕过联合文件系统。数据量为持久性数据或共享数据提供了几
下面是我的“DockerFile”的内容