某些情况下,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 里面扣出来。
启动
一些其他的处理
redis 配置文件要处理一下。
另外 local配置也可能会影响redis启动
debian 下需要运行下面的命令,alpine下对容器进行的很多优化,不需要搞这些可以启动。
1
2
3
| export TERM=xterm
apt install locales
dpkg-reconfigure locales
|