1 Alpine 简要介绍

Alpine 的意思是“高山的”,比如 Alpine plants 高山植物,Alpine skiing 高山滑雪, the alpine resort 阿尔卑斯山胜地。
Alpine Linux 网站首页注明 “Small!Simple!Secure!Alpine Linux is a security-oriented, lightweight Linux distribution based on musl libc and busybox.”
概括了以下特点:

  • 小巧:基于Musl libc和busybox,和busybox一样小巧,最小的Docker镜像只有5MB
  • 安全:面向安全的轻量发行版;
  • 简单:提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便。
  • 适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像。

    2 Alpine 本地安装

    Alpine Linux是一个完整的操作系统,像其他操作系统一样,可以将Alpine安装到本地硬盘中。
    在安装过程中,可以指定一些电脑的基本设置,比如键盘布局、主机名、网卡、IP地址、root口令修改、时区设置、软件仓库地址、SSH服务器、NTP客户端、系统安装方式、磁盘格式化等。

    3 Alpine 的配置和使用

    3.1 更新国内源

    Alpine的源文件为:

    1. /etc/apk/repositories

    默认的源地址为:http://dl-cdn.alpinelinux.org/
    image.png
    #可以编辑源文件 /etc/apk/repositories
    #采用国内阿里云的源,文件内容为:

    1. https://mirrors.aliyun.com/alpine/v3.12/main/
    2. https://mirrors.aliyun.com/alpine/v3.12/community/

    如果采用中国科技大学的源,文件内容为:

    https://mirrors.ustc.edu.cn/alpine/v3.12/main/
    https://mirrors.ustc.edu.cn/alpine/v3.12/community/
    

    3.2 软件包管理工具 apk 的基本使用

    alpine 提供了非常好用的apk软件包管理工具,可以方便地安装、删除、更新软件。
    apk update                                           #更新最新镜像源列表
    apk search                                           #查找所以可用软件包
    apk search -v                                   #查找所以可用软件包及其描述内容
    apk search -v 'acf*'                        #通过软件包名称查找软件包
    apk search -v -d ‘docker’       #通过描述文件查找特定的软件包
    apk add openssh                               #安装一个软件
    apk add openssh openntp vim     #安装多个软件
    apk add --no-cache mysql-client #不使用本地镜像源缓存,相当于先执行update,再执行add
    apk info                                               #列出所有已安装的软件包
    apk info -a zlib                               #显示完整的软件包信息
    apk info --who-owns /sbin/lbu   #显示指定文件属于的包
    apk upgrade                                       #升级所有软件
    apk upgrade openssh                          #升级指定软件
    apk upgrade openssh openntp vim #升级多个软件
    apk add --upgrade busybox           #指定升级部分软件包
    apk del openssh                               #删除一个软件
    

    3 Alpine Linux服务管理

    3.1 openrc

    alpine 没有使用 fedora 的 systemctl 来进行服务管理,使用的是RC系列命令
    #安装openrc
    apk add --no-cache openrc
    

    3.2 常用的RC系列命令

    # 增加服务到系统启动时运行,下例为docker
    rc-update add docker boot
    # 重启网络服务
    rc-service networking restart
    # 列出所有服务
    rc-status -a
    

    3.2.1 rc-update

    rc-update 主要用于不同运行级增加或者删除服务
    image.png

    3.2.3 rc-status

    rc-status 主要用于运行级的状态管理。
    image.png

    3.2.4 rc-service

    rc-service主用于管理服务的状态
    image.png

    3.2.5 openrc

    openrc 主要用于管理不同的运行级。
    image.png

    3.3 自定义服务开机自启

    Alpine Linux 的 开机自启目录在 /etc/local.d下 ,这个目录用于放置 我们需要在系统启动或停止后执行的脚本,目录下的说明文档:
    image.png
    下面的实例用 python 实现了一个简单的 web server 并在alpine 中自启动。Alpine Linux 自带了nohup后台守护,直接使用 nohup 设置开机自启。
    编辑 startup.start 文件,注意,.start 后缀需要固定,前面名称随意。
# vi startup.start
#!/bin/bash
nohup python3 /root/main.py & >> /root/main.log

# 赋予脚本可执行权限:
chmod +x startup.start

# 设置 local 服务开机启动
rc-update add local
service local start

如执行 rc-update add local 失败,可能需执行 touch /run/openrc/softlevel 之后再执行
rc-update add local
当系统开机时就能执行 startup.start 达到自定义服务开机自启动的目的。
image.png
python实现的简单 web server 代码内容 (后文创建 alpine-python-web 容器镜像用的是同样的main.py):

# vim /root/main.py
import socket

HOST, PORT = '', 8888

listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
print('Serving HTTP on port %s ...' % PORT)
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    print(request.decode("utf-8"))

    http_response = """\
HTTP/1.1 200 OK

Hello, World!
"""
    client_connection.sendall(http_response.encode("utf-8"))
    client_connection.close()

查看启动的进程
image.png
image.png
image.png
总结:以上内容也适用于在docker 中基于Alpine 镜像的业务扩展

3.4 开启SSH服务

#安装openssh-server服务器
apk add openssh-server
#修改配置文件 /etc/ssh/sshd_config,
#如果要想使用root用户远程管理,需要修改参数为:
PermitRootLogin yes
#将ssh服务配置为开机自动启动
rc-update add sshd
#如果你想立刻生效,可以执行命令:
/etc/init.d/sshd restart

image.png
image.png

4 Alpine Run in Docker

4.1 Run in Docker

官方 Alpine 镜像的文档:http://gliderlabs.viewdocs.io/docker-alpine/
可以使用Docker Toolbox,创建一台Docker虚拟主机,在该主机的Docker环境下运行 alpine 的 Docker容器。该容器就是一个Alpine Linux系统

docker pull alpine
docker run -it --name myalpine alpine

4.2 作为 Docker 容器的基础镜像

4.2.1 build a alpine python image

以Alpine为基础镜像,创建一个 python 容器,镜像大小只有 49MB,同样的方式使用Ubuntu系统作为基础镜像,镜像大小有 124 MB。

  • Dockerfile 内容:

    FROM       docker.io/alpine:latest
    MAINTAINER rjwang <juest a demo for alpine-python>
    ENV TZ "Asia/Shanghai"
    RUN echo "https://mirrors.ustc.edu.cn/alpine/v3.12/main" > /etc/apk/repositories
    RUN apk add --update \
                          python3 \
    && rm -rf /var/cache/apk/*
    
  • build 镜像

    docker build -t rjwang/alpine-python:1.0 .
    

    image.png
    image.png

    4.2.2 build a python web server 镜像并运行

    在上一步建立的 rjwang/alpine-python:1.0 的基础上再创建一个 python web server 镜像

  • dockerfile 内容

image.png

  • build 镜像

    cd ~/alpine-python-web1.0 
    docker build -t rjwang/alpine-python-web:1.0 .
    

    image.png

  • docker run

    docker run -d -p 8888:8888 --name python-web rjwang/alpine-python-web:1.0
    #curl test
    curl http://localhost:8888
    Hello, World!
    

    image.png