关于java:Docker-镜像优化从-116-GB-到-224MB怎么做到的

6次阅读

共计 2235 个字符,预计需要花费 6 分钟才能阅读完成。

起源:http://blog.csdn.net/update7

Docker 简介

Docker 是一个供软件开发人员和系统管理员应用容器构建、运行和与分享应用程序的平台。容器是在独立环境中运行的过程,它运行在本人的文件系统上,该文件系统是应用 docker 镜像构建的。镜像中蕴含运行应用程序所需的所有(编译后的代码、依赖项、库等等)。镜像应用 Dockerfile 文件定义。

术语 dockerization 或 containerization 通常用于定义创立 Docker 容器的过程。

因为容器具备如下长处,所以很受欢迎:

  • 灵活性:即便是最简单的应用程序也能够容器化。
  • 轻量化:容器共享主机内核,使得它们远比虚拟机高效。
  • 便携性:能够做到本地编译,到处运行。
  • 松耦合:容器自我封装,一个容器被替换或降级不会打断别的容器。
  • 安全性:容器对过程进行了严格的限度和隔离,而无需用户进行任何配置。

在这篇文章中,我将重点探讨如何优化 Docker 镜像以使其轻量化。

优化过程

让咱们从一个示例开始,在该示例中,咱们构建了一个 React 应用程序并将其容器化。运行 npx 命令并创立 Dockerfile 之后,咱们失去了如图 1 所示的文件构造。

npx create-react-app app --template typescript

如果咱们构建一个根底的 Dockerfile(如下所示),咱们最终会失去一个 1.16 GB 的镜像:

FROM node:10 
WORKDIR /app
COPY app /app
RUN npm install -g webserver.local
RUN npm install && npm run build 
EXPOSE 3000
CMD webserver.local -d ./build

第一步优化:应用轻量化根底镜像

在 Docker Hub(公共 Docker 仓库)中,有一些镜像可供下载,每个镜像都有不同的特色和大小。

通常,相较于基于其余 Linux 发行版(例如 Ubuntu)的镜像,基于 Alpine 或 BusyBox 的镜像十分小。这是因为 Alpine 镜像和相似的其余镜像都通过了优化,其中仅蕴含起码的必须的软件包。在上面的图片中,你能够看到 Ubuntu、Alpine、Node 和基于 Alpine 的 Node 镜像之间的大小比拟。

通过批改 Dockerfile 并应用 Alpine 作为根底镜像,咱们的镜像最终大小为 330MB:

FROM node:10-alpine 
WORKDIR /app
COPY app /app
RUN npm install -g webserver.local
RUN npm install && npm run build 
EXPOSE 3000
CMD webserver.local -d ./build

第二步优化:多阶段构建

通过多阶段构建,咱们能够在 Dockerfile 中应用多个根底镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样咱们就能够抛弃不须要的货色。

在本例中,咱们部署 React 应用程序须要的是编译后的代码,咱们不须要源文件,也不须要 node_modules 目录和 package.json 文件等。

通过将 Dockerfile 批改为如下内容,咱们最终失去的镜像大小为 91.5MB。请记住,来自第一阶段(第 1-4 行)的镜像不会被主动删除,Docker 将它保留在 cache 中,如果咱们在另一个构建镜像过程中执行了雷同的阶段,就能够使镜像构建更快。所以你必须手动删除第一阶段镜像。

FROM node:10-alpine AS build
WORKDIR /app
COPY app /app
RUN npm install && npm run build  
FROM node:10-alpineWORKDIR /app
RUN npm install -g webserver.local
COPY --from=build /app/build ./build
EXPOSE 3000
CMD webserver.local -d ./build

当初咱们有了一个 Dockerfile,它有两个阶段:在第一个阶段中,咱们编译我的项目,在第二个阶段中,咱们在 web 服务器上部署应用程序。然而,Node 容器并不是提供网页(HTML、CSS 和 JavaScript 文件、图片等)服务的最佳抉择,最好的抉择是应用像 Nginx 或 Apache 这样的服务。

在本例中,我将应用 Nginx。另外,Nginx 系列面试题和答案全副整顿好了,微信搜寻​Java 技术栈,在后盾发送:面试,​能够在线浏览。

通过将 Dockerfile 批改为如下内容,咱们的镜像最终大小是 22.4MB,如果咱们运行这个容器,咱们能够看到网页能够失常工作,没有任何问题(图 7)。

FROM node:10-alpine AS build
WORKDIR /app
COPY app /app
RUN npm install && npm run build  
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)

2. 别在再满屏的 if/ else 了,试试策略模式,真香!!

3. 卧槽!Java 中的 xx ≠ null 是什么新语法?

4.Spring Boot 2.5 重磅公布,光明模式太炸了!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0