Docker镜像大小优化

前言

1
2
3
Docker镜像体积大带来的问题
1. Docker镜像过大很占用镜像仓库存储空间
2. Docker镜像过大影响CI/CD(构建速度)

示例

容器化ReactJS应用程序,优化镜像体积大小

  • npm安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 下载
    https://registry.npmmirror.com/binary.html?path=node/
    # 安装
    tar -zxvf node-xxx.tar.gz
    # 创建软链接
    ln - s /opt/node-xxxx/bin/npm /usr/local/bin/npm
    ln - s /opt/node-xxxx/bin/node /usr/local/bin/node
    ln - s /opt/node-xxxx/bin/npx /usr/local/bin/npx
    # 安装yarn
    npm install -g yarn #如果安装完执行yarn提示无此命令,在对应安装路径做个yarn的软链接
  • 创建项目

1
2
3
4
5
6
7
8
# 借助脚手架通过命令行创建React项目
npx create-react-app docker-image-test
# 进入项目安装依赖并运行项目
cd docker-image-test
yarn install
yarn start

# 浏览器访问测试,http://localhost:3000
  • 构建第一个镜像
1
2
3
4
5
6
7
8
9
10
11
# 使用node镜像
FROM node:14
WORKDIR /app
COPY package.json ./
RUN yarn install
COPY . .
EXPOSE 3000
CMD ["yarn", "start"]

# 运行容器
docker build -t docker-image-test .

查看已构建镜像

1
2
3
4
# 可看到镜像体积在1.42GB,很大

# 使用docker run测试是否能运行
docker run --rm -it -p 3000:3000/tcp docker-image-test:latest
  • 修改基础镜像进行初次优化
1
2
3
4
5
6
7
8
# 使用node:14作为基础镜像后制作的镜像体积很大,如基于alpine的node镜像会很大程度上减少镜像体积
FROM node:14-alpine
WORKDIR /app
COPY package.json ./
RUN yarn install
COPY . .
EXPOSE 3000
CMD ["yarn", "start"]

镜像体积减少到593MB

  • 多级构建优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 在之前的配置中是将所有源代码也复制到工作目录中,这也增大体积。从发布和运行来看我们只需构建好运行目录即可。引入多级构建以减少不必要的代码和依赖于我们的最终镜像。

# STAGE 1
FROM node:14-alpine AS build
WORKDIR /app
COPY package.json ./
RUN yarn install
COPY . /app
RUN yarn build

# STAGE 2
FROM node:14-alpine
WORKDIR /app
RUN npm install -g webserver.local
COPY --from=build /app/build ./build
EXPOSE 3000
CMD webserver.local -d ./build

# 在第一阶段,安装依赖项并构建我们的项目。在第二阶段,我们复制上一阶段构建产物目录,并使用它来运行应用程序。这样在最终镜像中就不会有不必要的依赖和代码。

镜像体积已到128MB

  • 使用nginx来运行应用程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用node服务器运行ReactJS应用程序的静态资源不仅效率低下也造成镜像臃肿。使用nginx这类更轻量服务器来运行应用。
# STAGE 1
FROM node:14-alpine AS build
WORKDIR /app
COPY package.json ./
RUN yarn install
COPY . /app
RUN yarn build

# STAGE 2
FROM nginx:stable-alpine
COPY --from=build /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

镜像体积只有23.7MB!

1
2
3
# 测试应用程序能否启动

docker run --rm -it -p 3000:80/tcp test3:latest
-------------本文结束感谢您的阅读-------------
原创技术分享,感谢您的支持。