Docker的Linux基础镜像,用Debian还是Apline呢?

时间:10/29/2024 11:58:10   作者:ChenReal    阅读:57

几年前,我曾经对比过Ubuntu和Debian两个Linux服务器的原生操作系统使用,各自的优劣。得出的结论是Debian更胜一筹。

今天,打算继续讨论一下Linux操作系统。不过,这次是以Docker应用容器的基础镜像的角度来做比较。看看Debian还是Apline哪一个更加优秀。

应用场景

记得有一位资深的架构师说过:“脱离了实际业务场景去谈架构,就是耍流氓”。因此,开始之前先交代一下我的应用场景:

  • 一个简单的博客系统的 API
  • 使用Node.js 搭配 Express 框架提供WebAPI
  • 主要功能:分类文章的发布、图片附件管理、留言评论系统等

以上场景,属于轻量级的服务端应用的部署,无论是Debian还是Apline,都能够胜任。下面是应用的代码示例。

package.json配置
{
  "name": "simple-blog",
  "version": "1.0.0",
  "main": "app.js",
  "description": "blog webapi",
  "scripts": {
    "start": "node app.js"
  },
  "engines": {
    "node": "20.x"
  },
  "license": "MIT",
  "dependencies": {
    "body-parser": "^1.20.3",
    "dotenv": "^16.4.5",
    "express": "^4.21.0"
  }
}
app.js代码
const express = require('express');
const http = require('http');
const bodyParser = require('body-parser');
require('dotenv').config();
const app = express();
const PORT = process.env.PORT || 8080;

app.use(bodyParser.json());

app.get('/', (req, res) => {    
    res.send('This is Simple-Blog API!');
});
...

const server = http.createServer(app);

server.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}.`);
});

开始测试

1、首先,分别准备两个Dockerfile配置。

Dockerfile for Debian

FROM debian:bullseye-slim

# 安装wget
RUN apt update && apt install wget -y

# 设置Node.js的版本
ENV NODE_VERSION 20.12.2

# 下载Node.js
RUN wget https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz

RUN tar -xf node-v$NODE_VERSION-linux-x64.tar.gz
RUN rm node-v$NODE_VERSION-linux-x64.tar.gz
RUN mv node-v$NODE_VERSION-linux-x64 /var/local/node-v$NODE_VERSION

RUN ln -sf /var/local/node-v$NODE_VERSION/bin/node /usr/local/bin/
RUN ln -sf /var/local/node-v$NODE_VERSION/bin/npm /usr/local/bin/
RUN ln -sf /var/local/node-v$NODE_VERSION/bin/npx /usr/local/bin/

WORKDIR /app
COPY ./app ./

# 拉取依赖包
RUN cd /app && npm install

# 设置默认命令
ENTRYPOINT ["node", "app.js"]

Dockerfile for Apline

FROM alpine:3.20

# 安装Node.js
RUN apk add --update nodejs npm
# 清理缓存,减小镜像体积
RUN apk del --purge -r curl && rm -rf /var/cache/apk/*

WORKDIR /app
COPY ./app ./

# 拉取依赖包
RUN cd /app && npm install

# 设置默认命令
ENTRYPOINT ["node", "app.js"]
2、接着,构建Docker镜像
# 构建Docker镜像
docker build -t simple-blog:debian .

# 构建Apline镜像
docker build -t simple-blog:apline .
3、运行Docker镜像
container_name=simple-blog

# 运行Debian镜像
docker run -d --restart=always \
 -p 9100:8080 \
 --name $container_id-debian \
 -d $container_id:debian

# 运行Apline镜像
docker run -d --restart=always \
 -p 9101:8080 \
 --name $container_id-apline \
 -d $container_name:apline

测试结果

1、容器镜像的大小
docker images |grep simple-blog

docker-image-size

基于Debian的镜像,竟然有478MB那么大!而用Apline构建的镜像则是Debian的1/6。不用我多说,高下立判。

2、容器运行资源占用情况
docker stats

docker-runtime.png

我在这里只比较了,容器运行初始化状态的所占用的资源状况。可以看出Apline还是略有优势的。如果想知道高负载的状态下它们各自的表现,请读者们可以用自己的应用来测试了,我偷个懒 。

总结

做为运行轻量应用Docker基础系统,Debian和Apline都可以适用。在镜像文件大小内存占用方面Apline都是优于Debian的,尤其是6倍的大小差距,我们立刻可以算出,它能够帮我们节省多少的带宽!

当然,Debian也并非一无是处,它的兼容性会更好。毕竟Apline是一个高度精简的操作系统,一些Linux底层的库都被移除或替换了(例如:glibc)。因此如果要构建一个包含多种服务和工具的复杂应用容器,例如一个同时包含 Node.js 后端、数据库(如 MySQL 或 PostgreSQL)和 Web 服务器(如 Nginx)的全栈应用开发环境,用Alpine未必能够跑得起来,反而更加笨重Debian 能够满足软件安装和配置的需求,运行起来更加稳定。

最后,还是那句话,根据您的实际应用场景来选择技术架构才有意义。

 

评论
0/200