Alpine Docker镜像

作为兼顾安全和轻量级的 Alpine LinuxDocker 默认的基础镜像,能够极大地缩减Docker镜像,并且降低运行资源,真正体现容器的轻量、灵活。

如果你像我一样,尝试从0开始在 ARM 架构( 例如 Apple ARM架构芯片M1 ProRaspberry Pi )构建自己的 移动云计算构建 ,那么你可以从最精简的 Alpine Linux 基础镜像开始,只在镜像中添加和运行程序直接相关的库和工具,避免引入不必要的系统开销和安全隐患。

Alpine Docker官方镜像

Alpine DOI(Docker Official Image)是一个包含执行软件堆栈的Alpine Linux Docker镜像,包含你的源代码,库,工具以及应用程序运行的必要核心依赖。

和其他Linux发行版不同:

  • Alpine基于 musl libc 实现C标准库

  • Alpine使用 BusyBox (用一个执行程序替代一组核心功能程序)替代 GNU coreutils

Alpine Linux 吸引了不需要强制性兼容和功能的开发人员,并且提供了友好和直接的使用体验(没有复杂的软件组合)。

采用 Alpine Linux 构建的运行容器镜像都非常精简:

alpine linux镜像大小

镜像内容

镜像大小

alpine-base

11MB

alpine-bash

13MB

alpine-nginx

14.5MB

基础运行 alpine-base

  • alpine-base 目录下 Dockerfile :

基础alpine linux镜像Dockerfile
FROM alpine:latest
RUN apk update && apk upgrade

ENTRYPOINT ["/bin/ash"]
  • 构建 alpine-base 镜像:

构建基础alpine linux镜像
docker build -t alpine-base .
  • 如果在本地Docker中运行,则直接执行:

运行alpine linux基础镜像的容器
docker run --name alpine -it alpine-base

基础运行 alpine-bash

备注

很多运维人员习惯使用 bash ,所以也可以构建支持 bashAlpine Linux

  • alpine-bash 目录下 Dockerfile :

提供bash的alpine linux镜像Dockerfile
FROM alpine:latest
RUN apk update && apk upgrade
RUN apk add --no-cache bash

ENTRYPOINT ["/bin/bash"]
  • 构建 alpine-bash 镜像:

构建提供bash的alpine linux镜像
docker build -t alpine-bash .
  • 运行 alpine-bash :

运行提供bash的alpine linux容器
docker run --name alpine-bash -it alpine-bash

NGINX服务 alpine-nginx

备注

提供nginx服务的alpine镜像: 我准备将数据存放在 /data 目录下( Kubernetes ):

  • html 子目录存放 WEB 内容( ZFS NFS )

  • nginx 软件包安装后默认 nginx.conf 将读取的 /etc/nginx/http.d 目录下配置,其中 /etc/nginx/httpd.defult.conf 配置可覆盖修改以使用自己定制的数据目录

  • alpine-nginx 目录下 Dockerfile :

提供nginx的alpine linux镜像Dockerfile
FROM alpine:latest
RUN apk update && apk upgrade
RUN apk add --no-cache bash
RUN apk add --no-cache nginx

COPY default.conf /etc/nginx/http.d/
RUN mkdir -p /data/html
COPY index.html /data/html/

EXPOSE 80/tcp

ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

备注

修订默认的 /etc/nginx/http.d/default.conf 是在 Kubernetes 中运行自定义AlpineLinux NGINX的重要一步

Dockerfile ENTRYPOINT 和 CMD 辨析

  • 构建 alpine-nginx 镜像:

构建提供nginx的alpine linux镜像
docker build -t alpine-nginx .
  • 注意: 默认的 default.conf :

默认nginx的网站配置 /etc/nginx/http.d/default.conf
erver {
        listen 80 default_server;
        listen [::]:80 default_server;

        # Everything is a 404
        location / {
                return 404;
        }

        # You may need this to prevent return 404 recursion.
        location = /404.html {
                internal;
        }
}

必须被配置允许访问的 default.conf 替换,否则类似 在kind运行简单的容器 无法启动(见下文)

  • 简单的运行 alpine-nginx 验证:

简单地运行alpine-nginx验证镜像
docker run -p 8080:80 --name cloud-atlas \
    -v /home/huatai/docs/docker/alpine/nginx/default.conf:/etc/nginx/http.d/default.conf \
    -v /home/huatai/docs/github.com/cloud-atlas/build/html:/data/html \
    alpine-nginx

现在验证通过的NGINX镜像,是否就可以用到 在kind运行简单的容器 呢?

不能在Kubernetes启动的 alpine-nginx

实际 Alpine Linux 出于安全考虑(这是一个注重安全的面向嵌入式平台的发行版),将 default.conf 设置成禁止访问(直接返回 404 ),而不是一般发行版默认允许访问 index.html

这导致我在 在kind运行简单的容器 遇到始终出现 Kubernetes健康检测 失败的 Kubernetes pod CrashLoopBackOff错误排查

解决的方法也很简单,就是准备好一个允许正常访问的 default.conf 在 BUILD 时候覆盖镜像中的配置文件,这个 default.conf 可以如下:

修订后nginx的网站配置 /etc/nginx/http.d/default.conf,可以让nginx正常运行满足Kubernetes健康检查
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        location / {
                root   /data/html;
                index  index.html index.htm;
        }

        # You may need this to prevent return 404 recursion.
        location = /404.html {
                internal;
        }
}

下一步

我将部署到 kind(本地docker模拟k8s集群) 集群中来模拟 Kubernetes 运行:

SSH服务 alpine-ssh

参考