GNU/Linux systemd-nspawn 容器用法(替代 docker)

纯水,因为和 emacs 无关

是什么

systemd 管理的容器

能做什么

  • 提供完全的隔离环境,和宿主机共用内核,但是具有自己隔离的进程、用户,网络,文件命名空间
  • 隔离级别可定制
  • 允许绑定挂载,overlay 挂载
  • 性能和 docker 持平

使用场景

  • 运行隔离环境,取代大多数 docker 使用场景
  • 运行无头桌面

特点

  • 默认就是容器内写入持久化模式,但也可修改为易失模式(重启后修改丢失)

不能做什么

  • 如果容器在宿主机上以非 root 身份运行,则容器内无法运行 flatpak 应用,原因在于对命名空间无操作权限

    以 root 方式启动容器,本人未测试

  • 如果容器在宿主机上以非 root 身份运行,则容器内对 /dev/uinput 无权限,因此 sunshine 中的鼠标控制完全失效

    以 root 方式启动容器,本人未测试

安装

apt-get install systemd-container

配置

内核变量

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

防火墙

防火墙配置仅在 容器连到了一个虚拟的网桥 的情况的情况下需要定制,否则不需要

本文为了简单起见,不引入任何虚拟网桥,让容器直接使用宿主机的网络(完全访问权限)

虚拟网桥

本文为了简单起见,不引入任何虚拟网桥,让容器直接使用宿主机的网络(完全访问权限)

创建

/etc/systemd/nspawn/container-test.nspawn

持久化容器配置,container-test 替换为容器名(容器根目录名)

[Exec]
PrivateUsers=pick

Timezone=bind
# ResolvConf=off
ResolvConf=bind-host

[Files]
PrivateUsersOwnership=auto

# 绑定挂载:参考下述
# BindReadOnly=/default/etc/resolv.conf:/etc/resolv.conf
# Bind=/path/to/postgres:/var/lib/postgresql:owneridmap

[Network]
Private=no

创建容器根目录

cd /var/lib/machines

# container-test 替换为你的容器名
debootstrap --include=apt-transport-https,ca-certificates,dbus,libpam-systemd,systemd --arch=amd64 stable container-test https://mirrors.tuna.tsinghua.edu.cn/debian/

启动

sudo machinectl start container-test
# 无密码直接取得 root shell
sudo machinectl shell container-test

友情链接

https://linux.do/t/topic/691953

这个人是懂 nspawn 的,但如果想要在网络层面隔离容器和宿主机,或许不需要像上面链接里面说的配这么复杂

用 nspawn 运行 sway 桌面