Docker 镜像及制作
简介:镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件;docker官方和个人发布的镜像由于版本等各种原因,漏洞较多,加上网络原因下载镜像较慢,基于这种情况,可以手动定制docker镜像。当运行容器时,如果使用的镜像在本地不存在,docker就会从镜像仓库中下载。
1. Docker镜像
A. 联合文件系统:联合文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来层层叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。一次同时加载多个文件系统,
B. 镜像加载原理:docker的镜像实际上由一层一层的文件系统组成,包含BootFS和RootFS,其中BootFS主要包含bootloader和kernel,rootfs在bootfs之上,包含linux中/dev,/bin,/etc等标准的目录和文件,就是各种不同的操作系统发行版,内存中只加载一份相同的基础镜像;
C. 写时复制管理容器层:docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层被称为容器层,容器层之下都是镜像层。
3、构建镜像的方式
A. docker commit命令
B. docker build和Dockerfile文件
openjdk:8-jre-alpine的镜像没有Font字体库,若代码用到会报空指针异常,需制作带FontConfigFile组件的镜像;
使用当前目录的Dockerfile编译名为openjdk:8-jre-alpine-fonts的镜像:docker build -f /data/Dockerfile -t openjdk:8-jre-alpine-fonts .;
查看指定镜像的创建历史:docker history openjdk:8-jre-alpine-fonts;
4. Dockerfile命令
A. FROM:指定基础镜像,在文件中可以多次出现,并且可以与ARG参数交互,格式:FROM [--platform=<platform>] <image>[:<tag>] [AS <name>];
B. RUN:在镜像构建时执行命令,形成新层,比如安装相关软件,格式如下两种:
RUN command:命令在shell中执行,默认为/bin/sh -c,多个以“\”换行;
RUN ["exec", param1, param2]:另exec形式可以不用shell,EXEC形式被解析为一个JSON系列,但必须使用双引号;
C. LABEL:用于添加镜像的元数据,添加多个属性,最好使用\隔开,而非每次LABEL,格式:LABEL <key>=<value>,如指定镜像作者信息LABEL maintainer=rhxy;
D. WORKDIR:指定指令集所在的工作目录,目录不存在会自动创建,格式:WORKDIR /path/to/workdir;
E. ADD/COPY:添加文件到镜像中,当识别到tar等压缩包时,COPY命令还会进行自动解压操作,格式:ADD/COPY [--chown=<user>:<group>] ["<src>",... "<dest>"],其中<dest>若是目录需要以斜杠结尾,否则视为常规文件;
F. EXPOSE:指明该镜像需要暴露哪些端口,只是一个信息展示,若真要暴露端口还是得通过-p选项生效,格式:EXPOSE port/udp;
G. ENV:指定环境变量,作用于容器环境中的指令,格式:ENV <key>=<value> ...;
H:CMD:用于指定镜像的启动命令,不同于RUN命令,一个Dockerfile文件中,只能写一次CMD,否则只有最后一个命令生效,格式如下三种;
CMD ["executable","param1","param2"](exec形式,这是首选形式)
CMD ["param1","param2"](作为ENTRYPOINT 的默认参数)
CMD command param1 param2(shell形式)
I. ENTRYPOINT:和CMD命令类似,指定镜像启动命令,不同点在于他指定的命令无法被docker run参数取代,格式如下两种:
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2。
J:ARG:指定一个变量,作用于构建阶段,与ENV有区别,格式:ARG <name>[=<default value>]。
5. Docker镜像
A. Docker容器里的文件,其实在宿主机上磁盘上都存在,所以就算docker没有启动,修改文件依然可以在外层进行,比如解决jar包冲突和定位代码为何不是最新的问题;
B. Docker中GraphDriver主要用于管理和维护镜像,包括把镜像从仓库下载和运行时把镜像挂载起来可以被容器访问等,它包含MergeDir、UpperDir、WorkDir;
MergeDir:所有镜像层合并后的文件,即进入容器看到的目录文件;
UpperDir:用户挂载的upper层目录,只读层;
WorkDir:文件系统的工作基础目录。
6、使用jib打包镜像
A. libs对应/app/libs、resources对应/app/resources、classes对应/app/classes目录;
B. JIB使用小结
7. Docker镜像工具dive
8. 自定义文件Dockerfile打镜像
A. xxl-job-admin组件,也是参照Github上Dockerfile文件
FROM openjdk:8-jre-alpine-fonts ENV PARAMS="" ENV TZ=PRC RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ADD app.jar /app.jar ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"]
B. spring-boot微服务
FROM openjdk:8-jre-alpine-fonts LABEL maintainer=rhxy WORKDIR /app COPY spring-boot/libs libs/ COPY spring-boot/resources resources/ COPY spring-boot/classes classes/ ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=3002", "-cp", "/app/resources:/app/classes:/app/libs/*", "com.rhxy.Application"] EXPOSE 8081 3002
可参考:Docker镜像加载原理
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架