chroot的使用方法 替代docker/lxc/lxd

某些情况下,docker和lxc不适合使用。例如内核不支持、或者docker会引入iptable的复杂化。这时候需要容器化的是可选的就只有systemd-nspawn 和chroot。但是systemd-nspawn仅在支持systemd的发行版有效。强用又会引入更复杂的状况。

这时候 chroot 又成为了唯一的选择。 但是chroot也有一些问题,例如:过于低级 使用 复杂。

# chroot

chroot 是 Linux 内置的命令,所以不需要额外安装任何软件包或工具即可使用。它是一种常见且有用的工具,被广泛应用于隔离、测试和恢复操作系统环境。

# create

chroot 需要一个目录 或者一个 raw文件 里面应该是一个完整的rootfs. 常见的发行版可以去 https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/ 这里下载。

1
2
3
4
mkdir ~/container-chroot && cd  ~/container-chroot
# 两个典型的发行版
wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/debian/bookworm/amd64/default/20230830_05%3A24/rootfs.tar.xz -O bookworm.tar.xz
wget https://mirrors.tuna.tsinghua.edu.cn/lxc-images/images/alpine/3.18/amd64/default/20230830_13%3A00/rootfs.tar.xz -O alpine.tar.xz

# 使用

我 使用chroot 运行一个 redis

# 配置目录

debian

1
2
mkdir bw-redis
tar -xf bookworm.tar.xz  -C ./bw-redis

alpine

1
2
mkdir alpine
tar -xf alpine.tar.xz -C alpine

基础目录 镜像里面已经有 一般不需要

1
2
mkdir ./alpine/{dev,proc,sys,run}
mkdir ./bw-redis/{dev,proc,sys,run}

# 挂载

主要是挂载/dev进去

1
2
mount -v --bind /dev ./bw-redis/dev
mount -v --bind /dev ./alpine/dev

看情况,可能你还需要挂载 /tmp 等目录

# 进入容器

1
2
sudo chroot bw-redis #debian
sudo chroot alpine /bin/busybox sh # alpine 默认没有bash

# 配置网络

网络和宿主机是一样的,但是没有dns

1
2
3
4
5
rm -rf /etc/resolv.conf # 默认是一个空符号连接,要删掉
echo "search lan" >/etc/resolv.conf
echo "nameserver 114.114.114.114" >>/etc/resolv.conf
cat /etc/resolv.conf
ping baidu.com

# 其他一些目录权限和需要挂载的目录

需要处理一下

1
2
3
4
5
chown -R root:root /etc/sudo.conf /etc/sudoers # sudo 命令
chown -R root:root /etc/sudoers.d #根据发行版不同 需要调整一下配置文件
chmod -R  777 /tmp #会影响某一些文件写入,另外tmp最好挂载到宿主系统由宿主系统决定是否ramfs
mount -t devpts devpts /dev/pts #挂载 devpts
mount -t proc proc /proc #挂载proc , ps 以及其他进程管理类的工具 要用

# 安装redis

debian

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

apt update
apt install apt-transport-https ca-certificates 
# https://mirror.tuna.tsinghua.edu.cn/help/debian/ 修改国内源
 apt install lsb-release curl gpg
curl -fsSL https://packages.redis.io/gpg |  gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" |  tee /etc/apt/sources.list.d/redis.list

apt update
apt install redis-tools=6:7.2.1-1rl1~bookworm1
apt install redis-server=6:7.2.1-1rl1~bookworm1

alpine

1
2
apk update
apk add redis

redis 没有提供alpine的源,如果要安装指定版本的redis,可以自己编译,或者去docker 里面扣出来。

# 启动

1
redis-server

# 一些其他的处理

redis 配置文件要处理一下。
另外 local配置也可能会影响redis启动
debian 下需要运行下面的命令,alpine下对容器进行的很多优化,不需要搞这些可以启动。

1
2
3
export TERM=xterm
apt install locales
dpkg-reconfigure locales
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计