Alpine Docker镜像

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

如果你像我一样,尝试从0开始在 ARM Atlas 架构( 例如 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 Atlas ):

  • 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 Atlas 中运行自定义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 Atlas 运行:

SSH服务 alpine-ssh

参考