Dockerfile的理解

Dockerfile文件详解

Docker镜像的制作有docker commit 和Dockerfile,官方推荐使用Dockerfile来制作

通过一个实例来看下docker镜像的制作过程:

1、创建一个Dockerfile的文件

2、在文件中写入下面代码:

FROM ubuntu
RUN apt-get install -y vim

3、执行docker bulid命令来构建镜像

docker build -t new-ubuntu .

这条命令-t参数指定新的镜像的名称;点“.” 代表的是Dockerfile文件的路径,由于案例的Dockerfile就在当前目录下面所以就用点符号来标识

从这个输出中我们可以看到真正的构建过程 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。

Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。

此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。

所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。

Dockerfile文件中的其他关键字

FROM 是基于那个基础镜像

RUN 需要安装的软件

MAINTAINER 镜像创建者的信息

CMD :容器启动时需要执行的命令;但是在一个Dockerfile文件中只能有一个CMD命令,如果有多个,只执行最后一个CMD命令

如果在启动容器的时候指定了命令,那么这个命令会替换掉容器镜像中默认写的CMD命令

ENTRYPOINT:

container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条

ENTRYPOINT没有CMD的可替换特性

USER:使用那个用户跑容器

例如:

ENTRYPOINT ["memcached"]

USER daemon

EXPOSE:容器内部开启的端口,主机上使用还得在启动容器的时候做端口映射

docker run -p 80:80 xxx

ENV: 设置环境变量

例如:

ENV LANG en_US.UTF-8

ENV LC_ALL en_US.UTF-8

ADD:将文件<src>拷贝到container的文件系统对应的路径<dest>

所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0

如果文件是可识别的压缩格式,则docker会帮忙解压缩

如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下

如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如:

docker build github.com/creack/docker-firefox

docker-firefox目录下必须有Dockerfile和要ADD的文件

注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD

url file.

ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

VOLUME

可以将本地文件夹或者其他container的文件夹挂载到container中。

WORKDIR

切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效

ONBUILD

ONBUILD 指定的命令在构建镜像时并不执行,而是在它的子镜像中执行

参考文献:

http://cloudman.blog.51cto.com/10425448/1923921

http://blog.csdn.net/wsscy2004/article/details/25878223

时间: 2024-10-22 12:37:23

Dockerfile的理解的相关文章

Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅

通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一个定制的 Dockerfile 来 Docker 化Dockerize一个应用. Docker 是一个过去两年来从某个 idea 中孕育而生的有趣技术,公司组织们用它在世界上每个角落来部署应用.在今天的文章中,我将讲述如何通过"Docker 化Dockerize"一个现有的应用,来开始我们的 Docker 之旅.这里提到的应用指的就是这个博客! 什么是 Dock

Docker化你的应用

Docker 是一个使用 Go 语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的机器上.Docker 的发展速度和火爆程度着实令人惊叹,一发不可收拾,形成了席卷整个IT界的新浪潮. 记得在公众号科普过 Docker 的一些基本概念,简单可以理解为集装箱,可以把你的程序.环境.配置等等全部装进去,这样在其他机器上达到开箱即用,也就是解决了环境不一致的问题. 还有就是每一个 Docker 都是相对隔离的,避免了资源使用上的一些问题. Doc

理解dockerfile是如何工作的?

理解dockerfile是如何工作的? 1.下面是一个最简单的dockerfile: FROM baserepo RUN do something 2.这个dockerfile build完等价于下面的命令: Step 0 : sudo docker pull baserepo:latest sudo docker run --name baserepo_bash01 -i -t baserepo:latest /bin/bash sudo docker ps -a b779269d5001 s

使用Dockerfile构建镜像命令自己的理解

1.FROM 基于那个基础命令开始构建镜像,我的理解就是选择一个操作系统 2.CMD 里面放的是指定一个容器启动时要运行的命令 3.ENTRYPOINT 类似于CDM命令,不过 docker run 命令行中指定的任何参数都会被当做参数再次传递给ENTRYPOINT指令中指定的命令 4.WORKDIR 用来在从镜像创建一个新容器时,在容器内部设置一个工作目录,ENTRYPOINT或CMD中的指定程序会在这个目录下执行 5.ENV 用来在镜像构建过程中设置环境变量 6.VOLUME 向容器中添加卷

【Docker江湖】之docker部署与理解

转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thinkgamer Docker江湖 [Docker江湖]之Docker部署与理解 [Docker江湖]之hub上镜像的使用,Dockerfile语法解读和数据管理 [Docker江湖]之创建带有SSH服务的镜像 写在前边的话 在之前便想学习Docker技术了,可是一直没有机会,近期在做elk的一个项目

Dockerfile 最佳实践

之前 一篇文章介绍 docker 的镜像基本原理和概念 ,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法. 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是不正当的 Dockerfile 使用也会导致很多问题: docker 镜像太大.如果你经常使用镜像或者构建镜像,一定会遇到那种很大的镜像,甚至有些能达到 2G 以上 docker 镜像的构建时间过长.每个 build 都会耗费很长时间,对于需要经常构建镜像(比如单元测试)的地方这可

阿里云部署Docker(9)----Dockerfile脚本定制镜像

本文为原创文章,转载需注明转自:http://blog.csdn.net/minimicall?viewmode=contents 技术爱好者都是比较懒的.而docker又是开发者支持起来的.所以,它肯定是有比较懒的方式供我们定制自己需要的东西. docker build docker 用build指令来执行dockerfile脚本. 具体的用法: [java] view plaincopy sudo docker build . 小心后面那个点,表示当前目录.当前目录有一个Dockerfile

深刻理解Docker镜像大小

都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊. 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上.你执行了容器生涯的处女容器.镜像的基石作用已经非常明显.在Docker的世界里,能够说是:No Image,No Container. 再进一步思考Docker镜像,大家可能非常快就会联想到下面几类镜像: 1.系统级镜像:如Ubuntu镜像.CentOS镜像以及Debian容器等: 2.工具栈镜像:如Golang镜像.

理解Docker容器的进程管理

摘要: Docker在进程管理上有一些特殊之处,如果不注意这些细节中的魔鬼就会带来一些隐患.另外Docker鼓励"一个容器一个进程(one process per container)"的方式.这种方式非常适合以单进程为主的微服务架构的应用.然而由于一些传统的应用是由若干紧耦合的多个进程构成的,这些进程难以 Docker在进程管理上有一些特殊之处,如果不注意这些细节中的魔鬼就会带来一些隐患.另外Docker鼓励"一个容器一个进程(one process per contain