利用 docker 打造一机多用的隔离环境

前提

最近在进行Linux培训,为了方便大家进行基础命令的操作及脚本的编写调试,在仅有一台VPS的情况下,如何为多个用户创建练习环境成了一个难题。如果直接创建主机用户供使用,权限分配困难且风险较大,并且有可能对当前系统上运行的服务造成影响。恰好最近对docker有所关注,便想着利用docker,新建容器供每个人练习,即使误操作使容器崩溃,也不会影响当前系统。下面就说说,怎么把系统用户和docker的容器关联,以及如何编写快速新建(重建)用户脚本。

条件

VPS*1(安装好docker)

要求

  1. 创建多用户供多人使用;
  2. 用户间隔离且与主机隔离;
  3. 用户的任何操作不能影响系统运行;
  4. 崩溃时能快速重建。

实现步骤

创建VPS用户

既然是VPS,就必须得新建用户供远程登录。

1
useradd ABC;echo "ABC"|passwd --stdin ABC;

这里创建和用户名相同的密码(docker练习容器,安全性要求不高),以便登录,也可根据要求设置复杂密码。

赋权

每个用户都要有docker执行权限,否则怎么进入容器呢是吧。

1
usermod -aG docker ABC

创建容器

每个用户单独创建一个容器,容器名与主机名同用户名,以便进行管理。

1
docker run -it --name ABC --hostname ABC -m 100M --stop-timeout 600 -v /home/ABC/keep:/root/keep 67591570dd29;

这里顺便限制了一下内存使用以及设定了物理目录,以便容器重建时能保存文件,可根据要求设置更多条件。

将主机用户与容器关联

既然是创建了容器,肯定是想用户在登录时就进入容器,退出容器时退出登录,避免不必要的操作对当前系统造成影响。

1
echo -e "\ndocker start -i \$(id -un)\nexit\n" >> /home/ABC/.bash_profile;

完成

这样,就完成了为ABC用户搭建一套与主机隔离的docker容器练习环境。当ABC登录时,自动进入ABC容器,退出容器时会退出当前用户。容器崩溃时,重建相同名称的容器即可。

脚本编写

要是有100个或更多的用户,按以上步骤建立显然比较麻烦,这时编写脚本批量执行尤为节省时间,下面是我自己用到的脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
set -e
set -u
userlist="$@"
for x in ${userlist}
do
set -x
# 既然是为容器创建的账户,执行前一并删掉,方便重建工作
id ${x} &> /dev/null && userdel -r ${x};
# 删除docker容器
docker ps -a|grep ${x} &> /dev/null && docker rm ${x};
# 新增用户
useradd ${x};echo "${x}"|passwd --stdin ${x};
# 赋权
usermod -aG docker ${x}
# 新建docker
docker run -it --name ${x} --hostname ${x} -m 100M --stop-timeout 600 -v /home/${x}/keep:/root/keep 67591570dd29;
# 关联
echo -e "\ndocker start -i \$(id -un)\nexit\n" >> /home/${x}/.bash_profile;
set +x
done

批量创建或重建:

1
sh docker_user_creat.sh ABC BCD CDE DEF ...

That’s all, have fun!