dockerfile定制镜像
1、Dockerfile格式示例
FROM centos:7
LABEL auth lynn
RUN yum install lrzsz -y
COPY run.sh /usr/bin
EXPOSE 80
CMD [ "run.sh" ]
2、镜像分类
-
基础镜像:例如centos、ubuntu、alpine
-
环境镜像:例如jdk、php、go
-
项目镜像:将项目与环境镜像打包
3、常用指令
3、构建镜像命令
-
语法:
docker build [optins] path|URL|- [flags] options: -t,--tag list #指定镜像名称 -f,--file string #指定dockerfile名称和位置
-
示例:
# dockerfile名称为Dockerfile,且在当前目录 docker build -t lynn/t1 . # dockerfile名称不为Dockerfile,且不在当前目录 docker build -t lynn/t1 -f ./test/myfile ./test # 路径为URL docker build -t lynn/t1 http://www.abc.com/Dockerfile
4、CMD与ENTRYPOINT
-
用法:
-
CMD的exec形式,不支持传变量,shell形式支持。exec模式传变量示例:
FROM centos:7 LABEL maintainer lynn COPY run.sh /usr/bin ENV NAME=lynn EXPOSE 80 CMD ["sh","-c","/usr/bin/run.sh $NAME"]
-
启动镜像时,也可以覆盖docker file中的CMD:
docker run -itd -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql --character-set-server=utf8
-
生产环境常使用ENTRYPOINT结合CMD用(exec形式),可动态的使用CMD为ENTRYPOINT传参。即执行:
[ENTRYPOINT] [CMD]
-
生产环境若只有一条单命令且不常改变,使用CMD即可;若存在灵活传参,可把固定部分放在ENTRYPOINT,改变部分放在CMD。
-
-
小结:
5、案例
-
部署nginx
-
部署博客
-
部署tomcat
-
部署微服务
6、最佳实践原则
-
减少镜像层:一次RUN指令形成一层,尽量shell命令都写在一行,减少镜像层
-
优化镜像大小:一次RUN指令形成一层,如果没有在同一层删除冗余文件,无论最后时候删除,都会带到下一层,所以每一层清理对应的残留数据,减少镜像大小
-
减少网络传输时间:位于公网上的软件包、mvn仓库,应尽量使用私有仓库,提高镜像构建速度。
-
多阶段构建:代码编译、部署在一个Dockerfile完成,只会保留部署阶段产生的数据
-
选择最小的基础镜像:例如alpine