几年前,我曾经对比过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
基于Debian的镜像,竟然有478MB那么大!而用Apline构建的镜像则是Debian的1/6。不用我多说,高下立判。
2、容器运行资源占用情况
docker stats
我在这里只比较了,容器运行初始化状态的所占用的资源状况。可以看出Apline还是略有优势的。如果想知道高负载的状态下它们各自的表现,请读者们可以用自己的应用来测试了,我偷个懒 。
总结
做为运行轻量应用Docker基础系统,Debian和Apline都可以适用。在镜像文件大小和内存占用方面Apline都是优于Debian的,尤其是6倍的大小差距,我们立刻可以算出,它能够帮我们节省多少的带宽!
当然,Debian也并非一无是处,它的兼容性会更好。毕竟Apline是一个高度精简的操作系统,一些Linux底层的库都被移除或替换了(例如:glibc)。因此如果要构建一个包含多种服务和工具的复杂应用容器,例如一个同时包含 Node.js 后端、数据库(如 MySQL 或 PostgreSQL)和 Web 服务器(如 Nginx)的全栈应用开发环境,用Alpine未必能够跑得起来,反而更加笨重Debian 能够满足软件安装和配置的需求,运行起来更加稳定。
最后,还是那句话,根据您的实际应用场景来选择技术架构才有意义。