Dockerfile 最佳实践

 

一、如何构建docker 镜像

1.docker commit

基于已有的容器构建镜像(不推荐)

docker commit 从容器创建一个新的镜像

首先 创建一个容器

docker  run -it centos  /bin/bash

 

 在容器的的家目录下创建文件a

退出exit 容器

docker commit   容器id

 

 新的镜像已经建立,创建新的容器,该容器自动有a这个文件

 

2.  Dockerfile定制镜像

注意 Dockerfie 是个文本文件,没有任何后缀拓展名。

首先创建一个文件夹,用来存放项目所需要的文件

FROM 指定基础镜像,所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。

docker hub 上有很多 高质量的镜像,可以直接拿过来使用。

WORKDIR 指定工作目录

ENV 环境变量

COPY   复制主机文件到指定的目录

ADD   同COPY。但是可以自动解压

RUN  执行命令,一般用来安装程序

ARG  构建参数,在将来容器运行时是不会存在这些环境变量的,docker build 是可以用--build-arg <参数名>=<值>来覆盖

VOLUME <路径>  挂载卷

EXPOSE 声明端口

USER 指定当前用户

HEALTHCHECK 健康检查

 

CMD 指定容器启动时默认的执行命令,容器被docker run 指令替代

docker run -it ubuntu  会直接进入bash,ubuntu 镜像默认的 CMD 是 /bin/bash,但是 如果 docker run -it ubuntu cat /etc/os-release,进入就是查看版本

ENTRYPOINT  也是 容器运行的命令 只有docker  run  使用--enrtypoint  才会被替代。

简单例子

docker  build -t test .

 

 这个Dockerfile 只有三层,基础镜像会自动去docker hub上去拉取,也可以换docker的镜像源,或者配置镜像加速器。

docker images | grep  test   看到镜像已经创建完成

docker run -it test  /bin/bash  交互式运行容器

注意点:

 ADD 和COPY:尽量使用copy,copy的功能与“ADD”相同,但没有tar和远程URL处理

CMD 和 ENTRYPOINT 都是容器启动时的命令,cmd很容易被docker run 的命令替代,如果你希望你的镜像宁或,可以使用cmd。如果你希望你的镜像,只执行一个具体程序,用entrypoint 合适。

两者不互斥,可以同时使用,cmd 可以为entrypoint 提供额外的参数,但是二者需要同时使用 exec的格式,shell格式可能得不到预期的结果。

ecec:ENTRYPOINT ["executable","parm1","parm2"]

shell:ENTRYPOINT  command parm1 parm2 

二、如何精简docker镜像

  瘦身方向:

1.基础镜像的选择:尽可能小,尽可能使用官方正式的基础镜像,使用更具体的标签代替latest

2.串联Run指令:每一条都会构建一层,减少层的数量,保证简洁

3.缓存:将容易出错的下载指令放在前面 这样下次就可以直接利用缓存,将易改动部分放在最后,以免影响其他部分用缓存(构建的顺序很重要,影响缓存利用率)当你改变dockerfile的某一层 ,那一部分的缓存就会失效,该缓存的后续步骤都会中断,需要重新构建。所以优化缓存的最佳方法是把不需要经常更改的行放到最前面,更改最频繁的行放到最后面

4.使用多步构建: 在最终的镜像中只copy出需要的文件,给前面的镜像取一个别名 builder,在后面需要使用的地方,

COPY --from=builder  源文件   目标目录
阶段构建是删除构建依赖的首选方案。

5.使用.dockerignore 文件将不需要的和不必要的文件从镜像中删除,从而减小镜像的体积,镜像越小,部署的速度更快,攻击范围越小

 

6.当拷贝文件到镜像中时,尽量只拷贝需要的文件,切忌使用 COPY . 指令拷贝整个目录。

7.不要安装你不需要的软件包和依赖。某些包管理工具(如 apt)除了安装用户指定的包之外,还会安装推荐的包,这会无缘无故增加镜像的体积。apt 可以通过添加参数 --no-install-recommends 来确保不会安装不需要的依赖项。如果确实需要某些依赖项,请在后面手动添加。

8.删除包管理工具的缓存

apt-get clean && \
rm -rf /var/lib/apt/lists/* \
rm -f /etc/nginx/conf.d/default.conf && \
包管理工具会维护自己的缓存,这些缓存会保留在镜像文件中,推荐的处理方法是在每一个 RUN 指令的末尾删除缓存。如果你在下一条指令中删除缓存,不会减小镜像的体积。

9.查看dive—它的一个非常酷的工具,可以检查你的 Docker 镜像层,并帮助你削减多余的部分

 

转载于:https://www.cnblogs.com/fayuzhang/p/11341518.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dockerfile是用于构建Docker镜像的文本文件,其中包含了一系列的指令和配置。以下是一些Dockerfile最佳实践: 1. 使用官方基础镜像:选择一个合适的官方基础镜像作为起点,例如`ubuntu`、`alpine`等。官方镜像通常经过优化和安全性验证。 2. 合理使用镜像层缓存:Docker构建镜像时,每个指令都会创建一个新的镜像层。为了提高构建速度,可以将频繁变动的指令放在后面,将不变的指令放在前面,以充分利用镜像层缓存。 3. 最小化镜像大小:避免在镜像中包含不必要的文件和依赖项。可以使用多阶段构建,将编译环境和运行环境分离,只将必要的文件复制到最终的镜像中。 4. 使用COPY而不是ADD:在复制文件到镜像时,优先使用COPY指令而不是ADD指令。COPY只复制本地文件到镜像中,而ADD还支持URL和解压缩功能,容易引入不必要的复杂性。 5. 指定工作目录:通过WORKDIR指令设置工作目录,使得后续指令的执行路径更加清晰和可预测。 6. 使用健康检查:通过HEALTHCHECK指令添加容器的健康检查机制,以确保容器的正常运行。可以使用CMD或ENTRYPOINT指令来运行健康检查脚本。 7. 清理不必要的文件和依赖项:在构建镜像时,确保删除不再需要的临时文件、缓存和安装包,以减小镜像的大小。 8. 使用环境变量:通过ENV指令设置环境变量,使得容器的配置更加灵活和可配置化。 9. 使用标签管理镜像版本:为镜像添加标签,方便管理和追踪不同版本的镜像。 10. 安全性注意事项:避免在镜像中运行特权进程,确保镜像中的软件包和依赖项是最新的,定期更新基础镜像和应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值