您的位置:首页 > 运维架构 > Docker

Dockerfile最佳实践(一)

2016-05-19 19:42 1066 查看

      Dockerfile最佳实践(一)

 
本次内容时通过说一些建议和技巧来帮助你使用Dockerfile.
 

1.使用缓存

 
Dockerfile的每条指令都会将结果提交为新的镜像,下一跳指令将会基于上一步指令的镜像的基础上构建,如果一个镜像存在相同的父镜像和指令(除了ADD),DOcker将会使用镜像而不是执行该指令,即缓存.
 
为了有效的利用缓存,你需要保持你的Dockerfile一致,并且尽量在末尾修改.Dockerfile的前五行其实可以固定写成如下这样:
FROM ubuntu
MAINTAINER shanyongxu <783284481@qq.com>
RUN echo ”deb http://archive.ubuntu.com/ubuntu precise main ubiverse” > etc/apt/sources.list
RUN apt-get update
RUN apt-get upgrade -y

 
更改MAINTAINER指令会使Docker强制执行RUN指令来更新apt,而不是还是用缓存.
 
所以,我们应该使用常用且不变的Dockerfile开始指令来利用缓存.
 

2.使用标签

 
除非你正在用Docker做实验,否则你应当通过-t选项来docker
build新的镜像以便用于标记构建的镜像.一个简单的可读标签将帮助你管理每个创建的镜像.
 
docker build -t=”syx/df_test” .

 
注意,始终通过-t标记来构建镜像.
 

3.公开端口

 
两个Docker的核心概念是可重复和可移植.镜像应该可以运行在任何主机上并且运行尽可能多的次数.在Dockerfile中你有能力映射私有和共有端口,但是你永远不要通过Dockerfile映射公有端口.通过映射公有端口到主机上,你将只能运行一个容器化应用程序实例.
#private and public mapping
EXPOSE 80:8080
#private only
EXPOSE 80

 
如果镜像的使用者关心容器公有映射了哪个公有端口,他们可以在运行镜像时通过-p参数设置,否则,docker会自动为容器分配端口.
切勿在Dockerfile映射公有端口.
 

4.CMD与ENTRYPOINT的语法.

 
CMD和ENTRYPOINT指令都非常简单,但他们都有一个隐藏的容易出错的功能,如果你不知道的话可能会在这里入坑,这些指令支持两种不同的语法:
CMD /bin/echo
#or
CMD [“/bin/echo”]

 
看起来没问题,但仔细一看其实两种方式的差距很大.如果你使用第二个语法:CMD(或ENTRYPOINT)是一个数组,它执行的命令完全像你期望的那样.如果使用第一种语法,Docker会在你的命令之前加上/bin/sh
-c.
 
如果你不知道Docker修改了CMD命令,在命令前加上/bin/sh
-c可能会导致一些意想不到的问题以及难以理解的功能.因此,在使用这两个指令时你应当使用数组语法,因为数组语法会确切的执行你打算执行的命令.
 
使用CMD和ENTRYPOINT时,请务必使用数组语法.
 

5.CMD和ENTRYPOINT结合使用更好

 
docker run命令中的参数都会传递给ENTRYPOINT指令,而不用担心它被覆盖(和CMD不同).当与CMD一起使用时ENTRYPOINT的表现会更好.
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  docker