容器学习之dockerfile

  本文主要是用于自身的学习与记录

  参考资料放在最前面

  参考资料:

  1.你必须知道的Dockerfile  https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html   https://www.cnblogs.com/edisonchou/

  2. Dockerfile命令详解 https://www.cnblogs.com/yanh0606/p/11360936.html

  3.Dockerfile 中的 COPY 与 ADD 命令 https://www.cnblogs.com/sparkdev/p/9573248.html http://www.cnblogs.com/sparkdev/

  4.容器技术之Dockerfile (一) https://www.cnblogs.com/qiuhom-1874/p/13019411.html  https://www.cnblogs.com/qiuhom-1874/

  docker容器的制作方式主要为两种,第一种为从容器构建镜像,即容器镜像,通过docker commit 的方式进行构建,该方法本菜鸟并不推荐,原因有如下几点:1)镜像为分层结构,容器则为镜像顶层加了一个可写层,这一方式构建的镜像极容易镜像过大。2)容器镜像无法确定这一层可写层内的内容,对于安全性上,存在问题,而且也不易维护。

  第二种镜像构建的方法则为dockerfile,通过dockerfile来控制镜像的构建。这个也是官方推荐的方案,同时毕业也推崇此方案。

  dockerfile为一个纯文本文件,通过指令来控制构建,常用指令如下:

  1.FROM 此指令后面跟随的为基础镜像。例如:FROM centos:7 引用基础镜像centos:7

  2.MAINTAINER 此指令用于维护构建者信息。例如:MAINTAINER XuPangzi <Pangzi@example.com>

  3.LABEL 用于添加标签。例如:LABEL BASE FOR SPRING-CLOUD

  4.COPY 用于拷贝文件,不解压。例如:COPY tomcat.tar  /opt/

  5.ADD 用户拷贝文件,可解压。例如:ADD tomcat.tar /opt/

  6.RUN 用于执行shell命令。例如:RUN  mkdir -p /app/{log,data,conf,lib}

  7.WORKDIR 用于设置工作目录,即进入容器后的默认目录。例如:WORKDIR /app

  8.USER 为运行shell命令的用户。例如:USER app

                   USER app:app

                   USER 500

                   USER 500:500

                   USER app:500

                   USER 500:app

  9.EXPOSE 声明端口。例如:EXPOSE 8881

  10.ENV 环境变量。例如:ENV MYSQL_PORT 8306

  11.ENTRYPOINT 容器启动时执行的命令,不会被docker run 覆盖。例如:ENTRYPOINT ["/bin/bash","-C","/opt/apache-tomcat/start.sh"]  exec 风格  ENTRYPOINT /bin/bash  -C /opt/apache-tomcat/start.sh shell风格

  12.CMD 容器启动时执行的shell命令

 

  谈完dockerfile,该谈一下构建镜像了。通常都是采用 docker build -t example:v1 . 在dockerfile所在目录执行即可,同时ADD和COPY的文件也需要在dockerfile同级,不过为了匹配流水线作业,通常会采用另外一种方式进行构建:

  1.用户自备dockerfile 同时dockerfile以应用来命名,例如APP1_dockerfile,在构建镜像时,执行命令 docker build --no-cache=true -t app_A:v1 -f APP1_dockerfile .

  2.将dockerfile植入到构建脚本中,通过构建是引入的参数来生成dockerfile 同时构建镜像,此方式下仍建议采用命令docker build --no-cache=true -t app_A:v1 -f APP1_dockerfile .

  

  实践:

  1.镜像最好是自己构建,从dockerhub或其他平台pull的私人镜像,无法保证是否里面埋有不安全插件,为了保障安全,推荐自己构建镜像

  2.选择恰当的基础镜像,核心应用,选择较大且稳定的镜像,比如centos,ubuntu,但该镜像的缺点是容易使生成的业务镜像较大,比如centos7+java8+tomcat+应用,轻松过G,若是前端等,则可以使用小巧的基础镜像,比如alpine,busybox,debian等,但该镜像也有不足,镜像追求轻量级,很多基础工具都没有,需要用户自行安装。

  3.构建镜像时要保证层数尽可能的少,此处有一技巧,RUN 后面可跟随多条shell命令,以&链接,同时执行完后一定要记得删除无用文件,以保障镜像最小化。

  所以基于以上几点,可根据公司需求,构建几版基础镜像,比如1、alpine+nginx+lua+curl+telnet等网络调试工具的前端基础镜像。2、alpine+java+tomcat+curl+telnet等调试工具的java基础镜像。3、基于centos和Ubuntu的核心服务镜像。等等等等,将基础镜像构建好后,就可以根据基础镜像设计持续集成流水线来自动化构建业务镜像了。

  继续聊聊基础镜像

  1、busybox

  此镜像集成了上百个linux常用命令,且镜像极小,大约2M,通过docker pull busybox:latest 即可,这个通常用来进行测试,比如写个yaml啥的

  2、alpine

  此镜像为一个轻量级安全向镜像,大小仅5M,关注安全,性能,资源效能,通过docker pull alpine可拉取镜像。鉴于我很多镜像都基于此镜像,这里多叨叨几句。此镜像采用apk安装应用,可在dockerfile

中添加源

  中科大源:echo "http://mirrors.ustc.edu.cn/alpine/" > /etc/apk/repositories

  阿里源:echo "http://mirrors.aliyun.com/alpine/" > /etc/apk/repositories

  清华源:echo "https://mirror.tuna.tsinghua.edu.cn/alpine/" > /etc/apk/repositories

  apk --update add --no-cache

  即可安装,不过记得在安装后删除缓存,使镜像保持最小

  3、ubuntu/centos

  这两个属于重量级的镜像,就放在一起说吧,比较稳定,不过就是容易搞的镜像超大,轻松过G,恐怖如斯,如果有需要jdk和tomcat来运行的java应用,请做好思想准备

未完待续

 

posted @ 2020-05-31 20:43  Devops旭  阅读(180)  评论(0)    收藏  举报