Docker是一个使用虚拟化技术——LXC(Linux容器)的工具,它可以使用对应系统的镜像,来创建一个实例化容器,在这个容器上可以运行对应系统的程序。镜像和容器的关系,就像使用虚拟机通过ISO文件安装了一个操作系统。由于网安练习需要自己搭建环境,但是一来直接在实体系统上搭有安全隐患的环境很不明智,二来方便记录配置过程和尝试配置文件里语句的作用,三来只要配置成功一次,就可以通过自制镜像,来高效地完成相同的环境再次部署。
Docker的安装过程:
1、操作系统要求,64bit,kernel版本 >= 3.10,这里使用Fedora Workstation 30
2、添加repo源:
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf makecache
3、安装docker并设置开机启动:
sudo dnf install docker-ce
sudo systemctl enable docker.service
sudo systemctl start docker.service
4、由于docker的运行必须拥有root权限,可以将当前用户加入docker组,来避免每次输命令添加sudo的麻烦:
sudo usermod -aG docker $USER
5、由于国内镜像下载速度慢,可通过配置加速器来加速,vim /etc/docker/daemon.json,在里面添加:
{
"registry-mirrors" : ["https://registry.docker-cn.com"]
}
重启docker,拉取的镜像会以中文docker网站为来源。
6、现在我们可以通过docker search kali来搜索docker hub(跟github类似,是个镜像仓库)里的kali镜像有哪些,之后通过docker pull kalilinux/kali-linux-docker拉取官方kali镜像。
此时我们拥有的只是镜像,类似于ISO文件,再执行docker container run -it kalilinux/kali-linux-docker bash,可以创造一个实例化容器,即操作系统。
命令完成后会给一个bash shell,在shell上可以运行kali Linux的程序,并且通过docker container ls查看有一个正在运行的实例。
给shell发送exit退出后,实例被关闭,但是实例文件还在。并且通过docker container run命令每次都会创建一个新的实例容器,新容器不包含用户的更改内容。如果需要打开之前用过的容器,可以通过docker start [CONTAINER_ID] && docker attach [CONTAINER_ID]打开。不想要的旧容器可以通过docker container rm [CONTAINER_ID]删除,其中[CONTAINER_ID]是实例的ID,一般保证拥有唯一性的情况,输入前4个字符就行了。
Docker自制镜像可以有两个办法:
(1)我们可以通过命令 docker commit [CONTAINER_ID] [IMAGE_NAME],来提交CONTAINER_ID这个容器对上一次commit的更改点(类似git commit),IMAGE_NAME是将要被制成的镜像的名称。
这样做的好处是简单,只要有容器,就可以生成镜像,无需关心更改点;缺点是除了你自己,别人不会知道你做了什么操作(镜像所有者可以通过 docker history [IMAGE_NAME] 查看),除此之外,还有一个缺点就是做出来的镜像比较臃肿。
(2)第二种办法是使用docker build -t [IMAGE_NAME]配合当前目录下的Dockerfile来定制,通过编写镜像定制规则文件Dockerfile,来严格把控更改点。这样制作的镜像精简、透明。
Dockerfile的简单示例:
FROM kalilinux/kali-linux-docker
RUN apt-get update \
&& apt-get upgrade -y \
&& apt autoremove -y \
&& apt-get install vim apache2
其中FROM代表定制镜像是基于哪个镜像做了新操作,这里是官方kali镜像,做的操作就是RUN之后接的命令,更新软件包、删除不必要的包、下载vim和apache2。
写好Dockerfile之后,通过docker build -t kali-apache2 .就制作一个名叫kali-apache2的镜像,这个镜像创建的实例容器就包含了更新软件包、删除不必要的包、下载vim和apache2这些操作。
可以看出,Dockerfile规则其实就是原版镜像+定制镜像会对原版镜像做什么操作(执行什么命令)。
好了,Docker了解到这里,基本满足了我的需要,接下来需要在kali容器上搭建LAMP环境。