Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc
和 busybox
以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。
Alpine 由非商业组织维护的,支持广泛场景的 Linux发行版,它特别为资深/重度Linux用户而优化,关注安全,性能和资源效能。Alpine 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。官方镜像来自 docker-alpine
项目。
目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
以下特点:
1、小巧:基于Musl libc和busybox,和busybox一样小巧,最小的Docker镜像只有5MB;
2、安全:面向安全的轻量发行版;
3、简单:提供APK包管理工具,软件的搜索、安装、删除、升级都非常方便。
4、适合容器使用:由于小巧、功能完备,非常适合作为容器的基础镜像。
优势
劣势
Alpine Linux是一个完整的操作系统,像其他操作系统一样,可以将Alpine安装到本地硬盘中。
主要是在安装过程中,指定一些电脑的基本设置,比如键盘布局、主机名、网卡、IP地址、root口令修改、时区设置、软件仓库地址、SSH服务器、NTP客户端、系统安装方式、磁盘格式化等。
打开官网(https://alpinelinux.org/downloads/),找到对应平台的镜像下载,默认就是向x86_64镜像。
setup-alpine
不管是刻录U盘还是在虚拟机里启动,进入终端之后,输入root默认无密登陆,然后执行setup-alpine
命令,在终端上启动他的安装程序。
询问键盘布局,输入cn
后面的配置选项,"hostname"、"网卡配置"、"IP地址配置"、"配置dns"等一系列选择默认即可,有需要的可以根据实际情况修改。
手动输入Asia
和Shanghai
这里如果联网了,输入f
回车,让程序自动匹配当前最快的软件源。可能会花一点时间。尽量不要跳过,因为后面格式化硬盘的时候需要联网安装相关的命令。
跟着的ssh和NTP默认即可
询问"Availabe disks are"和"Which disks would you like to use?"来选择安装的硬盘,可以输入"?"来列举可用硬盘,然后手动输入,这里安装到sda
,也可以选择其他位置。
在询问你"How would you like to use it?",这里输入sys
硬盘安装,其余的"data"、"lvm"可以了解一下。
格式化硬盘然后复制文件需要些时间,完成之后会提示"Installation is complete",这时候拔掉U盘或者设置硬盘第一启动,就可以重启了。
x#主机名文件
echo "alpinelinux" > /etc/hostname
#使用新设置的主机名立刻生效
hostname -F /etc/hostname
#DNS 服务器配置文件
cat /etc/resolv.conf
search sf.com
nameserver 10.118.188.2
nameserver 10.118.188.3
#网卡配置文件
cat > /etc/network/interfaces <<EOF
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.56.180
netmask 255.255.255.0
gateway 192.168.56.1
auto eth1
iface eth1 inet dhcp
EOF
#修改完相关配置以后,重新启动网络服务
service networking restart
/etc/init.d/networking restart
xxxxxxxxxx
cp /etc/apk/repositories /etc/apk/repositories.org
# 如果采用中国科技大学的源
cat > /etc/apk/repositories <<EOF
http://mirrors.ustc.edu.cn/alpine/v3.10/main
http://mirrors.ustc.edu.cn/alpine/v3.10/community
EOF
#采用国内阿里云的源
cat > /etc/apk/repositories <<EOF
https://mirrors.aliyun.com/alpine/v3.10/main
https://mirrors.aliyun.com/alpine/v3.10/community
EOF
xxxxxxxxxx
#查询相关的软件包
apk search openssh
#安装一个软件包
apk add xxx
#删除已安装的xxx软件包
apk del xxx
#获取更多apk包管理的命令参数
apk --help
#更新软件包索引文件
apk update
#安装常用软件
apk add --update bash wget curl vim make iproute2 drill iputils
#安装lrzsz
wget http://mirrors.gigenet.com/alpinelinux/edge/testing/x86_64/lrzsz-0.12.20-r0.apk
apk add lrzsz-0.12.20-r0.apk
lrz -b
#查看建立的TCP连接
ss -ta
#查询域名的信息
drill blog.csdn.net @8.8.8.8
#根据IP地址,反向查找域名
drill -x 8.8.8.8 @47.94.71.34
默认 alpine 没有开启远程登录权限。 ssh远程登录不了。
xxxxxxxxxx
#安装openssh-server服务器
apk add --update openssh-server
#修改配置文件 /etc/ssh/sshd_config,
#使用root用户远程管理
cat >> /etc/ssh/sshd_config <<EOF
PermitRootLogin yes
EOF
#将ssh服务配置为开机自动启动
rc-update add sshd
#立刻生效
/etc/init.d/sshd restart
service sshd restart
service sshd status
xxxxxxxxxx
#安装Nginx软件并更新到最新
apk add --update nginx
#手工启动Nginx
/etc/init.d/nginx start
rc-service nginx status
rc-service nginx start
rc-service nginx stop
#将Nginx添加到启动服务中,下次开机自动运行
rc-update add nginx
#测试Nginx服务是否正常,使用curl访问,
#默认配置会返回nginx的404页面错误,标明服务已正常:
netstat -tnulp
curl 192.168.56.180
因为Alpine linux使用的是musl,与常见的glibc不同,Musl是一个轻量级的C标准库。所以oracle上下载的jdk和openjdk无法直接使用。自己动手编译需要花费几倍的时间精力,可以找已经打包好了的针对musl编译的openjdk来直接安装。azul提供了针对Alpine linux的openjdk,可以直接拿来安装。
azul官网
安装过程和普通的jdk安装就没有任何区别了,下载tar包解压到安装目录,配置环境变量即可。
xxxxxxxxxx
wget https://cdn.azul.com/zulu/bin/zulu8.42.0.23-ca-jdk8.0.232-linux_musl_x64.tar.gz
tar -xzf zulu8.42.0.23-ca-jdk8.0.232-linux_musl_x64.tar.gz
mv zulu8.42.0.23-ca-jdk8.0.232-linux_musl_x64 /app/jdk
cat >> /etc/profile <<EOF
export PATH=\$PATH:/app/jdk/bin
EOF
source /etc/profile
java -version
这是作为Alpine Linux包运行的GNU C库,用于运行链接的二进制文件glibc。
xxxxxxxxxx
apk --no-cache add ca-certificates wget
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.30-r0/glibc-2.30-r0.apk
apk add glibc-2.30-r0.apk
除了包之外localdef
还需要glibc-bin
和glibc-i18nglibc
包。
You will need to generate your locale if you would like to use a specific one for your glibc application. You can do this by installing the glibc-i18n
package and generating a locale using the localedef
binary. An example for en_US.UTF-8 would be:
xxxxxxxxxx
apk add glibc-bin-2.30-r0.apk glibc-i18n-2.30-r0.apk
/usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8
setup-alpine安装前面不仔细看,设置时区容易忽略,好多程序用到的时间校验就容易出问题。用到手动在alpine 下修改UTC时间为CST时间。
xxxxxxxxxx
apk add tzdata
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
echo "Asia/Shanghai" > /etc/timezone
通过阅读官方说明,简单的总结一下这个镜像
xxxxxxxxxx
docker pull alpine
docker images
# 由图看到只有3.99 MB大小,基于alpine而build出来的endoffight/shadowsocks-kcp也只有14.5 MB
由于启用一个镜像必须有一个进程,所以我们运行ash(Bash in alpine)
xxxxxxxxxx
# 启动一个容器
docker run --name=al -itd alpine ash
# 进入系统
docker exec -it al ash
xxxxxxxxxx
# 更新源
apk add --update
# 缓存的index文件保存在/var/cache/apk/文件夹中
ls -al /var/cache/apk/
# 搜索nginx,目前nginx最新是1.11,1.10.3是最新的稳定版,看来库里的软件还是很新的
apk search nginx
nginx-1.10.3-r0
...
# libsodium 也有,这不是就shadowsocks而生的么?
apk search libsodium
libsodium-1.0.11-r0
libsodium-dev-1.0.11-r0
# 安装命令
apk add --update --no-cache python openrc
# 组安装,--virtual web_tools表示后面的程序都会被归到web_tools组,最后删除的时候可以一起被删
apk --update add --virtual web_tools nginx php7-fpm
# 删除
apk del python
# 列出已安装的程序
apk info|sort
apk -vv info|sort
xxxxxxxxxx
# 非docker环境的服务管理
rc-service nginx start
rc-service nginx stop
rc-service nginx php
下面进入实战环节,让我们配置一个最简单的Nginx+PHP运行环境吧!
xxxxxxxxxx
docker run --name=web -itd alpine ash
docker exec -it web ash
xxxxxxxxxx
apk add --no-cache --virtual web_tools nginx php7-fpm supervisor
xxxxxxxxxx
# supervisor 前台运行
sed -i 's/\;nodaemon=false/nodaemon=true/g' /etc/supervisord.conf
vi /etc/supervisord.conf
# 添加如下内容
[program:php-fpm]
command=php-fpm7 -F
stdout_logfile=/var/log/php7/php.log
# /dev/stdout
stdout_logfile_maxbytes=1MB
stderr_logfile=/var/log/php7/php_error.log
# /dev/stderr
stderr_logfile_maxbytes=1MB
[program:nginx]
command=nginx -g 'daemon off;'
stdout_logfile=/var/log/nginx/nginx.log
stdout_logfile_maxbytes=1MB
stderr_logfile=/var/log/nginx/nginx_error.log
stderr_logfile_maxbytes=1MB
xxxxxxxxxx
true > /etc/nginx/conf.d/default.conf
vi /etc/nginx/conf.d/default.conf
# add
server {
listen 80;
root /www;
index index.html index.htm index.php;
server_name localhost;
client_max_body_size 32m;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/lib/nginx/html;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
xxxxxxxxxx
vi /www/index.php
# add
<?php
echo "Hello world!\n";
xxxxxxxxxx
/usr/bin/supervisord
外部新启一个终端查看
xxxxxxxxxx
docker exec -it web ash
curl lcoalhost
# get
# Hello world!
完