网站图片太多怎么办,不买服务器做网站,特色美食网站建设,新版新白娘子传奇小青最后和谁在一起了1、Dockerfile 介绍
如果说容器就是“小板房”#xff0c;镜像就是“样板间”。那么#xff0c;要造出这个“样板间”#xff0c;就必然要有一个“施工图纸”#xff0c;由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。
比起容…1、Dockerfile 介绍
如果说容器就是“小板房”镜像就是“样板间”。那么要造出这个“样板间”就必然要有一个“施工图纸”由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。
比起容器、镜像来说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 directory1、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 images4、生成容器
执行命令
docker run -p 6088:6088 --name springboot --restart always \-d spring-boot:1.0
查看项目启动日志启动成功
docker log 容器id
#动态更细查看日志
docker log -f 容器id5、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缺少字体。
at sun.awt.FcFontManager.(FcFontManager.java:35) org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:705)
解决方式
1.在 Dockerfile 中进行修改增加如下内容
ENV LANG en_US.UTF-8
RUN apk add --update ttf-dejavu fontconfig rm -rf /var/cache/apk/*2.更换jdk镜像源
FROM frolvlad/alpine-java:jdk8-slim
7、保存Docker 镜像部署到其他机器
在源机器上导出 Docker 镜像
docker save -o 保存路径/镜像文件名.tar 镜像名称:标签docker save -o /tmp/myimage.tar myimage:latest 将镜像文件复制到目标机器。你可以使用 scp、rsync 或其他文件传输工具将文件复制到目标机器。 在目标机器上导入 Docker 镜像
docker load -i 镜像文件路径/镜像文件名.tardocker load -i /tmp/myimage.tar
查看目标机器上加载了镜像
docker images