Dockerfile详解及优化
Dockerfile详解
0. Dockerfile的作用
docker可以根据Dockerfile中的指令来构建docker镜像。Dockerfile是一个文本文件,其应当包含用户想要构建一个镜像的所有指令。
1. 构建镜像的流程
真正执行构建任务的(就是读取Dockerfile中的指令构建新的镜像)是docker deamon。
- 执行 docker build -t images-name:tag .
- docker client会先将 当前目录下的所有文件递归的发送给docker deamon
- docker deamon检查Dockerfile是否有有语法错误,有错误则停止构建并将错误发送给docker client,没有错误继续执行
- docker deamon根据Dockerfile中的指令,一行一行的进行镜像的构建
- 构建成功后,docker deamon自动清理context.
1. Dockerfile支持的指令
- FROM <image>[:tag] #代表着一个新的build stage的开始,并确定这个build是基于哪个镜像来构建新的镜像,在所有的指令中只有这个是必须要有的。
- ENV <key>=<value> | <key> <value> #配置环境变量,注意此配置会在container中生效。前一种可以一行声明多个环境变量,后一种一行一个。
- ARG <key>[=<value>] #变量,此变量的声明周期与dockerfile构建过程一致,不会在container中生效。可以通过build时添加--build-arg <key>=<value>进行覆盖。注意:ARG时唯一可以放到FROM之前的指令,当ARG放到FROM之前时,它的作用于只到FROM这一行。
- COPY src dest # 将src代表的文件或者文件夹拷贝到dest代表的目录下。src支持通配符* ?
- ADD src dest #将src代表的文件或者文件夹或者网络资源 拷贝到 dest代表的base-image的目录下。src支持通配符 * ?
- RUN command #docker deamon在构建新的镜像时,是通过先基于FROM的镜像开启一个container,然后在这个container里执行。RUN指令就是是你想在container中执行的command。
- ENTRYPOINT ["executable", "param1", "param2"] | command param1 param2 # 将镜像变成一个executable。推荐用CMD来代替。
- CMD ["executable", "param1", "parama2"] | ["param1", "param2"] | command param1 param2 # 最后有一个CMD指令才有效,它代表这个image被用来创建container成功后执行的命令。第二种形式需要个ENTRYPOINT指令结合使用。
- LABEL <key>=<value> <key>=<value> #代表着这个image的元信息,比如此image的描述,版本,作者信息等等。
- EXPOSE port[/protocol] #通过这个image启动的container将会监听这些端口。但是注意这个只是在container内部监听的端口,当你想通过主机访问时需要在启动container时用-p这进行映射。
- USER <user>[:<group>] | <UID>[:<GID>] #在这个指令之后的操作,以及运行container时,指定为此用户。
- WORKDIR /path #在此指令之后的操作,以及container的默认进入路径都将时 /path目录。
- VOLUME ['/path1', '/path2'] #基于此镜像创建的container都将拥有VOLUME中指定的挂在目录。注意映射的主机目录无法指定,有docker deamon自动生成,可以通过docker inspect查看Mounts属性。
2. Dockerfile编写优化
1. 一个docker image只负责一个职责。当有多个服务时,请将服务分别docker化,然后组合使用这些docker images。
2. 就像编程一样,当一个字符串出现多次时,请用ARG来声明变量取代hard code。
3. 拷贝文件到镜像时,ADD负责网络资源的拷贝,COPY负责本地文件的COPY。
4. 尽量使用cache,docker在build镜像时可以利用缓存,缓存的原则时:当重复构建时,如果单个指令的内容没有变化,则docker会默认使用cache。
5. 将相同变化频率的RUN指令合并成一个。注意,一定要是相同变化频率的RUN命令才能合并成一个,不然缓存的特性就无法使用了。
6. 合理使用.dockerignore,减少images的体积。
7. 尽量使用CMD,VOLUME将image进行服务化。
8. 使用LABEL对image进行元信息的描述。
9. 单一服务的基础镜像如何可以请使用alpine版本的镜像来减少image的体积。
Dockerfile详解及优化的更多相关文章
- Dockerfile详解
Dockerfile详解 利用Dockerfile文件,可以构建docker的image镜像 命令使用 通过-f参数指定Dockerfile路径,进行构建image docker build -f / ...
- 【转】Dockerfile详解
Dockerfile详解 https://blog.csdn.net/wo18237095579/article/details/80540571 --------------------- 作者:大 ...
- JS中的函数节流throttle详解和优化
JS中的函数节流throttle详解和优化在前端开发中,有时会为页面绑定resize事件,或者为一个页面元素绑定拖拽事件(mousemove),这种事件有一个特点,在一个正常的操作中,有可能在一个短的 ...
- my.cnf 详解与优化【转】
MySQL配置文件my.cnf 例子最详细翻译,可以保存做笔记用. #BEGIN CONFIG INFO#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大#T ...
- apache配置文件详解与优化
apache配置文件详解与优化 一.总结 一句话总结:结合apache配置文件中的英文说明和配置详解一起看 1.apache模块配置用的什么标签? IfModule 例如: <IfModule ...
- tomcat常用配置详解和优化方法
tomcat常用配置详解和优化方法 参考: http://blog.csdn.net/zj52hm/article/details/51980194 http://blog.csdn.net/wuli ...
- Tomcat记录-tomcat常用配置详解和优化方法(转载)
常用配置详解 1 目录结构 /bin:脚本文件目录. /common/lib:存放所有web项目都可以访问的公共jar包(使用Common类加载器加载). /conf:存放配置文件,最重要的是serv ...
- Dockerfile详解(二)
Dockerfile文件详解 什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指 ...
- php详解和优化
nginx结合php使用FastCGI方式 apache结合php,php是作为一个模块加载到apache中 (1)FastCGI工作原理 1.用户发送http请求报文给nginx服务器 2.ngin ...
随机推荐
- atmega16功耗实测
晶振32.768K 电压 电流 1.82 10ua 2.00 15ua 2.5 28ua 3.3 ...
- mybatis模糊查询
今天遇到一个模糊查询的问题,需求是:根据传入的时间查询当天的所有数据,解决办法是使用$或者contact,具体sql模拟如下: select * from table_name where creat ...
- centos7设置静态IP地址
1.查看IP配置信息 ifconfig 如上图所示,我的em1网卡已配置好 2.编辑em1对应的配置文件,位于/etc/sysconfig/network-scripts/ifcfg-你的网卡名字 操 ...
- 5.6版本GTID复制异常处理一例(转)
http://imysql.com/2014/07/31/mysql-faq-exception-replication-with-gtid.shtml 昨天处理了一个MySQL 5.6版本下开启GT ...
- Python 多进程和进程池
一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...
- jenkins centos slave起不来报错The SSH key presented by the remote host does not match the key saved in the Known Hosts file against this host. Connections to this host will be denied until the two keys mat
场景:我的centos-204是一台centos的机器,本来用https://www.cnblogs.com/zndxall/p/8297356.html 的centos slave方式搭建ok的,一 ...
- linux安装软件时提示找不到镜像的问题:Couldn't resolve host 'mirrorlist.centos.org'
问题:[root@cddserver2 ~]# yum -y install gcc-*Loaded plugins: fastestmirror, prestoCould not retrieve ...
- c# 有序链表合并 链表反转
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 67.web--手机端兼容性问题
H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-width,initia ...
- Go 初体验 - 闭包的几种情况
闭包: 闭包是可以包含自由(未绑定到特定对象)变量的代码块,这些变量不在这个代码块内或者任何全局上下文中定义,而是在定义代码块的环境中定义.要执行的代码块(由于自由变量包含在代码块中,所以这些自由变量 ...