在学习SQL注入时,须要搭建一些靶场以供测试使用。但是,靶场倘若直接搭建在化学机中可能会导致稳定性问题甚至引起化学机损毁,假如搭建在虚拟机中,就多了配置虚拟机的麻烦和运行虚拟机带来的系统资源占用问题。在这些情况下,Docker容器就可以挺好地满足我们所有需求。本文中,我们将介绍Docker的原理概要,kali系统安装Docker的过程(kali源中没有,须要加载Docker源并更新更新源),Docker服务的相关配置,镜像的下载安装(pull),容器的生成与配置,容器的运行管理等内容。最后,我们将以生成并配置sqli-labs容器为例,熟悉Docker的相关操作,以及学习通过更改容器配置文件来配置容器。
Docker简介Docker与容器化
Docker是一个才能构建、运行和分享程序、系统容器的平台,容许开发者和系统管理员轻松地运行和管理各类容器。
说到容器,还是先提一下容器的概念和作用。容器化,就是将程序或系统(也可看作是一个程序)放在一个容器中,开发者在容器中放置特定功能的程序并通过插口进行标准化。使用者在布署容器时,不须要考虑容器中的应用机理,只须要专注于使用其功能,她们使用一套工具来管理(生成、配置、运行、运输、分享)这种容器(Docker就是这样一个管理平台),因而大大降低了布署单元的数目和配置难度以及资源占用。
容器化的优势:
容器和虚拟机的比较
容器在Linux上原生运行,通过Dockerdaemon守护进程管理,与其他容器一起共享宿主机核心,容器的进程是分散的,不会占用不仅运行须要外更多的显存空间linux定时器,这也使它保持了轻量化的特点。并且,因为缺乏系统层结构,在运行部份(极少数)程序时可能会报错。
与此相反,虚拟机提供了一个完整的顾客机系统,但因为其降低了虚拟化层,一般须要占用比自身消耗更多的系统资源。并且,因为其保持了完整的系统层结构,使用过程中较少会出现系统层错误(除非操作系统本身就有错误)。
Docker中的基本概念Docker网路管理
Docker服务运行时,会生成一张虚拟网卡docker0,生成一个内部网关,启动的容器在这个网关中得到一个IP,假如须要开放网路端口,则在这个网关中开放对应端口,假如遇见多个服务形成的端口冲突,则可以自动配置端口映射linux设置环境变量,为容器指定一个映射端口,外部设备访问主机的映射端口linux docker使用,会通过Docker的端口代理进程转发到对应子网的开放端口,实现外部开放联接。
安装并配置Docker
kali原生没有安装Docker,但是在更新源中也没有。所以在即将安装之前,我们须要对更新源进行配置。
首先须要添加Docker的PGP秘钥到apt-key软件包秘钥环
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg | sudo apt-key add -
之后将Docker的源加入apt源列表中(Kali基于debiantesting发行版,其他发行版请更改名称)
echo 'deb https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/ buster stable' | sudo tee /etc/apt/sources.list.d/docker.list
安装Docker
更新apt源列表
sudo apt update
假如早已安装了旧版Docker,则须要卸载:
sudo apt remove docker docker-engine docker.io
安装Docker(docker-ce指DockerCommunityEdition)
sudo apt install docker-ce
等待安装完成即可,完成后,因为安装了docker-ce-cli命令行工具,可以使用
docker --version
配置Docker
使用systemctl命令查看Docker服务状态
systemctl status docker
假如未显示active,则说明服务未启动,须要自动开启
systemctl start docker
服务启动时的状态:
将服务设置为开机自启动/不自启
systemctl enable docker # 开机自启服务
systemctl disable docker # 开机不自启
服务开启时,可以看见网路设备中降低了一个docker0linux docker使用,这就是用于承载容器网路端口转发等服务的虚拟网路
更换Docker源
因为Docker官方源在美国未能联接或极慢,故须要更换源,下边将更换Docker国外源
关掉Docker服务
打开或新建/etc/docker/daemon.json
将以下json数据写入文件中(仅更换了源)
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
启动Docker服务,使用sudodockerinfo命令查看Docker配置信息(命令将在常用命令章节坐出说明)给出。
Docker常用命令
以下是Docker较常用命令的介绍,有关配置镜像的实例在最后一节给出
info
使用Dockerinfo命令,可以查看有关Docker的详尽配置信息和主机硬件信息
ManagementCommand管理选项
通过下述管理选项,可以管理Docker的各项相关内容
命令说明
builder
管理生成(从Dockerfile中生成镜像image,消除生成缓存)
config
管理Docker相关设置
container
管理容器
context
管理上下文(与容器集群相关)
engine
管理Docker引擎(升级引擎、启用企业版)
image
管理镜像
network
配置网路
node
管理集群节点
plugin
管理插件
service
管理服务,集群相关
stack
管理容器堆栈
swarm
管理集群
volume
管理容器的数据信息
Docker命令可以查看当前管理类中可用的下一级命令,比如
sudo docker container ls -a
能查看当前的所有容器(-a包含停止运行的)
run
使用一个镜像生成一个容器,完成初始化,并运行它。这个命令仅在第一次使用一个容器时使用。须要附送相关配置信息,容器将手动完成create和start。句型:
sudo docker run [options] IMAGE [COMMAND] [ARGS]
下边是样例
# 以下命令生成一个名为"nginx"的以nginx:latest为镜像的容器,并以虚拟交互终端形式打开,运行bash
sudo docker run -it
nginx:latest
--name="nginx"
-h "nginx"
/bin/bash
start
当生成一个容器后,直接使用startcontainer_name命令即可启动这个容器,前提是服务docker.service必须启动
sudo docker start sqli-labs
其他常用Docker命令容器的配置和使用(实战)
本样例基于kali安装sqli-labs测试环境。步骤将从完成配置Docker后开始,有关kali安装配置Docker的过程,请见第二节。
首先,使用search命令在代码库房中搜索指定镜像
sudo docker search sqli-labs
使用pull命令,从代码库房拉取指定镜像到本地
sudo docker pull acgpiano/sqli-labs
使用run命令,直接生成对应容器并启动(参数中仅给出部份初始化配置,剩下用于配置文件更改参数的讲解)
sudo docker run -d
--name="sqli-labs"
-p 8001:80
acgpiano/sqli-labs
用ps命令查看容器的运行状态
(其中的ports早已经过更改,起初仅有一个映射0.0.0.0:8001->80/tcp,另一个mysql端口为3306)
假如还须要使用一个mysql3306端口的映射(假如与主机的端口冲突,则启动容器将失败),则须要通过配置文件更改端口
关掉容器,后关掉Docker服务(一定要,否则更改会失效)
sudo docker stop sqli-labs
sudo systemctl stop docker
转入/var/lib/docker/containers目录,打开对应的容器目录(通过惟一容器序号标示分辨,可通过dockercontainerls命令查看),由于目前通常只有一个目录,直接tab补全打开即可
编辑hostconfig.json文件,编辑PortBindings通配符,(设置随便,下边是我的样例,符合json句型格式和键名称即可)
"PortBindings":{"3306/tcp":[{"HostIp":"127.0.0.1","HostPort":"3307"}],"80/tcp":[{"HostIp":"","HostPort":"8001"}]}
启动Docker服务,并启动容器,在ps中即可查看更改疗效(前面的图即为根据我更改的配置设置后的疗效)
总结
相信在看完前面的原理和命令说明以及一个样例步骤后,你已然学到了一点关于Docker的内容。对相应命令多加联系,才能加深你对Docker容器平台的理解。因为本文是从一个普通使用者的角度出发,介绍了平常非集群布署的较常用命令,故使用到的功能较少。假如读者想要了解更多中级功能,可以查阅Docker官方文档。
谢谢阅读!
翻译自Docker文档(部份删改):