Skip to main content

8.容器其他相关概念

胖容器和瘦容器

"胖容器"(Fat Container)和"瘦容器"(Slim Container)是描述Docker容器镜像大小和结构的两种概念。

胖容器(Fat Container):

胖容器是指包含了更多依赖、工具和库的容器镜像。这种容器镜像可能包含了整个操作系统、运行时环境、各种依赖和工具,使其体积相对较大。这种设计使得容器更加独立,包含了所有运行所需的组件,但也导致了较大的镜像大小。

优点:

  • 完备性:胖容器包含了所有运行所需的依赖,因此非常完备,不依赖于主机环境。

缺点:

  • 镜像体积大:由于包含了完整的操作系统和所有依赖,镜像体积相对较大,传输和存储开销较高。
  • 启动慢:由于要启动完整的操作系统,胖容器的启动时间可能较长。

瘦容器(Slim Container):

瘦容器是指镜像中仅包含应用程序及其运行所需的最小依赖项。这种容器通常基于轻量级的基础镜像,例如Alpine Linux,以减小镜像体积。瘦容器的设计理念是尽可能只包含运行时所需的最小组件,减小资源占用和启动时间。

优点:

  • 镜像体积小:由于只包含了运行时所需的最小依赖,镜像体积相对较小,降低了存储和传输的开销。
  • 启动快:瘦容器通常只需启动应用程序及其运行时依赖,启动速度较快。

缺点:

  • 可能需要外部依赖:由于瘦容器不包含完整的操作系统,某些运行时依赖可能需要在主机环境中提供。

docker镜像多阶段构建使用的场景

多阶段构建(Multi-Stage Build)是一种在Docker中构建镜像的技术,旨在减小最终镜像的大小并提高安全性。它通过将构建过程分为多个阶段,每个阶段生成一个中间镜像,最终的镜像只包含构建所需的最小组件。以下是一些适用多阶段构建的常见场景:

  1. 减小镜像大小:
    • 多阶段构建允许在一个阶段中构建应用程序,然后在另一个阶段中只包含运行时所需的组件,从而减小最终镜像的大小。这对于减少部署时间和减少存储和传输开销特别有用。
  2. 分离构建和运行环境:
    • 有时构建应用程序所需的依赖和工具与运行应用程序时所需的不同。多阶段构建允许在一个阶段中使用完整的构建环境,而在另一个阶段中只包含应用程序和运行时依赖。
  3. 提高安全性:
    • 在构建的最终阶段中,只包含应用程序及其运行时依赖,而不包含构建过程中的工具和敏感信息。这有助于降低攻击面和提高镜像的安全性。
  4. 分离测试和生产环境:
    • 多阶段构建可以允许在不同的阶段使用不同的基础镜像,以适应测试和生产环境的不同需求。测试阶段可以包含更多的调试工具,而生产阶段则专注于最小化依赖。
  5. 提高构建速度:
    • 由于多阶段构建允许只复制构建过程中所需的文件到最终镜像,因此可以提高构建速度。不必将构建环境中的所有文件都复制到最终镜像中。

下面是一个简单的多阶段构建的示例,以Node.js 来构建应用并使用 Nginx 作为 Web 服务器来提供静态文件。

# 第一阶段:构建前端应用
FROM node:14 as builder

WORKDIR /app

# 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制应用程序代码到工作目录
COPY . .

# 构建前端应用
RUN npm run build

# 第二阶段:构建最终镜像
FROM nginx:alpine

# 将第一阶段中构建的前端应用静态文件复制到 Nginx 的默认静态文件目录
COPY --from=builder /app/dist /usr/share/nginx/html

# Nginx 配置文件(可以根据实际需求修改)
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 设置 Nginx 工作目录
WORKDIR /usr/share/nginx/html

# 暴露 Nginx 默认端口
EXPOSE 80

# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]

第一阶段使用 node:14 镜像来构建前端应用,包括安装依赖、构建应用。第二阶段使用 nginx:alpine 镜像作为基础镜像,然后将第一阶段构建的前端应用的静态文件复制到 Nginx 的默认静态文件目录。最后,通过 CMD 命令启动 Nginx 服务器。

多个 FROM 指令并不是为了生成多根的层关系,最后生成的镜像,仍以最后一条 FROM 为准,之前的 FROM 会被抛弃,那么之前的FROM 又有什么意义呢?

每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。 最大的使用场景是将编译环境和运行环境分离

http://stu.jxit.net.cn:88/mianshi/%E9%9D%A2%E8%AF%95%E9%A2%98%E5%BA%93/%E7%AE%80%E9%81%93%E4%BA%91%E9%9D%A2%E8%AF%95.txt