Alpine Linux运行Docker

安装

  • 使用 Alpine Linux包管理apk 添加 Community 仓库,然后执行以下命令安装docker

    apk add docker
    
  • 将自己的账号加入到 docker 组:

    addgroup huatai docker
    
  • 启动Docker服务 - 参考 OpenRC :

openrc 添加和启动 docker服务
sudo rc-update add docker boot
sudo service docker start

备注

我没有安装 docker-compose ,后续容器编排主要采用 K3s - 轻量级Kubernetes

隔离容器

执行以下命令添加 dockremap :

添加dockremap(安全配置)
adduser -SDHs /sbin/nologin dockremap
addgroup -S dockremap
echo dockremap:$(cat /etc/passwd|grep dockremap|cut -d: -f3):65536 >> /etc/subuid
echo dockremap:$(cat /etc/passwd|grep dockremap|cut -d: -f4):65536 >> /etc/subgid

此时生成的 /etc/subuid 内容:

dockremap:101:65536

/etc/subgid 内容:

dockremap:65533:65536
  • 然后在 /etc/docker/daemon.json 中添加:

    {
        "userns-remap": "dockremap"
    }
    

此外,可以虑考虑添加:

"experimental": false,
"live-restore": true,
"ipv6": false,
"icc": false,
"no-new-privileges": false

详细的配置参数参考 Docker docs Reference / Command-line reference / Daemon CLI(dockerd) Daemon configuration file

我实际采用配置:

alpine 运行docker的 /etc/docker/daemon.json
{
  "userns-remap": "dockremap",
  "experimental": false,
  "live-restore": true,
  "ipv6": false,
  "icc": false,
  "no-new-privileges": false,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  }
}

alpine的Docker容器资源限制配置

  • 执行 docker info 检查配置,可能会看到:

    WARNING: No memory limit support
    WARNING: No swap limit support
    WARNING: No kernel memory TCP limit support
    WARNING: No oom kill disable support
    

这个问题在 ruanbekker/k3s_on_alpine.md 提供了处理方法

此外,之前我在 部署ARM架构Kubernetes 也遇到同样问题,处理方法请参考该文档。不过在 部署ARM架构Kubernetes 采用了 Systemd进程管理器 所支持的 Control Group v2 : Docker Engine 20.10 Released: Supports cgroups v2 and Dual Logging

  • 执行cgroup的fs挂载配置:

配置cgroup的fs挂载配置 /etc/fstab
echo "cgroup /sys/fs/cgroup cgroup defaults 0 0" >> /etc/fstab
  • 创建 /etc/cgconfig.conf :

创建 /etc/cgconfig.conf
cat > /etc/cgconfig.conf <<EOF
mount {
  cpuacct = /cgroup/cpuacct;
  memory = /cgroup/memory;
  devices = /cgroup/devices;
  freezer = /cgroup/freezer;
  net_cls = /cgroup/net_cls;
  blkio = /cgroup/blkio;
  cpuset = /cgroup/cpuset;
  cpu = /cgroup/cpu;
}
EOF
  • 如果系统使用 Alpine Linux Bootloader Syslinux (名字是 extlinux ) 则修订内核参数:

    sed -i 's/default_kernel_opts="pax_nouderef quiet rootfstype=ext4"/default_kernel_opts="pax_nouderef quiet rootfstype=ext4 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"/g' /etc/update-extlinux.conf
    

备注

我的系统没有找到 /etc/update-extlinux.conf ,仔细核对之后我发现实际上默认安装 alpine不使用bootloader

不过,我的 树莓派环境安装Alpine Linux到USB磁盘启动 没有使用bootloader,所以直接修订 /media/sda1/cmdline.txt 添加:

/media/sda1/cmdline.txt 添加内核参数
cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

完整配置如下:

modules=loop,squashfs,sd-mod,usb-storage quiet console=tty1 root=/dev/sda2 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

然后重启系统,然后再次执行 docker info 就不会出现上述报错

blkio 资源限制报错

我在 树莓派Raspberry Pi 3 上使用 TF卡作为存储,同样的安装和部署,发现 docker info 有如下WARNING:

WARNING: No blkio throttle.read_bps_device support
WARNING: No blkio throttle.write_bps_device support
WARNING: No blkio throttle.read_iops_device support
WARNING: No blkio throttle.write_iops_device support

由于 Alpine Linux运行Docker 使用的是 Docker 20.10 ,支持 Control Group v2 ,我在想是否可以通过转换操作系统 cgroup v1 到 v2 来解决这个问题?

参考