网站seo视频教程,在哪里做企业网站,罗湖网站建设-信科网络,seo 知乎比起容器、镜像来说#xff0c;Dockerfile 非常普通#xff0c;它就是一个纯文本#xff0c;里面记录了一系列的构建指令#xff0c;比如选择基础镜像、拷贝文件、运行脚本等等#xff0c;每个指令都会生成一个 Layer#xff0c;而 Docker 顺序执行这个文件里的所有步骤Dockerfile 非常普通它就是一个纯文本里面记录了一系列的构建指令比如选择基础镜像、拷贝文件、运行脚本等等每个指令都会生成一个 Layer而 Docker 顺序执行这个文件里的所有步骤最后就会创建出一个新的镜像出来。
2、编写java项目对应的Dockerfile
# 使用 OpenJDK 8 作为基础镜像
FROM openjdk:8-jdk-alpine# 作者信息
LABEL maintainerflgb# 设置环境变量
ENV SPRING\_OUTPUT\_ANSI\_ENABLEDALWAYS \JAVA\_OPTS-Xms2048m -Xmx2048m -Dspring.profiles.activeprod -Dserver.port6088\PORT6088
# spring-boot-admin.jar相对于Dockerfile的路径
COPY /spring-boot-admin.jar /spring-admin.jar# sh shell -c 执行后面命令
ENTRYPOINT [sh, -c, java $JAVA\_OPTS -jar /spring-admin.jar]#通过 EXPOSE 命令暴露外部访问容器端口
EXPOSE $PORT
注意点
ADD 和COPY 的区别
COPY 和 ADD 都是用于将文件从主机复制到 Docker 容器内部的命令但它们之间有一些区别
COPY 命令只能复制本地主机上的文件或目录到容器内部不能从 URL 或者其他网络资源复制文件。而 ADD 命令可以从本地主机、URL 或者其他网络资源复制文件。ADD 命令支持自动解压缩 tar 类型的文件如压缩文件 .tar、.tar.gz、.tar.bz2、.tar.xz并将解压后的内容复制到容器内。而 COPY 命令则只是简单地复制文件不会自动解压缩。由于 ADD 命令的功能更多因此在复制文件时建议优先使用 COPY 命令除非需要 ADD 的特殊功能。
CMD 和 ENTRYPOINT的区别
CMD 指令
CMD 用于指定容器启动时要执行的命令。可以有多个 CMD 指令但只有最后一个生效。如果 Dockerfile 中没有 CMD 指令则默认会执行容器启动时所用的镜像的 CMD 命令。CMD 指令可以被 Docker run 命令中的参数覆盖。
ENTRYPOINT 指令
ENTRYPOINT 用于指定容器启动时要执行的可执行文件或脚本。 只需要运行该镜像就会自动执行 ENTRYPOINT 指定的命令如果 Dockerfile 中存在多个 ENTRYPOINT 指令则只有最后一个生效。在运行容器时可以通过在 docker run 命令中指定参数来覆盖 ENTRYPOINT 中的内容。如果 Dockerfile 中同时存在 ENTRYPOINT 和 CMD 指令则 CMD 的内容会被作为参数传递给 ENTRYPOINT 所指定的可执行文件或脚本。
3、构建java项目镜像
docker build [OPTIONS] PATH | URL | -
其中PATH 可以是本地文件系统上 Dockerfile 文件所在的路径也可以是 URL或者是 -表示使用标准输入。OPTIONS 是一些可选参数常用的参数包括
-t, --tag为镜像设置一个标签格式为 :。例如-t myimage:1.0。-f, --file指定要使用的 Dockerfile 文件的路径。如果不指定默认为当前目录下的 Dockerfile 文件。其他选项包括 --build-arg、–pull、–no-cache 等可以根据需要进行设置。
例如如果 Dockerfile 文件位于当前目录下可以使用以下命令构建镜像并设置标签
docker build -t spring-boot:1.0 .
上传dockerfile和spring-boot-admin jar到对应路径/data/java/spring-boot下 构建镜像
docker build -t spring-boot:1.0
Build的路径问题
经常会遇到如下报错
COPY failed: stat xxxx: no such file or directory
1、Dockerfile 文件查找不到 如果dockerfile不在当前目录则需要指定dockerfile 目录构建
docker build -f /data/java/spring-boot/Dockerfile -t spring-boot:1.0
2、Copy /spring-boot-admin.jar文件找不到的问题
COPY 命令中指定的源路径应该是相对于 Dockerfile 的路径。
如果 spring-boot-admin.jar 文件位于与 Dockerfile 同级的目录下应该将 COPY 命令修改为
COPY spring-boot-admin.jar /spring-admin.jar
如果 spring-boot-admin.jar 文件位于 Dockerfile 的上级目录中可以使用 … 来指定父级目录
COPY ../spring-boot-admin.jar /spring-admin.jar
PS:一开始把COPY 的路径设置成了/data/java/spring-boot/spring-boot-admin.jar一直找不到报错
failed to walk /var/lib/docker/tmp/buildkit-mount2576932656/data/java/spring-boot: lstat /var/lib/docker/tmp/buildkit-mount2576932656/data/java/spring-boot: no such file or directory
查看已经构建成功的镜像
docker images
4、生成容器
执行命令
docker run -p 6088:6088 --name springboot --restart always \-d spring-boot:1.0
查看项目启动日志启动成功
docker log 容器id
#动态更细查看日志
docker log -f 容器id 5、docker 应用日志映射到本地
进入容器里面查看日志
#查看对应容器id
docker ps
#进入容器
docker exec -it container_id bash
#如果没装对应的bash命令使用sh进入
docker exec -it container_id sh
#查看目录
ls
#退出容器
exit
#进入logback配置的输出log地址查看日志文件
#停止容器
docker stop id
#删除容器
docker rm id
#重新生成挂在日志到本地目录的容器
docker run -p 6088:6088 --name spring-boot --restart always \
-v /home/spring-boot/logs:/home/spring-boot/logs \
-d spring-boot:1.0
同步查看本地目录
6、docker环境下 easyExcel导出错误
java.lang.NullPointerException: nullat sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)at sun.awt.FontConfiguration.init(FontConfiguration.java:107)at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:774)at sun.font.SunFontManager$2.run(SunFontManager.java:431)at java.security.AccessController.doPrivileged(Native Method)at sun.font.SunFontManager.init(SunFontManager.java:376)at sun.awt.FcFontManager.init(FcFontManager.java:35)at sun.awt.X11FontManager.init(X11FontManager.java:57)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:423)at java.lang.Class.newInstance(Class.java:442)at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)at java.security.AccessController.doPrivileged(Native Method)at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)at java.awt.Font.getFont2D(Font.java:491)at java.awt.Font.canDisplayUpTo(Font.java:2060)at java.awt.font.TextLayout.singleFont(TextLayout.java:470)at java.awt.font.TextLayout.init(TextLayout.java:531)at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:273)at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.init(AutoSizeColumnTracker.java:117)at org.apache.poi.xssf.streaming.SXSSFSheet.init(SXSSFSheet.java:82)at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684)at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:705)
因为docker的基础镜像openjdk缺少字体。