当前位置: 首页 > news >正文

深圳市手机网站建设厦门好景科技做网站

深圳市手机网站建设,厦门好景科技做网站,门户网站cms系统,设计公司展厅图片众所周知#xff0c;作为一个文本文档#xff0c;Dockerfile包含了用户创建镜像的所有命令和说明。Docker可以通过读取Dockerfile中指令的方式#xff0c;去自动构建镜像。因此#xff0c;大家往往认为编写Dockerfile理应非常简单#xff0c;只需从互联网上选择一个示例作为一个文本文档Dockerfile包含了用户创建镜像的所有命令和说明。Docker可以通过读取Dockerfile中指令的方式去自动构建镜像。因此大家往往认为编写Dockerfile理应非常简单只需从互联网上选择一个示例并通过自定义来满足实际需求即可。然而事实并非如此。 由于生产环境有着严格的要求特别是在安全方面因此虽然有许多示例能够适合开发环境但不一定在生产环境中也合适。另外由于Docker也提供了一套编写Dockerfile的指导策略这就导致了Dockerfile像编写代码那样您可能知道了相关语法却不一定能够用特定的编程语言写出干净、简洁的代码。下面我将和您探讨7项在编写Dockerfile时比较实用的优秀策略与理论实践。 一、简介 首先让我们来看一个典型的Dockerfile示例 Dockerfile FROM eclipse-temurin:17 RUN mkdir /opt/app ARG JAR_FILE ADD target/${JAR_FILE} /opt/app/app.jar CMD [java, -jar, /opt/app/app.jar] 根据其内容该Dockerfile会执行以下操作 lFROM将Java Docker镜像--eclipse-temurin:17作为基本镜像;lRUN为jar文件创建一个目录;lARG:通过提供一个参数--JAR_FILE避免将jar文件名被硬编码到Dockerfile中;lADD:将jar文件添加到Docker镜像中;lCMD:包含了在运行容器时必须执行的命令。 可见上述每个段落生成的Dockerfile都可以在Git存储库的Dockerfiles目录下被找到。而且在每个段落的末尾处相应的Dockerfile名称也会在适用的地方被提及。下面我们将通过修改该Dockerfile来实现七种优秀实践。 二、先决条件 在继续阅读下文之前您需要具备的先决条件是 基本的Linux知识基本的Java和Spring Boot知识基本的Docker知识 三、应用示例 为了展示各项优秀实践我事先创建了一个包含Spring Web依赖项的基本Spring Boot应用。该应用可以通过在存储库的根目录中调用以下命令来运行 Shell $ MVN spring-boot:run 而为了构建Docker镜像我将使用Spotify的dockerfile-maven-plugin的一个分支。为此我会将如下代码段添加到pom文件中。 XML plugin groupIdcom.xenoamess.docker/groupId artifactIddockerfile-maven-plugin/artifactId version1.4.25/version configuration repositorymydeveloperplanet/dockerbestpractices/repository tag${project.version}/tag buildArgs JAR_FILE${project.build.finalName}.jar/JAR_FILE /buildArgs /configuration /plugin 使用该插件的好处在于您可以轻松地重用配置。同时为了实现通过Maven命令来创建Docker镜像您可以通过调用如下命令来构建jar文件 Shell $ mvn clean verify 接着请通过调用如下命令来构建Docker镜像 Shell $ mvn dockerfile:build 如下命令可让您运行Docker镜像 Shell $ docker run --name dockerbestpractices mydeveloperplanet/dockerbestpractices:0.0.1-SNAPSHOT 然后请通过如下代码来找到运行中的容器的IP地址: Shell $ docker inspect dockerbestpractices | grep IPAddress SecondaryIPAddresses: null, IPAddress: 172.17.0.3,IPAddress: 172.17.0.3 本例的IP地址为172.17.0.3。同时该应用还包含一个只用来响应hello消息的HelloController。而且Hello端点可以通过如下方式被调用: Shell $ curl http://172.17.0.3:8080/hello Hello Docker! 至此一切就绪了。 四、各项优秀实践 1.该使用哪个镜像 在前文中我们提到了本例Dockerfile中使用到的镜像是eclipse-temurin:17。下面我们来看看该镜像是如何被构建的 请访问DockerHub的链接;搜索‘eclipse-temurin’;导航到“标签”;搜索17;按A-Z排序;单击标签17。 如果您仔细观察页面每个层的细节并将其与标签17-JRE进行比较就会注意到标签17包含了一个完整的JDK而标签17-JRE只是包含了JRE。当然后者对于运行Java应用来说已经足够了毕竟在生产环境中运行各种应用是不需要整个JDK的。而且由于开发工具可能会被滥用因此JDK在使用中也带有一定的安全问题。此外标签17的镜像在压缩后的尺寸为235MB而17-jre的压缩后尺寸只有89MB。 为了进一步减小镜像的尺寸我们可以使用经“瘦身”的镜像17-jre-alpine。该镜像的压缩后尺寸为59MB足足比17-jre减少了30MB因此它更容易被分发。 值得注意到是以上使用的标签均为通用标签且指向的是最新版本。这对于开发环境来说可能没有问题但是对于生产环境而言您需要事先明确所使用的版本。本例中使用的标签便是17.0.5_8-jre-alpine。如您想进一步加固安全则可以将SHA256散列添加到镜像的版本中。SHA256散列可以在包含了这些层的页面上找到。当SHA256的哈希值与Dockerfile中定义的哈希值无法对应时构建Docker镜像的过程将会失败。 在本例中Dockerfile的第一行为 Dockerfile FROM eclipse-temurin:17 有了上面的知识我们可以将该行更改为 Dockerfile FROM eclipse-temurin: 17.0.5_8-jre-alpinesha256:02c04793fa49ad5cd193c961403223755f9209a67894622e05438598b32f210e 如下代码所示在Docker镜像完成构建后您会注意到曾经未压缩的镜像从以前的475MB缩小到现在的188MB。 Shell $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mydeveloperplanet/dockerbestpractices 0.0.1-SNAPSHOT 0b8d89616602 3 seconds ago 188MB 生成的Dockerfile在Git存储库中被命名为1-Dockerfile-specific-image。 2.不要以Root用户运行 默认情况下应用程序在容器中会以Root用户身份运行。这显然会暴露许多漏洞风险并且也不是必要的。对此您应该为应用定义一个系统级用户。如下代码所示在启动容器时的第一行日志中您可以看到该应用是由Root启动的。 Shell 2022-11-26 09:03:41.210 INFO 1 --- [ main] m.MyDockerBestPracticesPlanetApplication : Starting MyDockerBestPracticesPlanetApplication v0.0.1-SNAPSHOT using Java 17.0.5 on 3b06feee6c65 with PID 1 (/opt/app/app.jar started by root in /) 我们可以通过向Dockerfile中添加组javauser和用户javauser来创建系统级用户。然后通过向Dockerfile中添加如下指令来实现。其中javauser是一个系统级用户并不具备登录权限。注意为了只创建一个层面组和用户的创建步骤都被符号组合到了一行之中。 Dockerfile RUN addgroup——system javauser adduser -S -S /usr/sbin/nologin -G javauser javauser 下表列出了可用于adduser的完整参数集 -h即DIR主目录-g即GECOS字段-s即登录SHELL-G即组-S即创建系统级用户-D即不用设置密码-H即不要创建主目录-u即UID用户id-k即Skeleton目录(/etc/SKEL) 同时您也可以通过添加如下一行将目录/opt/apt的所有者更改为新的javauser否则javauser将无法访问该目录 Dockerfile RUN chown -R javauser:javauser /opt/app 最后您需要确保通过USER命令在容器中实际使用了javauser。其对应的完整Dockerfile为 Dockerfile FROM eclipse-temurin:17.0.5_8-jre-alpinesha256:02c04793fa49ad5cd193c961403223755f9209a67894622e05438598b32f210e RUN mkdir /opt/app RUN addgroup --system javauser adduser -S -s /usr/sbin/nologin -G javauser javauser ARG JAR_FILE ADD target/${JAR_FILE} /opt/app/app.jar RUN chown -R javauser:javauser /opt/app USER javauser CMD [java, -jar, /opt/app/app.jar] 为了测试这个新的镜像您首先需要通过如下命令停止并删除正在运行的容器。 Shell $ docker stop dockerbestpractices $ docker rm dockerbestpractices 完成重新构建并再次运行容器后如下代码所示您可以在第一行日志中看到该应用程序是由javauser启动的。 Shell 2022-11-26 09:06:45.227 INFO 1 --- [ main] m.MyDockerBestPracticesPlanetApplication : Starting MyDockerBestPracticesPlanetApplication v0.0.1-SNAPSHOT using Java 17.0.5 on ab1bcd38dff7 with PID 1 (/opt/app/app.jar started by javauser in /) 同样生成的Dockerfile在Git存储库中被命名为2-Dockerfile-do-not-run-as-root。 3.使用WORKDIR 在您使用的Dockerfile中目录/opt/app是被一次性创建的毕竟这是您的工作目录。就算它并不存在Docker也会帮您默认创建。因此您不必每一次都重复这条路径。例如您会看到Dockerfile的第二行包含了如下RUN指令 Dockerfile RUN mkdir /opt/app 我们可以通过使用WORKDIR指令来稍作改变 Dockerfile WORKDIR /opt/app 由于WORKDIR指令已经确保了您在该目录下因此您完全可以删除每一个/opt/app的引用。因此新的Dockerfile如下代码所示 Dockerfile FROM eclipse-temurin:17.0.5_8-jre-alpinesha256:02c04793fa49ad5cd193c961403223755f9209a67894622e05438598b32f210e WORKDIR /opt/app RUN addgroup --system javauser adduser -S -s /usr/sbin/nologin -G javauser javauser ARG JAR_FILE ADD target/${JAR_FILE} app.jar RUN chown -R javauser:javauser . USER javauser CMD [java, -jar, app.jar] 完成构建并重新运行容器后您可以在如下日志中看到jar文件仍然在/opt/app目录中被执行 Shell 2022-11-26 16:07:18.503 INFO 1 --- [ main] m.MyDockerBestPracticesPlanetApplication : Starting MyDockerBestPracticesPlanetApplication v0.0.1-SNAPSHOT using Java 17.0.5 on fe5cf9223143 with PID 1 (/opt/app/app.jar started by javauser in /opt/app) 同样生成的Dockerfile在Git存储库中被命名为3-Dockerfile-use-workdir。 4.使用ENTRYPOINT CMD指令和ENTRYPOINT指令之间是存在区别的。简而言之两者的使用场景分别是 ENTRYPOINT当您总需要执行各种命令才能构建出可执行的Docker镜像时只要您愿意完全可以将参数附加到命令中。 CMD当您想提供一个默认的参数集且允许在容器运行时被命令行覆盖时。 那么在运行Java应用的情况下请最好使用ENTRYPOINT。例如原本Dockerfile的最后一行为 Dockerfile CMD [java, -jar, app.jar] 现在可以变为 Dockerfile ENTRYPOINT [java, -jar, app.jar] 完成构建并重新运行容器您并不会注意到有任何特定的差异容器仍然会照常运行。生成的Dockerfile在Git存储库中被命名为4-Dockerfile-use-entrypoint。 5.使用COPY代替ADD COPY和ADD指令也似乎比较类似。然而COPY要比ADD更好毕竟COPY只是复制文件到镜像而ADD还有一些额外的特性比如添加来自远程资源的文件。 Dockerfile中的ADD命令行为 Dockerfile ADD target/${JAR_FILE} app.jar 如果改用COPY命令则为 Dockerfile COPY target/${JAR_FILE} app.jar 重新构建并运行容器您同样看不出显著变化除了在构建日志中显示的是COPY命令而不是ADD命令。生成的Dockerfile在Git存储库中可用名称为5-Dockerfile-use-copy-instead-of-add。 6.使用.dockerignore 为了防止Docker镜像被意外地添加文件您可以使用.dockerignore文件来指定哪些文件可以被发送到Docker守护进程中或者是在镜像中被使用。一种值得推荐的方法是忽略所有的文件仅显式地添加那些您允许的文件。通过在.dockerignore文件中添加星号我们可以排除所有的子目录和文件。当然为了将jar文件放入构建的上下文您也可以使用感叹号来避免忽略jar文件。如下dockerignore文件所示我们可以将它添加到运行Docker命令的目录中。例如在本例中我们将其添加到Git存储库的根目录上。 Plain Text **/** !target/*.jar 完成构建并重新运行容器后其变化可能并不显著。但是当您使用npm开发时由于node_modules目录不再被复制到Docker构建的上下文中因此您能够明显地感受到创建Docker镜像的过程被缩短了。注意您可以直接在Git存储库的Dockerfiles目录下找到dockerignore文件。 7.以non-root方式运行Docker守护进程 默认情况下Docker守护进程是以Root身份运行的。通过前文的讨论您一定觉察到了潜在的安全问题。庆幸的是从Docker v20.10开始我们可以non-root用户运行Docker守护进程了。 此外您也可以利用无守护进程daemonless的容器引擎--Podmanhttps://podman.io/。以默认non-root方式运行。虽然有人认为Podman是Docker的临时替代品但是它们在容器中挂载卷的方面有所区别。 五、小结 在上文中我们介绍了7种编写Dockerfile和运行容器的最佳实践。虽然编写Dockerfile并不复杂但是若想正确、规范地编写还是需要您花些时间去研究和理解其使用说明的。
http://www.dnsts.com.cn/news/181858.html

相关文章:

  • 做推广网站排名wordpress 地图导航代码
  • 站内关键词排名软件wordpress加侧边栏
  • 用英文字母做网站关键词it人力外包服务
  • 网站注销主体注销申请域名建立网站
  • 开网站做女装好还是童装好怎么做网站可手机看
  • 网站收录时有时没有智通人才招聘网最新招聘
  • 网站源码如何安装什么专业就业前景好
  • ftp网站上传之后怎么办在哪买网站链接
  • 论坛建站教程如何做文献ppt模板下载网站
  • 临沂网站建设网站推广建立网站费用怎么做会计分录
  • 渭南网站建设公司农产品网站建设背景
  • 网站的设计公司图片外链生成工具在线
  • 如何做外国网站销售wordpress 会员登录
  • 怎样建立手机网站怎么样做推广网站
  • 企业移动端建设与网站建设赣州九一人才网最新招聘
  • 哈尔滨做网站巨耀公司怎么做网站卖产品
  • 新增网站推广长兴网站制作公司
  • 北京市建设工程招标网站网址大全123下载apk
  • 公司网站建设推荐免费 成品模板网站
  • 自己做网站推广关键词北京网站制作推广
  • 网站建设时关键词要怎么选呢wordpress 不显示中文图片
  • 长沙宁乡建设网站alexa
  • 完成网站群建设百度下载安装最新版
  • 丰台路网站建设wordpress4.8.3安装
  • 移动网站建设口碑好西安室内设计公司排名
  • 深圳网站建设微赢天下安徽建设工程信息网官
  • 定制型网站设计百度网站链接提交页面
  • 做网站南昌短视频拍摄剪辑培训班
  • 建行网站首页登录社交网站的设计
  • 如何网站做专题英文网站建设技术