使用docker创建科协学习用服务器

科协内部培训的第一节课是我教的Linux基础,考虑到肯定会有部分同学没有Linux服务器并且没有提前安装好Linux虚拟机,我决定在科协的服务器上开20个docker的ubuntu镜像给他们使用。

1. 手动操作步骤

1 通过apt安装docker服务

在科协服务器上,执行

1
2
sudo apt install docker
sudo apt install docker.io

2 下载ubuntu镜像

1
docker pull ubuntu

3. 创建Linux容器

1
sudo docker run -it -p 0.0.0.0:3002:22 --name ubuntu-02 ubuntu

此时便进入了新创建容器中:

4. 安装并配置sshd

但由docker创建的ubuntu是没有sshd的,所以需要先安装sshd:

1
2
apt update
apt install -y openssh-server

区域选6. Asia:

时区选70. Shanghai:

待安装成功后,需要打开root账户远程登录,否则无法登陆:

1
2
apt install -y vim
vim /etc/ssh/sshd_config

将其中PermitRootLogin改为yes:

保存退出后,打开sshd服务:

1
/etc/init.d/ssh start

随后更改密码:

1
passwd

~目录新建一个init.sh,内容为:

1
/etc/init.d/ssh start

5. 退出并测试登陆

按键盘Ctrl + P + Q脱离此容器,新开一个终端,测试ssh:

2. 从容器构建镜像

如果20个容器都这样操作一番,未免太过麻烦。我们可以将刚刚配置好的Ubuntu系统打包成镜像,剩下的就从镜像直接生成容器。

1
2
sudo docker commit -m="ubuntu_sshd" -a="hoshimgg" 33e51d40d736 ubuntu/sshd:1.0
sudo docker images

3. 从新镜像创建剩下的容器

先手动创建一个看看运行是否正常,注意创建时加入-d命令,这样创建后便不会自动attach进去。

1
2
sudo docker run -itd -p 0.0.0.0:3006:22 --name ubuntu-06 ubuntu/sshd:1.3
sudo docker exec -it ubuntu-06 /bin/sh /root/init.sh

手动测试没问题后,我们便开始编写自动化脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
num=7
while [ $num -le 20 ]
do
if [ $num -le 9 ]; then
true_num="0${num}"
else
true_num=$num
fi
docker run -itd -p 0.0.0.0:30${true_num}:22 --name ubuntu-${true_num} ubuntu/sshd:1.3
docker exec -it ubuntu-${true_num} /bin/sh /root/init.sh
num=`expr $num + 1`
echo 30$true_num
done