点击蓝字 · 关注我们
轻量级的容器引擎-docker
Docker是一个轻量级、可移植性高的虚拟容器,提供了环境隔离、应用打包等功能,可实现快速部署,故Docker在目前的应用中越来越广泛。通常在涉及网络类型的案件中,除了传统服务器架构类型,有时也会遇到架构在docker中的网站或APP等,在此,本文将分享docker的基本知识以及在取证过程中docker常用的操作命令和注意事项。
环境准备:
centos7+docker 17.12.1+Vulhub
下载docker安装包:
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
yum命令安装:
#yum install docker-ce-17.12.1.ce-1.el7.centos.x86_64.rpm(下载的rpm)
检查是否安装成功:
#docker version --查看docker版本

一、Docker基本概念
以一个Linux服务器为基础,传统服务架构部署项目(APP,web)所需服务是直接基于本机系统环境运行,在多个服务(如tomcat、nginx、mysql等)运行下,计算机资源会出现分配不足、资源浪费等情况.....而在Docker中部署,可以实现整合多台“服务器”效果。基于宿主机的内核下,docker可以创建多个各种配置不一样的“系统平台”(也是我们接下来讲的“容器”),达到“一台机子运行一个服务”的目的,但docker创建的“系统平台”和通常的系统平台还是有区别的,故此,需要我们先了解Docker一些基本概念。

传统部署基本框架

docker部署基本框架
Docker 包括三个基本概念:镜像(Image)、容器(Container)、仓库(Repository)
镜像(Image):相当于是一个 root 文件系统,用于创建 Docker 容器的模板,一个镜像可以包含一个完整的如centos操作系统环境,进入容器,里面仅安装了(如mysql)或用户需要的其他应用程序。

容器(Container):就是我们上述所说创建的“系统平台”,可当作一个简易版的linux环境(里面包含root用户权限,进程空间,用户空间和网络空间等和运行在其中的应用程序如tomcat、nginx、mysql等)。容器类似虚拟机,可以执行包含启动,停止,删除等。但Docker容器与虚拟机最大的区别是:多个虚拟机使用多个操作系统内核,而多个容器共享宿主机操作系统内核。
*容器和镜像关系:简单说,镜像是文件模板,容器是进程,容器是基于镜像创建的,即容器中的进程依赖于镜像中的文件,一个镜像可以有多个容器。
仓库(Repository):仓库支持的操作类似git,docker提供一个服务器来保存多个仓库,每个仓库又可以包含多个镜像,当用户创建了自己的镜像之后就可以使用push命令将它上传到共有或者私有的仓库。这样下次再另外一台机器上使用这个镜像的时候只需要从仓库里面拉取使用。目前 Docker 官方维护的一个公共仓库,大部分需求我们都可以从 Docker Hub 中直接下载镜像来实现。
二、常用基本命令
1、Docker基本命令:
#systemctl start docker -运行docker#docker info -显示docker系统、镜像、容器基本信息
2、Docker镜像命令:
#docker images -查看本地库镜像#docker build -t 镜像名称 -使用 Dockerfile 创建镜像#docker image rm 镜像名称 -删除镜像#docker run -d|-p|-P|-it|-h 容器name或者容器ID -运行docker镜像-d: 以后台方式启动容器-p: 将容器端口和宿主机端口进行一对一映射,格式--主机ip:端口:容器端口-P: 将容器端口和宿主机端口进行随机映射-it: 在容器启动后,通过命令行与容器进行交互-h: 指定容器hostname-v: 绑定卷-name:为容器指定名称
*一个典型的docker run命令如下所示:
docker run -p 0.0.0.0:80:80 -v C:\docker\nginx\default.conf:/etc/nginx/conf.d/default.conf:ro --name nginx
但有时由于docker倾向于一个镜像只有一个进程的简单镜像,而一个典型的web应用至少需要一个web服务器运行服务端程序,一个数据库来完成数据的存储,这就需要两个镜像:web、db,若按上述命令启动,需要两个docker run命令,在需要镜像更多的情况下,需要启动的脚本会越复杂,故此docker 提供了一个命令行工具 docker-compose 帮助完成启动镜像的命令的编排。要使用 docker-compose , 需要先编写一个 docker-compose.yml 文件,基本如下:

上述docker-compose.yml 文件定义了4个服务 : server、agent、mysql和 web,根据image对应的镜像,一个服务在运行时对应容器实列,上述文件表示要启动三个服务,接下来使用docker-compose 启动命令如下:
#cd 进入保存docker-compose.yml文件路径下#docker-compose up -d
执行上述命令之后,docker就会按照docker-compose.yml文件拉取镜像,按照配置启动镜像中所对应的容器。
#docker-compose down -停止上述启动的实例
3、Docker容器命令:
#docker ps或者docker ps -a -列出所有运行中的容器/列出所有容器#docker start|stop|restart 容器name或者容器ID -启动、停止和重启一个或多个指定容器#docker exec -it 容器name或者容器ID /bin/bash -进入docker容器#docker logs 容器name或者容器ID -查看容器日志docker logs 容器name或者容器ID>(指定文件) -将容器日志固定到文件中docker logs -f 容器name或者容器ID -实时监听容器运行日志#docker stop 容器name或者容器ID -停止容器#docker rm -r 容器name或者容器ID -删除指定容器
4、Docker数据卷命令:
# docker volume create 数据卷名 -创建数据卷#docker volume ls -列出所有数据卷#docker volume rm 数据卷名 -删除指定Dockes数据卷
volume理解:将主机上的一个文件映射到容器当中的某个文件,容器向其中写入数据就相当于向主机中对应的文件写入数据
5、Docker文件操作命令:
#docker cp :容器内文件路径 主机文件路径 -从主机复制文件到docker容器中#sudo docker cp 容器name或者容器ID:容器内文件路径 主机内文件存储路径 --从容器复制文件到主机中
三、Docker部署项目基本流程
对docker的基本概念、基本命令进行了解之后,我们就可以了解一下如何在docker部署项目。
01
打包项目。以JAVA项目为例,在开发工具中完成代码的编写后,常见的是将项目源码和依赖库打包成jar、war。
02
编写Dockerfile文件。Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令将项目自动生成镜像,内容示例(源于网上)如下:
FROM java:8VOLUME /tmpADD springboot-1.0-SNAPSHOT.jar boot.jarEXPOSE 8080ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/boot.jar"]
解释:
FROM:表示基础镜像,即运行环境
VOLUME : /tmp创建/tmp目录并持久化到Docker数据文件夹,因为Spring Boot使用的内嵌Tomcat容器默认使用/tmp作为工作目录.
ADD:拷贝文件并且重命名(ADD springboot-1.0-SNAPSHOT.jar boot.jar 将应用jar包复制到/boot.jar)
EXPOSE:并不是真正的发布端口,这个只是容器部署人员与建立image的人员之间的交流,即建立image的人员告诉容器布署人员容器应该映射哪个端口给外界
ENTRYPOINT:容器启动时运行的命令,相当于我们在命令行中输入java -jar xxxx.jar,为了缩短 Tomcat 的启动时间,添加java.security.egd的系统属性指向/dev/urandom作为 ENTRYPOINT。
*Dockerfile 和 docker-compose.yml的区别:
Dockerfile 是拿来构建自定义镜像的,并没有直接生成容器,只是可以在运行镜像时运行容器而已。docker-compose.yml是用来编排项目的,里面可以包含使用各种镜像创建的容器服务,使用的镜像可以是网络上的,也可以是根据使用Dockerfile文件来生成的镜像。
03
构建容器。上传至Linux服务器中,使用docker打包成镜像,需要文件:项目源码包、dockerfile文档。在该路径使用docker命令创建自定义镜像:
# docker build -t 自定义镜像名称
04
运行容器。创建镜像成功后就可以使用命令启动镜像中的容器:
# docker run -自定义容器名称或者 docker-compose up

成功启动容器后就可以直接尝试访问相关项目页面。
docker优势便在镜像创建后开始体现,一般代码从开发者的机器到最终在生产环境上的部署,会经过很多的中间环境,而每一个中间环境都会有差异,而使用docker创建项目镜像之后,可直接将生成的镜像pull到共有或者私有的仓库中,其他人需要使用的时候就可以直接下载镜像,生成容器,快速部署项目,现在我们就来以Vulhub(一个基于docker和docker-compose的漏洞环境集合)为例,部署现有镜像项目。
01
启动docker,确认dockers信息
#docker info --查看当前docker基本信息


#docker images ---查看当前docker中存在镜像(目前无镜像)

02
下载Vulhub相关文件
#wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip

#unzip vulhub-master.zip ---解压

03
以Vulhub中zabbix/CVE-2016-10134项目为例,进入该路径下,发现docker-compose.yml文件,在上述对docker-compose.yml介绍中我们便是使用了该项目的docker-compose.yml文件作为举例,从分析可知,该项目需要拉取3个镜像,启动3个服务。


04
启动服务容器
#docker-compose up -d
----会查看本地镜像是否有符合要求镜像,若本地不存在则会进行拉取,然后启动容器


05
查看docker镜像、容器情况
#docker images

-----此时看到docker中存在3个镜像
#docker ps

-----由3个镜像启动起的3个容器
# docker exec -it be7bee6fc47f /bin/bash

----进入tag为mysql:5的容器
在docker-compose.yml中我们看到关于volumes的配置,目的是把/zabbix/CVE-2016-10134项目下的database文件映射到容器当中的“/docker-entrypoint-initdb.d/”文件夹下。

当进入该容器后,我们发现“docker-entrypoint-initdb.d”文件夹并发现与主机“database”文件夹下同样的数据库文件。


06
查看容器日志
#docker logs be7bee6fc47f
查看id为be7bee6fc47f的容器

07
服务器开启的情况下,成功访问项目页面。

通过以上浅析,我们可以对docker是什么、能做什么、如何操作有一定的了解。在今后如果遇到使用docker技术架构搭建的服务器,大家可以尝试按照以上所述命令进行取证分析,若需要平衡信息提供支持服务,可根据实际情况,联系各区域销售经理或技术工程师。





