一、docker容器的制作方式
第一种为从容器构建镜像,即容器镜像,通过docker commit 的方式进行构建,该方法本菜鸟并不推荐,原因有如下几点:1)镜像为分层结构,容器则为镜像顶层加了一个可写层,这一方式构建的镜像极容易镜像过大。2)容器镜像无法确定这一层可写层内的内容,对于安全性上,存在问题,而且也不易维护。
第二种镜像构建的方法则为dockerfile,通过dockerfile来控制镜像的构建。这个也是官方推荐的方案,同时本人也推崇此方案。
二、dockerfile介绍
dockerfile为一个纯文本文件,通过指令来控制构建,常用指令如下:
1.FROM 此指令后面跟随的为基础镜像。例如:FROM centos:7 引用基础镜像centos:7
2.MAINTAINER 此指令用于维护构建者信息。例如:MAINTAINER XuPangzi Pangzi@example
3.LABEL 用于添加标签。例如:LABEL BASE FOR SPRING-CLOUD
4.COPY 用于拷贝文件,不解压。例如:COPY tomcat.tar /opt/
5.ADD 用户拷贝文件,可解压。例如:ADD tomcat.tar /opt/
6 用于执行shell命令。例如:RUN mkdir -p /app/{log,data,conf,lib}
7DIR 用于设置工作目录,即进入容器后的默认目录。例如: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命令
三、如何构建docker镜像
谈完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 “
mirrors.ustc/alpine/" > /etc/apk/repositories
阿里源:echo “
mirrors.aliyun/alpine/" > /etc/apk/repositories
清华源:echo “
mirror.tuna.tsinghua/alpine/" > /etc/apk/repositories
apk –update add –no-cache
即可安装,不过记得在安装后删除缓存,使镜像保持最小
3、ubuntu/centos
这两个属于重量级的镜像,就放在一起说吧,比较稳定,不过就是容易搞的镜像超大,轻松过G,恐怖如斯,如果有需要jdk和tomcat来运行的java应用,请做好思想准备
五、参考资料
1.你必须知道的Dockerfile
cnblogs/edisonchou/p/dockerfile_inside_introduction.html
cnblogs/edisonchou/
2. Dockerfile命令详解
cnblogs/yanh0606/p/11360936.html
3.Dockerfile 中的 COPY 与 ADD 命令
cnblogs/sparkdev/p/9573248.html
cnblogs/sparkdev/
4.容器技术之Dockerfile (一)
cnblogs/qiuhom-1874/p/13019411.html
cnblogs/qiuhom-1874/
联系客服