当前位置: 首页 > 行业

在Docker/Podman容器中搭建隔离用工作空间 世界百事通

来源:哔哩哔哩 发布时间:2023-05-01 23:10:27 分享至:

原创,转载请注明出处。【同知乎】


(相关资料图)

使用虚拟机造成的资源开销,远比操作系统级虚拟化大。

如果需要一个与宿主隔离的软件环境(例如sandbox),而不需要虚拟硬件,操作系统级虚拟化是最好的方案。

准备宿主环境

必备podman, ssh-client

隔离图形环境需要有Xephyr

准备容器 [宿主]

拉取一个image,在此以fedora-toolbox为例

$ podman pull fedora-toolbox

NOTE: 某些发行版中的容器需要--cap-add SYS_CHROOT才能使sshd正常工作。

创建并启动容器

$ podman run -idt --name <ContainerName> -p <SSH_Port>:22 fedora-toolbox /bin/bash

可以将一个宿主系统下的目录挂载到容器中作为家目录,而不用担心删除容器时忘记备份而造成资料丢失。

如果需要将宿主机上的目录挂载到容器中,则有:

$ podman run -idt --name <ContainerName> -p <SSH_Port>:22 -v <HostDir>:<ContainerDir>[:ro|rw]:z fedora-toolbox /bin/bash

挂载点默认为:rw读写,标签:z使SELinux放行容器中的程序对挂载点的访问。

NOTE: 如果有宿主系统目录以rw挂载到容器中,务必谨慎执行危险命令(诸如rm -rf /*)

$ podman attach <ContainerName>

进入容器开始以下环节。

安装软件包 [容器]

容器中同样可以配置dnf的仓库镜像,这里不作讲述。

用dnf install安装你需要的软件包

# 必需

openssh-server

# Java 17

java-17-openjdk-devel

# Wine

wine

# 图形环境,桌面

xinit dbus-x11 xfwm4 xfce4-panel xfce4-settings xfce4-terminal xfce4-session xfdesktop

# 电科人狂喜

verilator yosys gtkwave

配置SSH环境 [容器]

生成SSH守护进程需要的Key,接下来将用到其中的ED25519公钥。

# ssh-keygen -A

修改/etc/ssh/sshd_config,和配置服务器一样,按你的需求来。

例如:

PubkeyAuthentication yes

PasswordAuthentication no

#HostKey /etc/ssh/ssh_host_rsa_key

#HostKey /etc/ssh/ssh_host_ecdsa_key

HostKey /etc/ssh/ssh_host_ed25519_key

写RC [容器]

因为通过以上步骤创建的容器在attach后会启动容器root用户的bash,所以用/root/.bashrc作为容器的rc。

追加

# 必需

rm -rf /tmp/.* rm -rf /tmp/* /sbin/sshd

# 如果需要图形环境

rm -rf /run/dbus mkdir /run/dbus dbus-daemon --system

提交容器,进行备份 [宿主]

$ podman commit <ContainerName>

现在,podman images会显示容器在提交后的image id。

挂载点不会被提交。

要从image恢复:

$ podman stop <ContainerName>

$ podman rm <ContainerName>

$ podman run -idt ... ... <ImageId> /bin/bash

创建用户 [容器]

# useradd <UserName>

# su <UserName>

$ mkdir ~/.ssh

$ cd ~/.ssh

$ ssh-keygen -t ed25519

$ mv <PublicKey>.pub .authorized_keys

连接到容器 [宿主]

$ podman cp <ContainerName>:/home/<UserName>/.ssh/<PrivateKey> ~/.ssh/

上述步骤中已经有端口<SSH_Port>映射到容器中的22端口,通过ssh连接即可

$ ssh -i ~/.ssh/<PrivateKey> -p <SSH_Port> <UserName>@localhost

如果需要X环境,则

$ Xephyr -no-host-grab -resizeable +iglx :10

$ DISPLAY=:10 ssh -Y -i ~/.ssh/<PrivateKey> -p <SSH_Port> <UserName>@localhost xfce4-session

还有什么?

至此,这个容器里的工作空间基本够用了。

但是

声音(适用于pulseaudio和pipewire-pulse)

在宿主系统上,下面的命令默认监听127.0.0.1:4713,可不给出port和listen参数

$ pactl load-module module-native-protocol-tcp port=<Port> listen=<IP>

需要走一个SSH端口映射

-R <Port>:127.0.0.1:<Port>

在容器里,设置环境变量PULSE_SERVER=127.0.0.1:<Port>

在容器里用paplay播放一个wav进行测试。

开始整活(不是

现在,可以往你的容器里塞东西了,比如IntelliJ或者VSCode。

可以酌情在容器里做些具备实验风险的事情,而不会毁掉你的宿主系统。

Docker和Podman默认赋予网络访问权能给新容器。

你可以在宿主和容器中写一系列脚本(包括.bashrc)使启动容器到加载环境更方便快捷。我的容器已经能够随宿主桌面启动。

例如,宿主在挂载点下建立一个目录D,直到容器删除D才进行ssh连接、X远程会话、Pulseaudio连接;容器则在sshd启动后删除D。

在一番调整后,这是我的容器的样子。

关键词:

Copyright   2015-2022 中公礼仪网 版权所有  备案号:沪ICP备2022005074号-18   联系邮箱:5855973@qq.com