[Linux] Alpine Linux 概述

发布时间 2023-11-02 15:42:08作者: 千千寰宇

1 Alpine Linux 概述

1.1 简介

  • Alpine Linux是一款开源社区开发的、基于musl libcBusyBox轻量级Linux发行版;适合用来做路由器、防火墙、VPNs、VoIP 盒子以及服务器的操作系统。
    • Alpine 的意思是“高山的”。
    • Alpine Linux 围绕 musl libc 和 busybox 构建。这使得它比传统的 GNU/Linux 发行版更小,更节省资源。
    • 一个容器只需不超过 8 MB 的空间。而在磁盘中的最小安装仅要大约 130 MB 的存储空间。
    • 尽管体积很小,Apline 提供了完整的 Linux 环境,其存储库中还包含了大量的软件包备选。
    • 除此之外,Alpine 还对软件包进行了缩减和拆分,以使用户能够对安装内容有更精确的控制,进一步帮助减少安装体积并提高效率。
  • 它专注于安全简单高效,以最小化系统资源消耗和攻击面。
    • Alpine Linux 在设计时注重安全性。
    • 内核采用了一个非官方的 grsecurity/PaX 移植版本(3.8 版本已终止对 grsecuiry 移植版本的支持),并且所有用户空间的二进制文件被编译为位置独立可执行文件(Position Independent Executables)并启用堆栈粉碎保护
    • 这些积极的安全功能可有效防止某些种类的 0-day 攻击。
  • Alpine Linux采用apk包管理器,使软件安装和更新变得简单和快速。
    • Alpine Linux 设计清晰而简练。它采用自有的名为 apk 的包管理器,以 OpenRC 作为初始化(init)系统,安装由脚本驱动。其提供的 Linux 环境简单、清晰且没有任何「噪音」。然后,用户可以基于此添加项目所需的软件包。因此,在各种应用场景下,Alpine 的设计都不会为用户带来麻烦。
  • 它也可以作为容器镜像的基础操作系统。因为它的镜像非常小,这使得它适合于云原生应用微服务架构
    • 由于其小巧、安全、简单以及功能完备的特点,被广泛应用于众多Docker容器中。
    • 我司目前使用的基础镜像均是基于该系统;
    • dockerhub上有提供各种语言的基础镜像.如:node:8-alpinepython:3.6-alpine,同时也可以基于alpine镜像制作符合自己需求的基础镜像。

Alpine Linux 3.18

1.2 不同版本

  • STANDARD:最小的可启动镜像,需要网络才能安装。
  • EXTENDED:包括最常用的软件包。适用于路由器和服务器。从RAM运行。扩展版本,带有更多软件包。
  • NETBOOT:netboot的内核、initramfs和modloop。
  • MINI ROOT FILESYSTEM:最小系统版本,仅包含内核,只用于构建Docker镜像。
  • VIRTUAL:与STANDARD类似,但更小,更适合虚拟系统使用。
  • XEN:内置XEN Hypervisor支持。
  • RASPBERRY PI:带有树莓派内核的版本。
  • GENERIC ARM:带有ARM内核,带有uboot加载器。

1.3 源/镜像

sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

2 工作原理与架构

3 实践应用

3.1 安装部署

3.1.1 基于Alpine Linux与JDK的Docker微服务

案例1

reference-doc
alpine - Official Image | Docker Hub

  • Use like you would any other base image:
    • Use like you would any other base image
FROM alpine:3.14
RUN apk add --no-cache mysql-client
ENTRYPOINT ["mysql"]

案例2

  • 微服务的 Dockerfile
# 启用自定义 Dockerfile  
# 更换 Java 运行环境: 由 JRE 换为 JDK  
# FROM alpine:3.17  
# RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.17/main/ > /etc/apk/repositories  
FROM artifactory.xxxx.cn/docker-remote/eclipse-temurin:8-jdk-alpine  
  
COPY target/app.jar .  
  
# aliyun  
#RUN sed -i 's#http[s]*://[^/]*#http://mirrors.aliyun.com#g' /etc/apk/repositories \  
#  && echo 'http://mirrors.aliyun.com/alpine/edge/testing' >> /etc/apk/repositories \  
#  && apk update \  
#  && apk add fontconfig freetype font-dejavu-sans-mono-nerd libgcc libstdc++ \  
#  && apk add --no-cache --virtual .tzdata tzdata \  
#  && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \  
#  && echo "Asia/Shanghai" > /etc/timezone \  
#  && apk del --no-network .tzdata \  
#  rm -rf /usr/local/*.apk /tmp/* /var/cache/apk/*  
  
# huawei-cloud https://mirrors.huaweicloud.com/home --> Alpine镜像[SDK]  
# 创建目录的原因 `mkdir -p /tmp/bdp-data-service` : 在每个镜像(环境)下都会创建本目录,但目前仅用于压测环境传输出特定文件至OSS而使用(参见 pt.yaml 相关配置)  
RUN sed -i "s#http[s]*://[^/]*#https://repo.huaweicloud.com#g" /etc/apk/repositories \  
  && echo 'https://repo.huaweicloud.com/alpine/edge/testing' >> /etc/apk/repositories \  
  && apk update \  
  && apk add curl \  
  && apk add fontconfig freetype font-dejavu-sans-mono-nerd libgcc libstdc++ \  
  && apk add --no-cache --virtual .tzdata tzdata \  
  && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \  
  && echo "Asia/Shanghai" > /etc/timezone \  
  && apk del --no-network .tzdata \  
  && rm -rf /usr/local/*.apk /tmp/* /var/cache/apk/* \  
  && mkdir -p /tmp/bdp-data-service
  
  
#RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \  
#    && echo "Asia/Shanghai" > /etc/timezone  
  
# 内存溢出时,生成 dump 日志  
ENV JAVA_OPTS $JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintCommandLineFlags -XX:HeapDumpPath=/logs/dump.log  -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow  
# 限制、分配应用程序的内存 ( -Xmx 堆区的的最大内存, -Xms 堆区初始大小, -Xmn (堆区)新生代大小, -XX:MaxMetaspaceSize 元空间的最大值 )  
## ENV JAVA_OPTS $JAVA_OPTS -server -Xmn256m -Xms512m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m  
  
#-XX:+HeapDumpOnOutOfMemoryError -XX:+PrintCommandLineFlags -XX:HeapDumpPath=/logs/dump.log  -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow  
#-server -Xmn256m -Xms512m -Xmx512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m  

ENTRYPOINT exec java -server ${JAVA_OPTS:-} -jar app.jar

cat /etc/os-release

3.1.2 如何在我的电脑上安装Alpine Linux?

  • 从Alpine Linux的官方网站上下载适合您计算机架构的ISO映像文件。
  • 将ISO映像文件刻录到DVD或USB驱动器上。
  • 将DVD或USB驱动器插入您的计算机,并重启计算机。
  • 在计算机启动时,按下相应的键进入BIOS设置,以便从DVD或USB驱动器启动计算机。
  • 选择“Install”选项来开始安装过程。
  • 在安装向导中,选择语言、时区和键盘布局等设置。
  • 分区您的硬盘并选择安装位置。
  • 设置root用户密码和其他用户账户。
  • 选择要安装的软件包并确认安装。
  • 安装完成后,重启计算机并移除DVD或USB驱动器。
  • 登录到Alpine Linux系统并开始使用。

3.2 APK包管理器

Alpine Linux自带的apk包管理器十分好用,而且软件包更新速度很快,一般search和add两个命令就能搞定软件包依赖问题

# 查询软件包 / 搜索可用软件包,搜索之前最好先更新镜像源
apk search wget

apk search                 # 查找所有可用软件包
apk search -v              # 查找所用可用软件包及其描述内容
apk search -v '包名'       # 通过软件包名称查找软件包
apk search -v -d 'docker'  # 通过描述文件查找特定的软件包

# 安装软件
apk add 从仓库中安装最新软件包,并自动安装必须的依赖包,也可以从第三方仓库添加软件包 
	--no-cache 不使用本地镜像源缓存,相当于先执行update,再执行add 
	-U 下载该包的最新版本
	
apk add  wget

apk add openssh                       # 安装一个软件
apk add openssh  vim  bash nginx      # 安装多个软件
apk add --no-cache mysql-client       # 不使用本地镜像源缓存,相当于先执行update,再执行add



# 查看软件信息
apk info           # 列出所有已安装的软件包
apk info -a zlib   # 显示完整的软件包信息
apk info --who-owns /usr/sbin/nginx # 显示指定文件属于的包

# 升级软件
apk upgrade            # 升级所有软件
apk upgrade openssh    # 升级指定软件
apk upgrade openssh  vim  bash nginx # 升级多个软件
apk add --upgrade busybox  # 指定升级部分软件包

# 删除已安装的软件
apk del  wget

apk del openssh     # 删除一个软件 
apk del nginx mysql # 删除多个软件

# 更新软件包索引文件 / 更新最新镜像源列表
apk update

# 获取更多apk包管理的命令参数
apk --help   

3.3 Alpine服务管理

Alpine服务管理官方文档
https://wiki.alpinelinux.org/wiki/OpenRC

3.3.1 Alpine Linux使用OenRC作为其初始化系统

rc-update      # 主要用于不同运行级增加或者删除服务
	add <service> <runlevel> 
	del <service> <runlevel>

rc-service     # 主用于管理服务的状态
	<service> <start stop restart>
	
rc-status      # 要检查服务及其设置的运行级别

rc <runlevel>  # 更改运行级别
	可用运行级别:
		default		#未指定时则默认该级别
		hotplugged
		manual
	特殊运行级别:具体参考上方的官方文档,这里不多做解释。

3.4 应用场景

3.4.1 如何在Alpine Linux上配置网络设置?

  • 打开终端并以root用户身份登录。
  • 输入以下命令来编辑网络配置文件:

vi /etc/network/interfaces

  • 在文件中添加以下内容:

auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp 这将启用本地环回接口和以DHCP方式配置eth0网络接口。如果您的网络需要其他配置,请将上述内容替换为您的网络设置。

  • 保存并退出编辑器。
  • 重启网络服务以使更改生效:

/etc/init.d/networking restart

  • 检查网络连接是否正常:

ping google.com 如果能够ping通,则说明网络连接正常。

3.4.2 如何在Alpine Linux上安装Python环境?

  • 打开终端并以root用户身份登录。
  • 输入以下命令来安装Python和pip包管理器:
apk add python3 py3-pip
  • 等待安装完成后,输入以下命令来确认Python已经安装成功:

python3 --version 如果能够正确显示Python的版本号,则说明Python已经成功安装。

  • (可选)如果您希望安装特定的Python包或库,可以使用pip命令来进行安装。例如,要安装numpy库,可以输入以下命令:

pip install numpy 这将安装最新版本的numpy库。

3.4.3 如何在Alpine Linux上安装和使用Docker?

  • 打开终端并以root用户身份登录。
  • 添加Docker官方GPG密钥:
apk add docker
  • 安装Docker:
apk add docker
  • 启动Docker服务:
rc-update add docker boot service docker start
  • 确认Docker已正确安装和运行:
docker info
  • 如果您希望使用非root用户来运行Docker容器,则需要将该用户添加到docker组:
adduser username docker

其中,username是您要添加到docker组的用户名。

  • 退出终端并重新登录以使更改生效。

现在您已经成功在Alpine Linux上安装并配置了Docker。您可以使用Docker命令来搜索、下载和运行Docker容器镜像。例如,要搜索可用的Docker镜像,可以输入以下命令:

docker search [镜像名称]

其中,[镜像名称]是您要搜索的Docker镜像的名称。

要下载和运行Docker镜像,可以使用以下命令:

docker run [选项] [镜像名称]

其中,[选项]是可选的运行参数,[镜像名称]是您要下载和运行的Docker镜像的名称。

X 参考与推荐文献